[英]OpenMP nested parallelization
我正在使用已经与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秒。
如果此循环的迭代之间没有依赖性,则可以执行以下操作:
#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线程相关的开销,您看到的加速效果可能不理想。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.