pragma中的同步构造

时间:2010-05-24 20:12:28

标签: synchronization openmp

我有一个程序块,如:

    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中它会无效。我想我正在添加许多无关紧要的东西来加强这个。需要一些建议......

谢谢,

萨扬

3 个答案:

答案 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并使外部循环并行,但我正在挖掘代码,因为与串行版本相比,我仍然没有观察到加速。

我想借此机会澄清一个基本事实......在如上所述的嵌套循环环境中...哪一个通常更好:

  1. 使内循环平行

    pragma omp parallel
         对于(......我......)
    pragma omp for
         为(...,J ...)

  2. 使外环平行,(在外环之前只是... pragma parallel ...)

  3. 使用折叠(对于Omp 3.0)

  4. 感谢
    萨扬