OpenMP 内部是如何工作的
How does OpenMP works internally
我试图编写一个小的 C 程序来弄清楚 OpenMP 是如何工作的。这个例子应该计算 1 到 1000 的总和;但是,它在终端中打印出 0。我只能在评论 #pragma
之后才能得到想要的结果。谁能告诉我原因吗?
This guide 表示 #pragma omp for
将 for 循环的工作分配给当前团队的线程。它不创建线程,它只在当前执行团队的线程之间分配工作。所以我们应该在整个执行过程中只有一个主线程,对吗?
#include <stdio.h>
int main() {
int n, sum = 0;
#pragma omp for
for (n = 0; n <1000; n++) {
sum += n;
}
printf("%d\n");
return 0;
}
对于这样一个简单的例子,你有几个问题...
1) 您没有启动并行区域。为此,请使用 omp parallel for
而不是 omp for
.
2) 您的变量不会被每个在不同循环上工作的线程私有。所以每个线程都在覆盖彼此线程的变量版本。具体来说 n
需要设为私有。
3) 您正试图对多个线程中的一个共享变量求和。这必须使用 reduction
子句来完成。
4) 你实际上并没有打印任何东西。您的 printf()
语法原样永远不会打印正确的结果。
所以你的例子应该是这样的:
int n, sum = 0;
#pragma omp parallel for private(n) reduction(+:sum)
for (n = 0; n < 1000; n++) {
sum += n;
}
printf("%d\n", sum);
我强烈建议您查找基本的 OpenMP 教程(在线或书籍)。只要稍作研究,前 3 个问题就会很明显。
我试图编写一个小的 C 程序来弄清楚 OpenMP 是如何工作的。这个例子应该计算 1 到 1000 的总和;但是,它在终端中打印出 0。我只能在评论 #pragma
之后才能得到想要的结果。谁能告诉我原因吗?
This guide 表示 #pragma omp for
将 for 循环的工作分配给当前团队的线程。它不创建线程,它只在当前执行团队的线程之间分配工作。所以我们应该在整个执行过程中只有一个主线程,对吗?
#include <stdio.h>
int main() {
int n, sum = 0;
#pragma omp for
for (n = 0; n <1000; n++) {
sum += n;
}
printf("%d\n");
return 0;
}
对于这样一个简单的例子,你有几个问题...
1) 您没有启动并行区域。为此,请使用 omp parallel for
而不是 omp for
.
2) 您的变量不会被每个在不同循环上工作的线程私有。所以每个线程都在覆盖彼此线程的变量版本。具体来说 n
需要设为私有。
3) 您正试图对多个线程中的一个共享变量求和。这必须使用 reduction
子句来完成。
4) 你实际上并没有打印任何东西。您的 printf()
语法原样永远不会打印正确的结果。
所以你的例子应该是这样的:
int n, sum = 0;
#pragma omp parallel for private(n) reduction(+:sum)
for (n = 0; n < 1000; n++) {
sum += n;
}
printf("%d\n", sum);
我强烈建议您查找基本的 OpenMP 教程(在线或书籍)。只要稍作研究,前 3 个问题就会很明显。