C OpenMP代码意外地在cygwin上运行,但正如Linux上预期的那样

MrS*_*key 2 c cygwin openmp

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

有4个内核可以期望这段代码打印1111,它在我的Linux机器上打印.

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

7总是在那里,一个尝试相同的朋友也有7,任何想法如何发生这种情况?

我在两台机器上用"gcc source.c -fopenmp -O2"编译了代码.

Gil*_*les 5

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

在您的情况下,您递增一个值可以是任何值的变量,然后打印它.所以印刷的价值也可以是任何东西,包括你期望看到的那个.

我发现对我来说,为了重现1和7系列,我必须编译代码,禁止编译器进行任何优化.一旦代码被修复firstprivate,所有结果都是1.

修复前:

$ gcc -O0 -fopenmp foo.c
$ OMP_NUM_THREADS=5 ./a.exe
71111
$ OMP_NUM_THREADS=5 ./a.exe
17111
Run Code Online (Sandbox Code Playgroud)

代码修正:

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

然后

$ gcc -O0 -fopenmp foo.c
$ OMP_NUM_THREADS=5 ./a.exe
11111
Run Code Online (Sandbox Code Playgroud)