在我学习OpenMP的过程中,我遇到了一个主要看起来像这样的例子:
int main(){
#pragma omp parallel
#pragma omp single
some_function(1,2);
return 0;
}
如果我错了,请纠正我,但是根据我的理解parallel
创建线程,single
只允许一个线程通过。
那么这两个不要相互抵消吗?如果您只打算使用一个线程,那么创建线程的重点是什么?
some_function
递归地在#pragma omp task
内调用自己,如果这有任何区别的话。
答案 0 :(得分:2)
由omp parallel
创建的线程团队在omp single
期间仍然存在,他们只是不参与执行并等待工作。然后omp task
会产生重大影响(这就是为什么在你的问题中包含一个完整的例子非常重要的原因)!此时创建一个任务(很可能)由等待工作的其中一个线程执行。这就是通常使用OpenMP中的任务的方式。团队中的任何线程都可以创建任务,运行时会将它们分配给团队中的线程(可能包括产生它的线程)。