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
