我有一个程序块,如:
for (iIndex1=0; iIndex1 < iSize; iIndex1++)
{
for (iIndex2=iIndex1+1; iIndex2 < iSize; iIndex2++)
{
iCount++;
fDist =(*this)[iIndex1].distance( (*this)[iIndex2] );
m_oPDF.addPairDistance( fDist );
if ((bShowProgress) && (iCount % 1000000 == 0))
xyz_exception::ui()->progress( iCount, (size()-1)*((size()-1))/2 );
}
}
}
}
我尝试并行化内部和外部循环,并将iCount放在关键区域。将此并行化的最佳方法是什么?如果我用omp single或omp atomic包装iCount,那么代码会给出一个错误,我发现在omp中它会无效。我想我正在添加许多无关紧要的东西来加强这个。需要一些建议......
谢谢,
萨扬
答案 0 :(得分:1)
如果我正确地解释了您的意图,您想使用iCount告诉您的程序何时(每10 ^ 6次操作)更新UI? iCount是全局的,所有线程都要分享价值,你想保持它的一致性吗?
我会搜索一种方法,用每个线程的私有计数器替换这个全局计数器,并让线程发送消息来相互独立地更新UI。如果你坚持使用全局计数器,你将不得不以某种方式跨线程同步,这将是性能损失。是的,你可以这样写你的程序,但我不推荐它。
如果您不喜欢所有线程向UI发送消息的想法,也许只有一个线程可以做到这一点;如果一个线程是程序的1/4,那么其他线程(大约)也是如此。
答案 1 :(得分:0)
再次感谢马克。我尝试了你建议的方法。我已经减少了(+:iCount)并且还尝试将iCount ++包装在pragma批判之下,是的,这是一个性能损失(我也看不到加速)。另外,我让一个线程处理iCount,但我做的方法没有加速。
我预计如果我在内循环周围放置一个pragma,并将iCount声明为减少变量,我会注意到至少有一些加速。我的目标是为Index1,Index2对并行执行这些语句:
fDist =(*this)[iIndex1].distance( (*this)[iIndex2] );
m_oPDF.addPairDistance( fDist );
这可能会显着影响程序运行时间。
答案 2 :(得分:0)
非常感谢马克。我删除了iCount并使外部循环并行,但我正在挖掘代码,因为与串行版本相比,我仍然没有观察到加速。
我想借此机会澄清一个基本事实......在如上所述的嵌套循环环境中...哪一个通常更好:
使内循环平行
pragma omp parallel
对于(......我......)
pragma omp for
为(...,J ...)
使外环平行,(在外环之前只是... pragma parallel ...)
使用折叠(对于Omp 3.0)
感谢
萨扬