登陆

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

admin 2022-11-25 3人围观 ,发现0个评论



1> Gilles..:

我确实很难重现您的错误,因为正如我在评论中提到的,从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 

代码修正:

#include  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 

请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP