OpenMP如何在内部工作

时间:2016-02-03 00:34:09

标签: multithreading openmp

我尝试编写一个小型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 个答案:

答案 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教程(在线或书中)。只需要一点点研究,前三个问题就显而易见了。