gpt4 book ai didi

c - 为什么这个 OpenMP 并行 for 循环不能正常工作?

转载 作者:行者123 更新时间:2023-12-02 09:14:59 26 4
gpt4 key购买 nike

我想实现 OpenMP 来并行化我的代码。我从一个非常基本的例子开始了解它是如何工作的,但我遗漏了一些东西......

所以,我的例子看起来像这样,没有并行化:

int main() {
...

for (i = 0; i < n-1; i++) {
u[i+1] = (1+h)*u[i]; // Euler
v[i+1] = v[i]/(1-h); // implicit Euler
}

...

return 0;
}

我在“...”中省略了一些部分,因为它们不相关。它有效,如果我在文件上打印 u[]v[] 数组,我会得到预期的结果。

现在,如果我尝试通过添加来并行化它:

#include <omp.h>

int main() {
...

omp_set_num_threads(2);

#pragma omp parallel for
for (i = 0; i < n-1; i++) {
u[i+1] = (1+h)*u[i]; // Euler
v[i+1] = v[i]/(1-h); // implicit Euler
}

...

return 0;
}

代码编译并且程序运行,但是 u[]v[] 数组是一半是零。

如果我设置 omp_set_num_threads( 4 ),我会得到四分之三的零。
如果我设置 omp_set_num_threads( 1 ),我会得到预期的结果。

所以看起来只有第一个线程在执行,而其他线程没有...

我做错了什么?

最佳答案

OpenMP 假定循环的每次迭代都独立于其他迭代。当你这样写时:

for (i = 0; i < n-1; i++) {
u[i+1] = (1+h)*u[i]; // Euler
v[i+1] = v[i]/(1-h); // implicit Euler
}

循环的迭代 i 正在修改迭代 i+1。同时,迭代 i+1 可能同时发生。

除非您可以使迭代独立,否则这不是并行性的好用例。

而且,如果您考虑一下 Euler 方法的作用,就会很明显,以这种方式并行化您正在处理的代码是不可能的。欧拉方法根据时间t 的信息计算系统在时间t+1 的状态。由于如果不先了解 t 就无法知道 t+1 处的内容,因此无法在 Euler 方法的迭代中并行化。

关于c - 为什么这个 OpenMP 并行 for 循环不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48027598/

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