在实现我的openMP程序时被这两个问题困扰
Q1:平行区域和不同构造什么时候停止?
OpenMP 似乎提倡使用 {} 作为构造或并行区域之间的分隔符,它有时会在与 for 循环使用的 {} 冲突或为了代码简单性而故意选择不使用它的情况下令人困惑或违背其初衷
示例 1:
int main() {
int i, j;
int t =0;
int a[sizeA];
for (i=0;i<sizeA;i++)
a[i] =1;
double elapsed =-omp_get_wtime();
#pragma omp parallel for reduction(+: t)
for(j=0; j<sizeA; j++)
t=t+a[j];
--------------------1-----------------------------------------------------
#pragma omp master
printf("The sum of the array %d\n", t);
---------------------2-------------------------------------------------------
elapsed+=omp_get_wtime();
printf("The sum of the array In [REDUCTION] is %d: \n", t);
printf("The time cost is %f: \n", elapsed);
-----------------------------3--------------------------------------
}
在上面的例子中,并行区域是停在 1 还是 2 还是 3 (如程序中标记的那样)?根据测试结果,它停在位置 2。因为 2-3 之间的部分只执行了一次,我觉得这很混乱,为什么会这样?
我也非常反对使用组合指令 like
#pragma omp parallel for bla bla
,这更加混乱,相同的代码,有点不同,添加 {} for for 循环
#pragma omp parallel for reduction(+: t)
for(j=0; j<sizeA; j++)
{ //================difference added here================
t=t+a[j];
printf("hi, everyone\n");
} //===============difference added here ==================
//--------------------1-----------------------------------------------------
#pragma omp master
printf("The sum of the array %d\n", t);
//---------------------2-------------------------------------------------------
elapsed+=omp_get_wtime();
printf("The sum of the array In [REDUCTION] is %d: \n", t);
printf("The time cost is %f: \n", elapsed);
// -----------------------------3--------------------------------------
}
在第二个例子中,平行区域是否停止在 1?在 2? 如果我想让平行区域包含#pragma omp master
构造,我是否必须为平行区域添加额外的括号?因此,打破组合指令#pragma omp parallel for
,如下所示:或者有更好的方法(如果有的话,会非常高兴)
#pragma omp parallel
{
#pragma omp for reduction(+: t)
for(j=0; j<sizeA; j++)
{
t=t+a[j];
printf("hi, everyone\n");
}
#pragma omp master
bla bla
}
==================================================== =================== **Q2:哪些构造可以停留在同一个平行区域内?**
和第一个例子一样#pragma omp for
,#pragma omp master
默认共享同一个并行区域,但是,#pragma omp master
即使 没有 {} 明确说明,后面的任何内容都不是,什么样的构造可以共享同一个并行区域?喜欢工作共享结构与同步结构
对此有任何参考吗?
非常感谢!