为什么“omp parallel”和“omp single”不相互抵消? (OpenMP的)

时间:2017-02-03 21:43:01

标签: c multithreading openmp

在我学习OpenMP的过程中,我遇到了一个主要看起来像这样的例子:

int main(){
    #pragma omp parallel
        #pragma omp single
        some_function(1,2);
return 0;
}

如果我错了,请纠正我,但是根据我的理解parallel创建线程,single只允许一个线程通过。

那么这两个不要相互抵消吗?如果您只打算使用一个线程,那么创建线程的重点是什么?

some_function递归地在#pragma omp task内调用自己,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:2)

omp parallel创建的线程团队在omp single期间仍然存在,他们只是不参与执行并等待工作。然后omp task会产生重大影响(这就是为什么在你的问题中包含一个完整的例子非常重要的原因)!此时创建一​​个任务(很可能)由等待工作的其中一个线程执行。这就是通常使用OpenMP中的任务的方式。团队中的任何线程都可以创建任务,运行时会将它们分配给团队中的线程(可能包括产生它的线程)。