Parallel processing omp临界和omp单一之间的差异
我试图理解OpenMP中Parallel processing omp临界和omp单一之间的差异,parallel-processing,openmp,Parallel Processing,Openmp,我试图理解OpenMP中#pragma omp critical和#pragma omp single之间的确切区别: Microsoft对这些的定义如下: Single:用于指定应在上执行的代码段 单线程,不一定是主线程 临界:指定一次只能在一个线程上执行代码 时间 这意味着在这两种情况下,代码的确切部分将由一个线程执行,而其他线程将不会进入该部分。例如,如果我们打印某些内容,我们将在屏幕上看到一次结果,对吗 有什么区别吗?看来关键的是要注意执行时间,但不是单一的!但我看不出在实践中有什么
#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
只挑选一个线程执行的代码块,通常是第一个遇到它的线程(一个实现细节)——只有一个线程得到工作<代码>单个在很大程度上等同于只包含单个部分的部分
nowait
子句来关闭该屏障,但该标准不要求此类行为,对于某些OpenMP运行时,尽管存在nowait
,屏障可能仍然存在。因此,工作共享结构的顺序不正确(即在某些线程中顺序不正确)可能会导致死锁。当障碍物存在时,正确的OpenMP程序永远不会死锁
critical
是一种同步结构,与master
、atomic
和其他结构一起使用。同步构造用于防止竞争条件,并在执行过程中带来秩序
通过防止所谓争用组中的线程之间同时执行代码来防止争用情况。这意味着来自all并行区域的all线程遇到类似命名的关键结构时会被序列化李>critical
通常通过使用特殊的汇编指令,将某些简单的内存操作转换为原子操作。原子作为一个单一的不易破碎的单元一次完成。例如,一个线程从某个位置读取的原子,与另一个线程对同一位置的原子写入同时发生,将要么返回旧值,要么返回更新值,但决不会返回新旧值中位的某种中间混合李>atomic
仅为主线程(ID为0的线程)选择一块代码执行。与master
不同,构造末尾没有隐含的障碍,也不要求所有线程都必须遇到单个
构造。主