Parallel processing omp临界和omp单一之间的差异

Parallel processing omp临界和omp单一之间的差异,parallel-processing,openmp,Parallel Processing,Openmp,我试图理解OpenMP中#pragma omp critical和#pragma omp single之间的确切区别: Microsoft对这些的定义如下: Single:用于指定应在上执行的代码段 单线程,不一定是主线程 临界:指定一次只能在一个线程上执行代码 时间 这意味着在这两种情况下,代码的确切部分将由一个线程执行,而其他线程将不会进入该部分。例如,如果我们打印某些内容,我们将在屏幕上看到一次结果,对吗 有什么区别吗?看来关键的是要注意执行时间,但不是单一的!但我看不出在实践中有什么

我试图理解OpenMP中
#pragma omp critical
#pragma omp single
之间的确切区别:

Microsoft对这些的定义如下:

  • Single:用于指定应在上执行的代码段 单线程,不一定是主线程
  • 临界:指定一次只能在一个线程上执行代码 时间
这意味着在这两种情况下,代码的确切部分将由一个线程执行,而其他线程将不会进入该部分。例如,如果我们打印某些内容,我们将在屏幕上看到一次结果,对吗

有什么区别吗?看来关键的是要注意执行时间,但不是单一的!但我看不出在实践中有什么不同!这是否意味着对其他线程(不进入该部分)的等待或同步被认为是关键的,但没有任何东西可以将其他线程保存在单个线程中?它如何在实践中改变结果


如果有人能向我澄清这一点,特别是举个例子,我将不胜感激。谢谢

单一的
关键的
是两件非常不同的事情。正如你提到的:

  • single
    指定一段代码应由单线程执行(不一定是主线程)
  • critical
    指定每次由一个线程执行代码
因此,前者只执行一次,而后者执行的次数与线程的次数相同

例如,下面的代码

inta=0,b=0;
#pragma omp并行num_线程(4)
{
#布拉格omp单曲
a++;
#pragma-omp-critical
b++;
}
printf(“单个:%d——关键:%d\n”,a,b);
将打印

single: 1 -- critical: 4
我希望你现在能更好地看到差异

为了完整起见,我可以补充一点:

  • master
    single
    非常相似,但有两个区别:
  • master
    将仅由master执行,而
    single
    可由最先到达区域的线程执行;及
  • single
    在区域完成时有一个隐式的障碍,在该区域中,所有线程都等待同步,而
    master
    没有任何障碍
  • atomic
    critical
    非常相似,但仅限于选择简单的操作

我添加了这些精度,因为这两对指令通常是人们容易混淆的指令…

单个
关键
属于两种完全不同的OpenMP结构
single
是一种工作共享结构,与
部分一起使用。工作共享构造用于在线程之间分配一定数量的工作。在正确的OpenMP程序中,所有线程都必须在执行时以相同的顺序遇到它们,而且也包括
屏障
构造,从这个意义上说,这些构造是“集体的”。三种工作共享构造涵盖三种不同的一般情况:

  • for
    (又称循环构造)在线程之间自动分配循环的迭代-在大多数情况下,所有线程都有工作要做
  • 部分
    在线程之间分配一系列独立的代码块-一些线程开始工作。这是对
构造的
的概括,作为一个包含100次迭代的循环,可以表示为10个循环段,每个循环段包含10次迭代
  • single
    只挑选一个线程执行的代码块,通常是第一个遇到它的线程(一个实现细节)——只有一个线程得到工作<代码>单个在很大程度上等同于只包含单个部分的
    部分
  • 所有工作共享结构的一个共同特点是在其末端存在一个隐式屏障,可以通过向相应的OpenMP结构添加
    nowait
    子句来关闭该屏障,但该标准不要求此类行为,对于某些OpenMP运行时,尽管存在
    nowait
    ,屏障可能仍然存在。因此,工作共享结构的顺序不正确(即在某些线程中顺序不正确)可能会导致死锁。当障碍物存在时,正确的OpenMP程序永远不会死锁

    critical
    是一种同步结构,与
    master
    atomic
    和其他结构一起使用。同步构造用于防止竞争条件,并在执行过程中带来秩序

    • critical
      通过防止所谓争用组中的线程之间同时执行代码来防止争用情况。这意味着来自all并行区域的all线程遇到类似命名的关键结构时会被序列化
    • atomic
      通常通过使用特殊的汇编指令,将某些简单的内存操作转换为原子操作。原子作为一个单一的不易破碎的单元一次完成。例如,一个线程从某个位置读取的原子,与另一个线程对同一位置的原子写入同时发生,将要么返回旧值,要么返回更新值,但决不会返回新旧值中位的某种中间混合
    • master
      仅为主线程(ID为0的线程)选择一块代码执行。与
      单个
      不同,构造末尾没有隐含的障碍,也不要求所有线程都必须遇到
      构造。