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

3 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"); 
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

vla*_*adr 5

他们并不等同.

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

有关详尽的参考,您可以参考IBM编译器文档.

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

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

#pragma omp parallel

omp parallel指令显式指示编译器并行化所选的代码块.当遇到并行区域时,形成一个逻辑的线程团队.除了工作共享结构之外,团队中的每个线程都执行并行区域内的所有语句.工作共享结构中的工作分布在团队中的线程中.

在循环可以并行化之前,循环迭代必须是独立的.在并行化语句块的末尾存在隐含的障碍.

嵌套的并行区域始终是序列化的.

#pragma omp单身

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

除非指定了nowait子句,否则在并行化语句块的末尾存在隐含的障碍.

#pragma omp section,#pragma omp sections

omp sections指令在绑定到定义的并行区域的线程之间分配工作.

对于omp sections指令内的第一个程序代码段,omp section指令是可选的.以下段必须以omp section指令开头.所有omp节指令必须出现在与omp sections指令关联的程序源代码段的词法结构中.

当程序执行到达omp sections指令时,由以下omp section指令定义的程序段被分发用于在可用线程之间并行执行.除非指定了nowait子句,否则在与omp sections指令关联的较大程序区域的末尾隐式定义屏障.