最简单的循环累加器给出了不正确的结果

OpenMP - simplest accumulator in loops gives incorrect result

本文关键字:不正确 结果 循环 累加器 最简单      更新时间:2023-10-16

我使用英特尔c++编译器并在16线程上运行程序。我想让第一个循环并行运行。count的结果应该是30000000,我猜。然而,结果是少于3000万。虫子在哪里?谢谢!

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

您已经编写了一个规范的数据竞赛。程序中的所有线程都在争着更新变量count,并且不能保证每个线程读取、更新然后将值写入变量的顺序。不管你怎么想,c++并不能保证自动地应用++

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

如果你在这里搜索SO,你应该会发现类似的问题,其中一些问题的答案包括代码,向你展示如何做你正在尝试做的事情。

您还可以通过插入:

命令omp自动执行增量操作
 #pragma omp atomic

在你的count++行之前。这样就避免了前面HPM描述的竞态条件。参见http://msdn.microsoft.com/en-us/library/8ztckdts.aspx或https://computing.llnl.gov/tutorials/openMP/#ATOMIC