我有一个用例,其中我想并行运行两个函数:第一个包含要在线程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执行其部分。
您有什么建议吗? 谢谢。
答案 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;
}