繁体   English   中英

OpenMP嵌套并行化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM