C OpenMP代码在cygwin上异常起作用,但与Linux上预期的一样

时间:2018-12-09 23:50:26

标签: c cygwin openmp

int a = 0;
#pragma omp parallel private(a)
{
    a++;
    printf("%d", a);
}

拥有4个内核的人们希望这部分代码能够在我的Linux机器上打印出1111。

但是,在Windows计算机上的cygwin中运行相同的代码段(相同的标志等)会导致11117(不确定1的数量)。

7始终存在,并且尝试过7的朋友也拥有7 任何想法如何发生?

我在两台计算机上均使用“ gcc source.c -fopenmp -O2”编译了代码。

1 个答案:

答案 0 :(得分:5)

我确实很难重现您的错误,因为正如我在评论中提到的那样,从OpenMP标准角度来看,您的代码具有未定义的行为。实际上,除非进入private,否则在进入parallel区域时声明为firstprivate的变量不会得到任何初始化。

在您的情况下,您增加一个变量,该变量的值可以是任意值,然后打印出来。因此,打印的值也可以是任何值,包括您期望看到的值。

我发现,对我来说,为了重现1和7的序列,我不得不编译代码,使编译器无法进行任何优化。 用firstprivate修复代码后,所有结果均为1s。

修复之前:

$ gcc -O0 -fopenmp foo.c
$ OMP_NUM_THREADS=5 ./a.exe
71111
$ OMP_NUM_THREADS=5 ./a.exe
17111

固定代码:

#include <stdio.h>
int main () {
    int a = 0;
    #pragma omp parallel firstprivate(a)
    {
        a++;
        printf("%d", a);
    }
    return 0;
}

然后

$ gcc -O0 -fopenmp foo.c
$ OMP_NUM_THREADS=5 ./a.exe
11111