如何使用 OpenMP 为每个函数分配不同数量的线程

How to assign different number of threads to each functions using OpenMP

我有两个函数,第二个函数中有一个 for 循环。

fun1() {
    ...
}
fun2() {
    for(...) {
    }
}

现在我想 运行 fun1fun2 并行(即每个函数使用一个线程)。在 fun2 里面,我希望我可以使用 omp parallel for 来执行 for 循环。

我试过这样实现的。

fun1() {
}

fun2() {
    #pragma omp for
    for() {
    }
}

int main() {
    #pragma omp parallel
    {
        #pragma omp single
        {
            fun1();
        }
        fun2();
    {
}

但它会多次调用 fun2

那么有办法做到这一点吗?

您应该结合使用 OpenMP 部分和嵌套并行性:

main中:

omp_set_nested(1);

#pragma omp parallel sections num_threads(2)
{
   #pragma omp section
   fun1();

   #pragma omp section
   fun2();
}

fun2中:

#pragma omp parallel for
for (...)
{
}

运行 您的程序,例如8 个线程,做这样的事情:

OMP_NUM_THREADS=8 OMP_THREAD_LIMIT=8 ./program

这样,外部并行区域将使用两个线程执行,而 fun2 中的嵌套并行区域将使用七个线程执行。如果 OMP_THREAD_LIMIT 未设置为 8(或未设置),OpenMP 将为嵌套区域启动八个线程,总共九个线程,这可能是理想的,也可能不是。