OpenMP:foo()和bar()之间有什么区别

时间:2009-02-28 16:55:03

标签: import openmp

void foo(void) {
    #pragma omp parallel
    {
        #pragma omp single
            {fprintf(stderr, "first part\n"); }
        #pragma omp barrier   
        #pragma omp single
           { fprintf(stderr, "second part\n"); }
    }
}
void bar (void) {
    #pragma omp parallel
    {
        #pragma  omp sections
        {
            fprintf(stderr, "first part\n"); 
             #pragma  omp section
             fprintf(stderr, "second part\n"); 
         }
    }
}

Q1-foo()和bar()等价?

2 个答案:

答案 0 :(得分:5)

他们不等同于

foo()将按顺序执行两个fprintf(部分)。 bar()可以并行执行它们。

有关详尽的参考,您可以参考IBM compiler documentation

基本上,在foo()的情况下,单个工作线程处理first part,然后完成并与主线程重新同步(顺便说一下,barrier隐含在single构造的结束。)然后,新的工作线程处理second part,完成并与主线程重新同步。

bar()的情况下,一个单独的工作线程处理每个部分(第一部分first part是一个隐式部分。)工作线程并行完成工作。

  

#pragma omp parallel

     

显式的omp并行指令   指示编译器并行化   选择的代码块。当一个   遇到平行区域,a   形成了逻辑的线程团队。   团队中的每个线程都执行全部   并行区域内的语句   除了工作共享结构。   工作共享结构中的工作是   分布在一个线程中   队。

     

循环迭代必须是独立的   在循环之前可以并行化。   最后存在隐含的障碍   并行语句块。

     

嵌套的并行区域总是如此   序列

     

#pragma omp single

     

omp单指令标识a   必须由a运行的代码段   单个可用线程。

     

最后存在隐含的障碍   并行语句块的   除非指定了nowait子句。

     

#pragma omp section,#pragma omp sections

     

omp sections指令分发   在绑定到已定义的线程之间工作   平行区域。

     

omp section指令是可选的   对于第一个程序代码段   在omp sections指令中。   必须在以下段之后加上   一个omp部分指令。全部omp   section指令必须出现在   该程序的词汇结构   与...相关的源代码段   omp部分指令。

     

当程序执行到达omp时   sections指令,程序段   由以下omp部分定义   指令是并行分发的   在可用线程之间执行。一个   障碍是隐含地定义在   较大的计划区域结束   与omp部分相关联   指令除非是nowait子句   指定。

答案 1 :(得分:2)

resource的帮助下,这是我对OpenMP的一些记忆。

  • SECTION指令“为任意顺序代码块指定并行执行。每个SECTION由团队中的一个线程执行一次。”

  • SINGLE指定一个代码块“其中只允许一个线程执行代码;未选择执行此部分的线程忽略代码。”

  • BARRIER指令强制所有线程在此时相遇,从而产生一个阻塞,直到所有线程都赶上来。