以下 omp 如何并行工作?

How does the following omp parallel if works?

当我输入 i = 1 时,它输出:

c[0] = 7
c[0] = 7
c[0] = 7
c[0] = 7
c[0] = 7

但是当我输入 i = 0 时它输出:

c[1] = 9
c[2] = 11
c[3] = 13
c[4] = 15
c[0] = 7

i = 0 的输出不应该是 i = 1 的输出,反之亦然吗?

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

int main(){
    int a[5] = {1, 2, 3, 4, 5} ;
    int b[5] = {6, 7, 8, 9, 10} ;
    int c[5];
    int tid;
    int i;
    scanf("%d", &i);
    #pragma omp parallel if(i)
    {
        #pragma omp parallel num_threads(5)
            {
                tid = omp_get_thread_num();
                c[tid] = a[tid] + b[tid];
                printf("c[%d] = %d\n", tid, c[tid]);    
            }
    
    }
    
}```

您看到的行为是正确的(假设变量 tid 已被声明 private,否则这里会出现竞争条件)。

事实上,当且仅当 i 不是 0 时,第一个 #pragama omp parallel if(i) 将创建一个具有实现定义的线程数的并行区域。 但是,如果已经创建了并行区域,那么下面的 #pragma omp parallel num_threads(5) 将被忽略,因为默认情况下,嵌套并行性是禁用的。

并且如果 i0 并且没有创建第一个并行区域(这里没有更多的嵌套并行),那么第二个确实会被创建并且会产生 5 个线程。

总之,i non null 阻止创建内部平行区域,而 i null 允许它。