我尝试编写一个小型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;
}
答案 0 :(得分:4)
对于这样一个简单的例子,你有几个问题......
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教程(在线或书中)。只需要一点点研究,前三个问题就显而易见了。