Import OpenMP:foo()和bar()之间的区别是什么

Import OpenMP:foo()和bar()之间的区别是什么,import,openmp,Import,Openmp,Q1是foo()和bar()等价物吗?它们不是等价物 foo()将按顺序执行两个fprintf(部分)bar()可以并行执行它们 有关详尽的参考资料,请参阅 本质上,在foo()的情况下,单个工作线程处理第一部分,然后完成并与主线程重新同步(顺便说一句,屏障隐含在单个构造的末尾)。然后新的工作线程处理第二部分,完成,并与主线程重新同步 对于bar(),一个单独的工作线程处理每个部分(第一部分first part,是一个隐式部分)。工作线程并行完成工作 #pragma-omp并行 omp并行指令显

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

它们不是等价物

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

有关详尽的参考资料,请参阅

本质上,在
foo()
的情况下,单个工作线程处理
第一部分
,然后完成并与主线程重新同步(顺便说一句,
屏障
隐含在
单个
构造的末尾)。然后新的工作线程处理
第二部分
,完成,并与主线程重新同步

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

#pragma-omp并行 omp并行指令显式 指示编译器并行化 所选的代码块。当 遇到并行区域时 形成了线程的逻辑团队。 团队中的每个线程执行所有 平行区域内的语句 除了工作共享结构。 工作共享结构中的工作是 分布在线程中的 团队

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

嵌套的平行区域始终为空 连载

#布拉格omp单曲 omp single指令标识 必须由 单个可用线程

最后存在一个隐含的障碍 并行语句块的构造 除非指定了nowait条款

#pragma omp段,#pragma omp段 omp区段指令分发 在绑定到定义的 平行区域

omp段指令是可选的 对于第一个程序代码段 在omp节指令中。 以下段前面必须有 omp段指令。全omp 节指令必须出现在 程序的词汇结构 与关联的源代码段 omp部分指令

当程序执行到达omp时 指令部分,程序段 由以下omp部分定义 指令是为并行而分布的 在可用线程之间执行。A. 屏障是在 大项目区域的结束 与omp部分关联 指令,除非nowait条款 指定的


下面是我对OpenMP的一点记忆,在这方面的帮助下

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

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

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


我想,既然你用“Q1”来介绍你的问题,这是来自一些教程或家庭作业。是的,我把这个问题作为研究!!
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"); 
         }
    }
}