OpenMP - 循环中最简单的累加器会产生错误的结果

时间:2014-05-20 15:13:17

标签: c++ multithreading openmp

我正在使用intel C ++编译器并在16个线程上运行该程序。我希望第一个循环并行运行。我想,“计数”的结果应该是30000000。然而,事实证明它不到30000000.这个错误在哪里?谢谢!

#include <stdio.h>
#include <omp.h>
int main(){
    long count = 0;
    #pragma omp parallel
    {
        #pragma omp for
        for (long i = 0; i < 10000000; i++){
            for (int j = 0; j < 3; j++){
                count++;
            }
        }
    }
    printf("%d", count);
}

2 个答案:

答案 0 :(得分:2)

您已编写了规范的数据竞赛。程序中的所有线程都在争用更新变量count,并且无法保证每个线程读取,更新,然后将值写入变量的顺序。无论您怎么认为C ++都不能保证++原子应用。

您应该继续阅读OpenMP教程,了解共享(和私有)变量,以及减少

如果你在这里搜索SO,你应该找到类似的问题,其中一些问题包括代码,以告诉你如何做你想做的事。

答案 1 :(得分:0)

您还可以通过插入以下内容来指示omp以原子方式执行增量:

 #pragma omp atomic
在计算++行之前

。然后,您可以避免以前HPM描述的竞争条件。请参阅http://msdn.microsoft.com/en-us/library/8ztckdts.aspxhttps://computing.llnl.gov/tutorials/openMP/#ATOMIC