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を参照してください。)