0

OpenMP 中没有原子最小操作,英特尔 MIC 的指令集中也没有内在的。

#pragmma omp critial在性能上是非常不足的。

我想知道英特尔 MIC 是否有高性能实现atomic minimal

4

1 回答 1

3

根据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被读取和更新(按照你想要的顺序);实际上capturereadandupdate结构的组合:

    • 您有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=,++--不是重载的运算符。
于 2013-08-01T15:52:18.223 回答