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

        }
    }
} 
}

我尝试过并行化内循环和外循环,并将 iCount 放在关键区域。并行化此的最佳方法是什么?如果我用 omp single 或 omp atomic 包装 iCount,那么代码会给出一个错误,我发现在 omp for 中这将是无效的。我想我正在添加许多无关的东西来并行化这一点。需要一些建议...

谢谢,

萨彦

4

3 回答 3

1

如果我正确地解释了您的意图,您想使用 iCount 告诉您的程序何时(每 10^6 次操作)更新 UI?而且 iCount 是全局的,所有线程都是共享值的,你想保持它的一致性吗?

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

如果您不喜欢所有线程都向 UI 发送消息的想法,也许只有一个线程可以做到这一点;如果一个线程是程序的 1/4,那么其他线程(大约)也是如此。

于 2010-05-25T14:19:45.033 回答
0

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

我想借此机会澄清一个基本事实……在像上面这样的嵌套循环环境中……通常哪个更好:

  1. 使内循环平行

    pragma omp parallel
    for(...i...)
    pragma omp for
    for(...j...)

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

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

谢谢
赛扬

于 2010-05-31T17:31:41.817 回答
0

再次感谢马克。我尝试了您建议的方法。我已经放了 reduction(+:iCount) 并且还尝试将 iCount++ 包装在 pragma 关键的周围,是的,它对性能造成了影响(我也看不到加速)。此外,我让一个线程处理 iCount,但我所做的方法并没有导致加速。

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

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

这可能会显着影响程序运行时间。

于 2010-05-25T20:43:16.130 回答