gpt4 book ai didi

C OpenMP 代码在 cygwin 上运行异常,但在 Linux 上运行正常

转载 作者:行者123 更新时间:2023-12-04 00:50:45 24 4
gpt4 key购买 nike

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

如果是 4 核,人们会期望这段代码打印 1111,这在我的 Linux 机器上是这样的。

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

7 总是存在,尝试过同样操作的 friend 也有 7,有什么想法这是如何发生的吗?

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

最佳答案

我确实很难重现您的错误,因为正如我在评论中提到的,从 OpenMP 标准的角度来看,您的代码具有未定义的行为。事实上,在进入并行区域时声明为private的变量不会获得任何初始化,除非它们被声明为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 <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

关于C OpenMP 代码在 cygwin 上运行异常,但在 Linux 上运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53697866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com