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