OpenMP嵌套并行化

时间:2014-11-10 18:58:22

标签: 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,我无法修改它的代码(无论如何都不会直截了当。)

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

1 个答案:

答案 0 :(得分:2)

如果此循环的迭代之间没有依赖关系,则可以执行以下操作:

 #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线程。