1

我最近尝试在 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 被正确定义为私有变量(因为它们是在并行区域内创建的)。

与串行执行程序相比,我可以做些什么来确保在对程序进行多线程处理时得到相同的答案?

4

1 回答 1

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 减少条款,然后您将了解它的工作原理。

于 2012-11-09T04:07:20.777 回答