8

OpenMPはC++11のアトミック最小値をサポートしていますか?OpenMPに移植可能な方法がない場合:x86またはamd64機能を使用してそれを行う方法はありますか?

OpenMP仕様では、C ++には何も見つかりませんでしたが、Fortranバージョンはそれをサポートしているようです。詳細については、v3.1の2.8.5を参照してください。C ++の場合、次のように記述されます

binopは、+、*、-、/、&、^、|、<<、または>>のいずれかです。

しかし、Fortranの場合は次のように述べています

internal_procedure_nameは、MAX、MIN、IAND、IOR、またはIEORのいずれかです。

より多くのコンテキストに興味がある場合:私は次のことを行うミューテックスフリーの方法を探しています:

vector<omp_lock_t>lock;
vector<int>val;

#pragma omp parallel
{
  // ...
  int x = ...;
  int y = ...;
  if(y < val[x]){
    omp_set_lock(&lock[x]);
    if(y < val[x])
      val[x] = y;
    omp_unset_lock(&lock[x]);
  }
}

削減アルゴリズムを使用して最小値を計算できることを私は知っています。これがアトミックミニマムアプローチを大幅に上回っている状況があることを私は知っています。しかし、私の状況ではそうではないことも知っています。

編集:私の場合、少し速いオプションの1つは

  int x = ...;
  int y = ...;
  while(y < val[x])
    val[x] = y;

しかし、それは不可分操作ではありません。

すべての新しいGPUにはこの機能があり、CPUにはありません。(OpenCLについてはatom_minを参照してください。)

4

1 に答える 1

5

C++ の OpenMP 仕様では、アトミック ミニマムがサポートされていません。C++11 もそうではありません。

あなたのアルゴリズムでxは、スレッドに関係なく、有効なインデックスを計算できると想定しています。各スレッドが独自のval配列を使用し、最後に最終的な調整を行うようにアルゴリズムを変更することをお勧めします。これは、インデックスによって並列化することもできます。これにより、ロックとアトミックが完全に回避され、スレッドごとにデータを分離できるという利点が得られます。つまり、偽のキャッシュ共有が発生する可能性がなくなります。言い換えれば、それはより速いはずです。

于 2012-09-04T08:19:38.203 に答える