设置外部DLL的OMP线程号

时间:2019-05-03 23:57:43

标签: c++ windows openmp

我们在流程中导入了第三方动态库,该库在内部使用OpenMP。我们希望将此DLL的并行线程数限制为一个,并且不影响DLL之外的其他潜在OMP代码。根据{{​​3}},它有两种方式:

  1. 设置OMP_NUM_THREADS环境变量。
  2. 在运行时调用omp_set_num_threads()。

第一种方式显然会影响我过程中的所有内容。虽然我不确定第二种方法是否会影响OMP设置为受限制的DLL?文档中没有明确说明。

1 个答案:

答案 0 :(得分:0)

OpenMP的通常优先选择规则是在OpenMP运行时启动时以及创建第一个线程之前评估OMP_NUM_THREADSomp_set_num_threads()的效果取决于调用它的位置。

如果从顺序区域进行调用,则将影响要遇到的 next 并行区域(除非该区域使用num_threads子句设置其他数字)。如果调用是在并行区域内进行的,则该效果仅适用于线程调用,并且将影响该线程遇到的嵌套并行区域(同样,该区域没有num_threads子句加上OMP_NESTED=true

因此,要避免所调用的DLL函数的并行性,必须在每次调用DLL函数之前调用omp_set_num_threads(1),并在调用返回后恢复先前的值。