3
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() 是等价的吗?

4

2 回答 2

5

它们不是等价的。

foo()fprintf将依次 执行这两个(部分)。bar()可以并行执行它们。

如需详尽的参考资料,您可以参考IBM 编译器文档

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

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

#pragma omp 并行

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

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

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

#pragma omp 单曲

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

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

#pragma omp 部分,#pragma omp 部分

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

omp section 指令对于 omp section 指令内的第一个程序代码段是可选的。后面的段必须以 omp 段指令开头。所有 omp section 指令必须出现在与 omp section 指令相关的程序源代码段的词法结构中。

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

于 2009-02-28T17:18:24.003 回答
2

在此资源的帮助下,这是我对 OpenMP 的一些记忆。

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

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

  • 指令强制所有线程在BARRIER该点相遇,从而产生一个块,直到所有线程都赶上。

于 2009-02-28T17:20:04.967 回答