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”编译了代码。
答案 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