c++ - OpenMP 嵌套并行化

标签 c++ openmp

我正在使用一个已经与 OpenMP 并行化的库。问题是 2-4 个内核似乎足以处理它正在进行的处理。使用 4 个以上的内核几乎没有什么区别。

我的代码是这样的:

for (size_t i=0; i<4; ++i)
    Call_To_Library (i, ...);

由于 4 个内核对于库来说似乎足够了(即 Call_To_Library 中应该使用 4 个内核),而我正在使用 16 个内核的机器,我打算也并行化我的 for 循环。请注意,此 for 最多包含 3-4 次迭代。

将这个外部并行化的最佳方法是什么?我还可以使用 OpenMP 吗?使用嵌套并行化是最佳实践吗?我正在调用的库已经使用了 OpenMP,我无法修改它的代码(而且它也不会很简单)。

附言。即使外部循环仅包含 4 次迭代,也值得并行化。每次调用库需要 4-5 秒。

最佳答案

如果这个循环的迭代之间没有依赖关系,你可以这样做:

 #pragma omp for schedule(static)
 for (size_t i=0; i<4; ++i)
    Call_To_Library (i, ...);

如果像您所说的那样,每次调用 Call_To_Library 都需要花费如此长的时间,那么嵌套 OpenMP 运算符的开销可能可以忽略不计。

此外,您说您无法控制在 Call_To_Library 中创建的 openmp 线程数。此解决方案会将 openmp 线程数乘以 4,您很可能会看到 4 倍的加速。可能内部 Call_To_Library 以这样的方式并行化,以至于最多只能同时执行几个 openmp 线程。使用外部并行,您可以将这个数字增加 4 倍。

嵌套并行的问题可能是您同时创建的线程数量激增,因此由于与创建/关闭相关的开销,您可能会看到不理想的加速openmp 线程数。

关于c++ - OpenMP 嵌套并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26850926/

相关文章:

c++ - 你如何在 Ubuntu 中的 QT 中的 QcustomPlot 上画两条线?

c++ - 局部变量是在评估函数返回值之前还是之后销毁的?

macos - 在 Mac OS X(sierra 和 Mojave)中启用 clang 中的 OpenMP 支持

使用 OpenMP 编译会导致内存泄漏

c++ - 避免并发访问变量

c++ - 使用同一分隔符的多个实例获取字符串的子字符串

c++ - 保存/序列化 boost 或 std 正则表达式

C++ 类型列表及其在列表中的别名

c++ - CUDA 结合 OpenMP

algorithm - 最大单笔销售利润 - 并行版本