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

时间:2016-04-07 06:58:39

标签: multithreading for-loop parallel-processing openmp sections

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

category.posts.where(user_id: 2)
Post.my_scope

现在我想并行运行fun1() { ... } fun2() { for(...) { } } fun1(即使用单个线程的每个函数)。在fun2里面,我希望我可以使用fun2来执行for循环。

我试图像这样实现它。

omp parallel for

但它会多次调用fun1() { } fun2() { #pragma omp for for() { } } int main() { #pragma omp parallel { #pragma omp single { fun1(); } fun2(); { }

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

您应该使用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将为嵌套区域启动总共9个线程的8个线程,这可能是也可能不是。