我想"筑巢"并行使用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;
}
这就是我想要的:
到目前为止,我只找到了一个禁用嵌套并行性或总是允许它的解决方案,但我正在寻找一种只有在启动的线程数低于核心数时启用它的方法。
是否有使用任务的OpenMP解决方案?
答案 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的相对值。