他们并不等同.
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指令关联的较大程序区域的末尾隐式定义屏障.