何时并行区域停止以及哪个构造可以共享相同的并行区域?

时间:2015-02-15 06:08:10

标签: c parallel-processing openmp construct

在实施我的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

有关此的任何参考?

非常感谢!

1 个答案:

答案 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");
}