我正在使用一个已经与 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/