OpenMP 中没有原子最小操作,英特尔 MIC 的指令集中也没有内在的。
#pragmma omp critial
在性能上是非常不足的。
我想知道英特尔 MIC 是否有高性能实现atomic minimal
。
OpenMP 中没有原子最小操作,英特尔 MIC 的指令集中也没有内在的。
#pragmma omp critial
在性能上是非常不足的。
我想知道英特尔 MIC 是否有高性能实现atomic minimal
。
根据OpenMP 4.0 规范(第 2.12.6 节),您可以通过使用构造代替来执行许多快速的原子最小操作(从而避免其锁的巨大开销)。#pragma omp atomic
#pragma omp critical
#pragma omp atomic
构造可能性概述让x
成为您的线程共享变量:
有了#pragma omp atomic read
你可以原子地让你的共享变量x
被读取:
v = x;
你#pragma omp atomic write
可以原子地为你的共享变量分配一个新值x
;新值表达式 ( expr
) 必须是x
独立的:
x = expr;
您#pragma omp atomic update
可以自动更新您的共享变量x
;实际上,您只能将新值分配为独立表达式和binop
之间的二元运算 ( ) :x
x
x++;
x--;
++x;
--x;
x binop= expr;
x = x binop expr;
x = expr binop x;
有了#pragma omp atomic capture
你,你可以原子地让你的共享变量x
被读取和更新(按照你想要的顺序);实际上capture
是read
andupdate
结构的组合:
您有update
then的简短形式read
:
v = ++x;
v = --x;
v = x binop= expr;
v = x = x binop expr;
v = x = expr binop x;
以及它们的结构化块类似物:
{--x; v = x;}
{x--; v = x;}
{++x; v = x;}
{x++; v = x;}
{x binop= expr; v = x;}
{x = x binop expr; v = x;}
{x = expr binop x; v = x;}
read
然后你有一些简短的形式update
:
v = x++;
v = x--;
同样是他们的结构化块类似物:
{v = x; x++;}
{v = x; ++x;}
{v = x; x--;}
{v = x; --x;}
最后你还有额外的read
then update
,它只存在于结构化块形式中:
{v = x; x binop= expr;}
{v = x; x = x binop expr;}
{v = x; x = expr binop x;}
{v = x; x = expr;}
在前面的表达式中:
x
并且v
都是标量类型的左值表达式;expr
是标量类型的表达式;binop
是+
, *
, -
, /
, &
, ^
, |
,<<
或之一>>
;binop
, binop=
,++
和--
不是重载的运算符。