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
[email protected]



On Wed, Jul 25, 2012 at 5:18 PM, Bradley Lowekamp <[email protected]>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
> [email protected]
>
>
>
> On Wed, Jul 25, 2012 at 4:12 PM, Rupert Brooks <[email protected]>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>
>>
>
>
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers

Reply via email to