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之间的二元运算 ( ) :xx
x++;
x--;
++x;
--x;
x binop= expr;
x = x binop expr;
x = expr binop x;
有了#pragma omp atomic capture你,你可以原子地让你的共享变量x被读取和更新(按照你想要的顺序);实际上capture是readandupdate结构的组合:
您有updatethen的简短形式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;}
最后你还有额外的readthen 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=,++和--不是重载的运算符。