OpenMP 内部如何工作

Yuf*_*Fei 4 multithreading openmp

我试图编写一个小的 C 程序来弄清楚 OpenMP 是如何工作的。这个例子应该计算 1 到 1000 的总和;但是,它在终端中打印出 0。我只能在注释掉这些#pragma东西后才能得到想要的结果。有人能告诉我原因吗?

本指南#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;
}
Run Code Online (Sandbox Code Playgroud)

Nos*_*All 5

对于这样一个简单的例子,你有几个问题......

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);
Run Code Online (Sandbox Code Playgroud)

我强烈建议您查找基本的 OpenMP 教程(在线或在书中)。只需稍加研究,前三个问题就会很明显。