Synchronization pragma内的同步构造

Synchronization pragma内的同步构造,synchronization,openmp,Synchronization,Openmp,我有一个程序块,如: for (iIndex1=0; iIndex1 < iSize; iIndex1++) { for (iIndex2=iIndex1+1; iIndex2 < iSize; iIndex2++) { iCount++; fDist =(*this)[iIndex1].distance( (*this)[iIndex2] ); m_oPDF

我有一个程序块,如:

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

        }
    }
} 
}
for(iIndex1=0;iIndex1进度(iCount,(size()-1)*((size()-1))/2);
}
}
} 
}
我尝试了将内部和外部循环并行化,并将iCount放在一个关键区域。将此并行化的最佳方法是什么?如果我使用omp single或omp atomic包装iCount,那么代码会给出一个错误,我发现这在omp中对于是无效的。我想我正在添加许多无关的东西来并行处理这个问题。需要一些建议

谢谢


Sayan

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

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


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

再次感谢标记。我尝试了你建议的方法。我已经将reduce(+:iCount)放在了pragma critical上,并尝试将iCount++包装在pragma critical上,是的,这是一个性能上的打击(我也看不到任何加速)。此外,我让一个线程处理iCount,但我所采用的方法没有加速效果

我希望,如果我在内部循环中放置一个pragma for,并将iCount声明为一个缩减变量,我至少会注意到一些加速。我的目标是为Index1,Index2对并行执行这些语句:

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

这可能会显著影响程序的运行时间

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

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

  • 使内环平行

    pragma omp parallel
    对于(…i…)
    pragma omp for
    对于(…j…)

  • 使外循环平行,(在外循环之前只是一个…pragma平行)

  • 使用折叠(适用于Omp 3.0)

  • 谢谢

    Sayan

    我建议您暂时忘记iCount,将最外层的环路并行化,并获得一些加速。一旦你做到了这一点,你就可以尝试实现计数器的方法,并检查它们对加速的影响。现在,我认为您正试图迈出一大步,而您的OpenMP经验水平表明您应该迈出一小步。