2010-05-24 60 views
0

我有这样一个程序块:同步构造内部编译为

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); 

     } 
    } 
} 
} 

我试图parallelising内外环和通过将在ICOUNT关键区域。平行于此的最佳方法是什么?如果我用omp single或omp原子打包iCount,那么代码会给出一个错误,我发现这在omp内部是无效的。我想我正在添加许多无关的东西来对此进行合并。需要一些建议...

感谢,

萨彦

回答

1

如果我正确地解释你的意图,你想用ICOUNT告诉时(每10^6次操作),程序更新UI?而iCount是全球性的,所有的主题都是分享价值,并且你想保持其一致性?

我会寻找一种方法来用每个线程专用的计数器替换这个全局计数器,并让线程发送消息来独立更新UI。如果你坚持使用全局计数器,你将不得不以某种方式跨线程进行同步,这将成为一个性能问题。是的,你可以用这种方式编写你的程序,但我不推荐它。

如果你不喜欢所有线程发送消息到用户界面的想法,也许只有一个线程可以做到这一点;如果一个线程是程序的四分之一,其他线程(大约)也是如此。

0

再次感谢马克。我尝试了你所建议的方法。我已经把还原(+:iCount),并试图围绕编译指示围绕iCount ++关键,是的,它是一个性能打击(也没有看到加速)。另外,我让一个线程处理iCount,但是我做出的方法没有加速。

我预计如果我在内部循环周围放置一个编译指示,并将iCount声明为还原变量,我会注意到至少有一些加速。我的目标是针对Index1,Index2对的这些语句的并行执行:

 fDist =(*this)[iIndex1].distance((*this)[iIndex2]); 
     m_oPDF.addPairDistance(fDist); 

这会明显影响程序运行时间。

+0

我建议你做的是忘掉ICOUNT了一会儿,parallelise你的最外层循环,并得到一些加速。完成之后,您可以尝试实施柜台的方法并检查其对加速的影响。现在,我认为当您使用OpenMP的经验表明您应该采取小步骤时,您正在尝试采取巨大的措施。 – 2010-05-26 08:48:15

0

非常感谢马克。我删除了iCount并使外部循环并行,但是我正在挖这些代码,因为与串行版本相比,我仍然没有加速。

我想借此机会得到一个基本事实澄清......在嵌套循环的环境,就像上面......哪一个可能是普遍较好:

  1. 使环路平行的内

    编译OMP平行
    为(...我...)
    编译OMP对于
    为(...,J ...)

  2. 使外环平行,(只是...在外环之前的平行于...的编译指示)

  3. 使用折叠(用于Omp 3。0)

感谢
萨彦