int a = 0;
#pragma omp parallel private(a)
{
a++;
printf("%d", a);
}
有了4个内核,人们可以期待这段代码打印1111,它可以在我的Linux机器上打印 .
但是,在我的Windows机器上运行cygwin中的相同代码(相同的标志等)会产生11117(不确定1的数量) .
7总是在那里,尝试相同的朋友也有7,任何想法如何发生这种情况?
我在两台机器上用“gcc source.c -fopenmp -O2”编译了代码 .
1 回答
我确实很难重现您的错误,因为正如我在评论中提到的,从OpenMP标准的角度来看,您的代码具有未定义的行为 . 实际上,在输入
parallel
区域时声明为private
的变量不会进行任何初始化,除非它们被声明为firstprivate
.在您的情况下,您递增一个值可以是任何值的变量,然后打印它 . 所以印刷的 Value 也可以是任何东西,包括你期望看到的那个 .
我发现对我来说,为了重现1和7系列,我必须编译代码,禁止编译器进行任何优化 . 一旦代码用
firstprivate
修复,所有结果都是1 .在修复之前:
代码修正:
然后