是否可以在没有线程0的情况下运行omp?

时间:2019-06-25 09:16:37

标签: c openmp

我有一个用例,其中我想并行运行两个函数:第一个包含要在线程0中执行的工作,另一个包含我要在其余3个中共享的“ for”循环线程。 我的代码就像:

void fct1(){
    //do some work1
};

void fct2(){
    int p;
    #pragma omp for schedule(static)
    for (p=start; p < end; p++) {
        //do some work2
    }
};

int main(){
    #pragma omp parallel 
    {
        int tid = omp_get_thread_num();
        if (tid==0)
            fct1();

        if(tid!=0)
            fct2();
    }
return 0;
}

问题是fct2中的“ omp for”挂起,因为它还等待线程0执行其部分。

您有什么建议吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用single(如果您确实想要线程0,则使用master)进行编译。 nowait指令将允许其他线程继续运行。

您应该在for循环中使用动态调度,因为它可以更好地处理可变数量的线程。如果线程0完成工作,它将加入该池。

#include <stdio.h>
#include <omp.h>

#define end 2000

void fct1(){
  printf("Hey I am thread %d\n", omp_get_thread_num());
};

void fct2(){
  int p;
# pragma omp for schedule(dynamic,128) // adapt chunk size to your problem
  for (p=0; p < end; p++) {
    printf("%d (%d)\t",p,omp_get_thread_num());
  } // all, including thread 0, will be synchronized here
};

int main(){
# pragma omp parallel 
  {
#   pragma omp single nowait
    fct1();

    fct2();
  }
  return 0;
}