OpenMP中没有原子最小操作,英特尔MIC的指令集也没有内在操作。
#pragmma omp critial
表现非常不足。
我想知道英特尔MIC是否有atomic minimal
的高性能工具。
答案 0 :(得分:3)
根据OpenMP 4.0 Specifications(第2.12.6节),有许多快速原子最小化操作,您可以使用#pragma omp atomic
构造代替{ {1}}(从而避免锁定的巨大开销)。
#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
构造的组合:
您有update
的简短表格,然后是update
:
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
,它只存在于结构化块表单中:
update
在前面的表达式中:
{v = x; x binop= expr;}
{v = x; x = x binop expr;}
{v = x; x = expr binop x;}
{v = x; x = expr;}
和x
都是标量类型的l-value expressions; v
是一个标量类型的表达式; expr
是binop
,+
,*
,-
,/
,&
,{{1}之一}},^
或|
; <<
,>>
,binop
和binop=
不是重载运算符。