[Insight-developers] itk performance numbers

Rupert Brooks rupert.brooks at gmail.com
Thu Jul 26 08:56:45 EDT 2012


Brad,

The false sharing issue is a good point - however, i dont think this is the
cause of the performance degradation.  This part of the class (m_Threader,
etc) has not changed since 3.20.  (I used the optimized metrics in my 3.20
builds, so its in Review/itkOptMeanSquares....) It also does not explain
the performance drop in single threaded mode.

Testing will tell...  Seems like a Friday afternoon project to me, unless
someone else gets there first.

Rupert

--------------------------------------------------------------
Rupert Brooks
rupert.brooks at gmail.com



On Wed, Jul 25, 2012 at 5:18 PM, Bradley Lowekamp <blowekamp at mail.nih.gov>wrote:

> Hello,
>
> Continuing to glance at the class.... I also see the following member
> variables for the MeanSquares class:
>
>   MeasureType *   m_ThreaderMSE;
>   DerivativeType *m_ThreaderMSEDerivatives;
>
> Where these are index by the thread ID and access simultaneously across
> the threads causes the potential for False Sharing, which can be a MAJOR
> problem with threaded algorithms.
>
> I would think a good solution would be to create a per-thread data
> structure consisting of the Jacobin, MeasureType, and DerivativeType, plus
> padding to prevent false sharing, or equivalently assigning max data
> alignment to the structure.
>
> Rupert, Would like to take a stab at this fix?
>
> Brad
>
>
> On Jul 25, 2012, at 4:31 PM, Rupert Brooks wrote:
>
> Sorry if this repeats - i just got a bounce from Insight Developers, so im
> trimming the message and resending....
> --------------------------------------------------------------
> Rupert Brooks
> rupert.brooks at gmail.com
>
>
>
> On Wed, Jul 25, 2012 at 4:12 PM, Rupert Brooks <rupert.brooks at gmail.com>wrote:
>
>> Aha.  Heres around line 183 of itkTranslationTransform.
>>
>> // Compute the Jacobian in one position
>> template <class TScalarType, unsigned int NDimensions>
>> void
>> TranslationTransform<TScalarType,
>> NDimensions>::ComputeJacobianWithRespectToParameters(
>>   const InputPointType &,
>>   JacobianType & jacobian) const
>> {
>>   // the Jacobian is constant for this transform, and it has already been
>>   // initialized in the constructor, so we just need to return it here.
>>   jacobian = this->m_IdentityJacobian;
>>   return;
>> }
>>
>> Thats probably the culprit, although the root cause may be the
>> reallocating of the jacobian every time through the loop.
>>
>> Rupert
>>
>> <snipped>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-developers/attachments/20120726/32c5abb1/attachment.htm>


More information about the Insight-developers mailing list