我们在流程中导入了第三方动态库,该库在内部使用OpenMP。我们希望将此DLL的并行线程数限制为一个,并且不影响DLL之外的其他潜在OMP代码。根据{{3}},它有两种方式:
第一种方式显然会影响我过程中的所有内容。虽然我不确定第二种方法是否会影响OMP设置为受限制的DLL?文档中没有明确说明。
答案 0 :(得分:0)
OpenMP的通常优先选择规则是在OpenMP运行时启动时以及创建第一个线程之前评估OMP_NUM_THREADS
。 omp_set_num_threads()
的效果取决于调用它的位置。
如果从顺序区域进行调用,则将影响要遇到的 next 并行区域(除非该区域使用num_threads
子句设置其他数字)。如果调用是在并行区域内进行的,则该效果仅适用于线程调用,并且将影响该线程遇到的嵌套并行区域(同样,该区域没有num_threads
子句加上OMP_NESTED=true
)
因此,要避免所调用的DLL函数的并行性,必须在每次调用DLL函数之前调用omp_set_num_threads(1)
,并在调用返回后恢复先前的值。