任何人都知道 的范围omp_set_max_active_levels()
,假设函数 A 有一个 omp 并行区域,并且在该区域内,A 的每个线程都会调用库函数 B,并且在库函数 B 中有 2 级 omp 并行度。
那么,如果我们将函数 A 中的 active omp level 设置为 3(A 中为 1,B 中为 2),是否可以确保库函数 B 的并行区域正常工作?
任何人都知道 的范围omp_set_max_active_levels()
,假设函数 A 有一个 omp 并行区域,并且在该区域内,A 的每个线程都会调用库函数 B,并且在库函数 B 中有 2 级 omp 并行度。
那么,如果我们将函数 A 中的 active omp level 设置为 3(A 中为 1,B 中为 2),是否可以确保库函数 B 的并行区域正常工作?
如果omp_set_max_active_levels()
从活动并行区域内调用,则该调用将(应该)被忽略。
根据 OpenMP 4.0 标准(第 3.2.15 节):
当从程序的顺序部分调用时,为
omp_set_max_active_levels
区域设置的绑定线程是遇到线程。当从任何显式并行区域中调用时,该区域的绑定线程集(和绑定区域,如果需要)omp_set_max_active_levels
是实现定义的。
后来:
该例程仅在从程序的顺序部分调用时才具有所描述的效果。当从显式并行区域中调用时,此例程的效果由实现定义。
因此,如果您在程序的顺序部分设置嵌套并行区域的最大数量,那么您应该确保在任何兼容的 OpenMP 实现上一切都将按预期工作。