我最近尝试在Visual Studio中尝试使用OpenMP来学习如何多线程化我的程序。
如果我尝试连续执行此代码:
int totalSum = 0;
for(int x=0; x < 100; x++)
{
for(int y=0; y < 100; y++)
{
totalSum = totalSum + x + y;
}
}
我最终得到的是 totalSum = 990000
当我尝试仅通过说:
添加OpenMP功能时#pragma omp parallel for
for(int x=0; x < 100; x++)
{
for(int y=0; y < 100; y++)
{
totalSum = totalSum + x + y;
}
}
我最终得到 totalSum = 491293 或596865或638260等......
显然正在发生的事情是竞争条件似乎正在发生,并且取决于哪个线程首先访问totalSum,最终答案会有所不同。
我做错了什么? x和y被正确定义为私有变量(因为它们是在并行区域内创建的)。
与串行执行程序相比,当我对程序进行多线程处理时,我能做些什么来确保得到相同的答案?
答案 0 :(得分:2)
修复方法是使用reduction
子句:
int totalSum = 0;
#pragma omp parallel for reduction(+:totalSum) // reduction
for(int x=0; x < 100; x++)
{
for(int y=0; y < 100; y++)
{
totalSum = totalSum + x + y;
}
}
阅读OpenMP减少条款,然后您将了解它是如何工作的。