OpenMP和嵌套并行

时间:2015-09-09 09:35:39

标签: c++ openmp

我想"筑巢"并行使用OpenMP。这是一个玩具代码:

#include <iostream>
#include <cmath>

void subproblem(int m) {
  #pragma omp parallel for
  for (int j{0}; j < m; ++j) {
    double sum{0.0};
    for (int k{0}; k < 10000000; ++k) {
      sum += std::cos(static_cast<double>(k));
    }
    #pragma omp critical
    { std::cout << "Sum: " << sum << std::endl; }
  }
}

int main(int argc, const char *argv[]) {
  int n{2};
  int m{8};

  #pragma omp parallel for
  for (int i{0}; i < n; ++i) {
    subproblem(m);
  }

  return 0;
}

这就是我想要的:

  • 如果n&gt; =(我机器上的核心数),我只希望第一个循环并行化。
  • 如果n < (我机器上的核心数),我希望OpenMP在内循环中启动线程,但我不希望线程总数超过我机器上的核心数。

到目前为止,我只找到了一个禁用嵌套并行性或总是允许它的解决方案,但我正在寻找一种只有在启动的线程数低于核心数时启用它的方法。

是否有使用任务的OpenMP解决方案?

1 个答案:

答案 0 :(得分:4)

您可以告诉OpenMP将嵌套循环“折叠”到n * m迭代空间上的单个并行部分,而不是使用一对嵌套的并行部分:

#pragma omp parallel for collapse(2)
for (int i{0}; i < n; ++i) {
  for (int j{0}; j < m; ++j) {
    // ...
  }
}

这将允许它适当地划分工作,而不管n和m的相对值。