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

che*_*ang 3 parallel-processing multithreading for-loop openmp sections

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

fun1() {
    ...
}
fun2() {
    for(...) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我尝试像这样实现它。

fun1() {
}

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

int main() {
    #pragma omp parallel
    {
        #pragma omp single
        {
            fun1();
        }
        fun2();
    {
}
Run Code Online (Sandbox Code Playgroud)

但它会调用fun2多次。

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

Hri*_*iev 5

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

main

omp_set_nested(1);

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

   #pragma omp section
   fun2();
}
Run Code Online (Sandbox Code Playgroud)

fun2

#pragma omp parallel for
for (...)
{
}
Run Code Online (Sandbox Code Playgroud)

要使用例如 8 个线程运行程序,请执行以下操作:

OMP_NUM_THREADS=8 OMP_THREAD_LIMIT=8 ./program
Run Code Online (Sandbox Code Playgroud)

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