以下 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)
将被忽略,因为默认情况下,嵌套并行性是禁用的。
并且如果 i
是 0
并且没有创建第一个并行区域(这里没有更多的嵌套并行),那么第二个确实会被创建并且会产生 5 个线程。
总之,i
non null 阻止创建内部平行区域,而 i
null 允许它。
当我输入 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)
将被忽略,因为默认情况下,嵌套并行性是禁用的。
并且如果 i
是 0
并且没有创建第一个并行区域(这里没有更多的嵌套并行),那么第二个确实会被创建并且会产生 5 个线程。
总之,i
non null 阻止创建内部平行区域,而 i
null 允许它。