2012-09-04 11 views
7

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

+0

このC++ 98またはC++ 11ですか? – user1071136

+0

C++ 11の回答はOKです –

+0

ところで、なぜあなたのケースで原子分が速いのですか?私はreduce-minがパフォーマンスを向上させない同様の問題を抱えていました。 – user1071136

答えて

4

OpenMPのC++用の仕様では最小限の原子をサポートしていません。どちらもC++ 11ではありません。

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

関連する問題