OpenMPはC++ 11の最小単位をサポートしていますか? OpenMPに移植性のある方法がない場合:x86またはamd64機能を使用して行う方法がありますか?OpenMPを使用したx86上の最小原子数
OpenMPの仕様では、C++では何も見つかりませんでしたが、Fortranバージョンではサポートされているようです。詳細はv3.1の2.8.5を参照してください。 、< <、または>> |、/、&、^、 - C++の場合、それは
binopは+、*、の一つである述べています。
が、Fortranのためにそれは
intrinsic_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]);
}
}
:私は、次の操作を実行するミューテックスない方法を探しています。これが原子的な最小限のアプローチよりも大幅に優れている状況があることを私は知っています。しかし、私の状況ではそうではないことも知っています。
EDIT:私の場合は少し速くなる1つのオプションは、
int x = ...;
int y = ...;
while(y < val[x])
val[x] = y;
であるが、それは何のアトミック操作ではありません。
すべての新しいGPUにはこの機能があり、CPU上でこの機能が不足しています。 (OpenCLの場合はatom_minを参照してください。)
このC++ 98またはC++ 11ですか? – user1071136
C++ 11の回答はOKです –
ところで、なぜあなたのケースで原子分が速いのですか?私はreduce-minがパフォーマンスを向上させない同様の問題を抱えていました。 – user1071136