在实施我的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之间的部分只执行一次,我觉得这很混乱,为什么呢?
我也反对使用组合指令
#pragma omp parallel for bla bla
,这使情况更加混乱,相同的代码,稍微不同,为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
之后的任何内容都不是没有{}明确说明,哪种构造可以共享同一个并行区域?比如working sharing construct vs Synchronization Constructs
有关此的任何参考?
非常感谢!
答案 0 :(得分:0)
声明
#pragma omp parallel for reduction(+: t)
使用下一个C语句来定义要工作的区域。在区域的开头,生成多个线程,并在区域的末尾进行集合。
#pragma omp master
并且类似地将封闭区域分成几部分。该pragma之后的部分仅由&#39; master&#39;线程。
A&#39;#for&#39;在并行区域内使用由区域定义的线程,它不定义区域本身,但定义了许多要执行的作业。除非&#39; nowait&#39;条款被添加有一个&#39;屏障&#39;或循环结束时的同步点。随着&#39; nowait&#39;子句其他部分(例如omp master)在循环之后将同时运行。
要强调,只要添加
即可#pragma omp parallel
你得到多个线程。每个线程执行后的单个语句或块。另一个&#34; #pragma&#34;需要限制哪些线程运行代码的哪些部分。
编辑: 例如,在我的八个核心上只有&#34; Hello World&#34;印刷八次。
#include <stdio.h>
#include <omp.h>
int main(){
printf("Starting\n");
#pragma omp parallel
printf("Hello World\n");
printf("Split\n");
#pragma omp parallel
{
#pragma omp master
printf("OOps, really\n");
}
printf("Done\n");
}