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()等价?
答案 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
指令强制所有线程在此时相遇,从而产生一个阻塞,直到所有线程都赶上来。