2016-04-14 18 views
0

コードを並列化しようとしていますが、マップ内の挿入を並列にディスパッチするという問題を解決しました。しかし、プログラムは私に私がマップサイズの条件付きチェックに関連すると思うメモリエラーを与える。概念的なエラーがありますか、その部分も同期することは可能ですか?条件文を使用したOpenMP競合条件

if (PERF_ROWS == MAX_ROWS) 
{ 
    int array_dist[PERF_ROWS]; 

    #pragma omp declare reduction (merge : std::multimap<float, int> : omp_out.insert(omp_in.begin(),omp_in.end())) 

    #pragma omp parallel for schedule(dynamic) reduction(merge: ranking_map) private(array_dist) 
    for (int i = 0; i < MAX_COLUMNS; i++) 
    { 
     if (i % PERF_CLMN == 1) continue; 

     for (int j = 0; j < PERF_ROWS; j++) 
     { 
      array_dist[j] = abs(input[j] - input_matrix[j][i]); 
     } 

     float av = mean(PERF_ROWS, array_dist); 

     float score = score_func(av); 

     //cout<<score<<" "<<av<<endl; 

     //#pragma omp critical(rank_func) 
     //rank_function(score, i); 

     multimap<float,int>::iterator it = ranking_map.begin(); 

     if (ranking_map.size() < NUM_RES) 
     { 
      ranking_map.insert({score, i}); 
     } 

     else if (score > it -> first) 
     { 
      ranking_map.erase(it); 
      ranking_map.insert({score, i}); 
     } 
    } 
+0

OpenMPを無効にしてコードを試したことがありますか、または1つのスレッドを使用しましたか? – user0815

+0

はい、動作しますが、問題はopenmpでパフォーマンスが低下することです。私はマップ内の挿入をパラレルにディスパッチするという問題を解決しましたが、条件付き部分を並列化するために何をすべきか分かりませんし、コードをボトルネックにすることは避けています。 – CIVI89

+0

あなたが達成しようとしているものが分からないと、それを伝えるのは難しいです。しかし、 'ranking_map'の操作は、各スレッドがプライベートコピーを使用するので安全です。それに応じて、複数のスレッドで実行するために 'NUM_RES'などの変数を変更しましたか? 'NUM_RES'はどのように初期化されていますか? – user0815

答えて

0

あなた自身のコンバイナを定義してください。 はinsertwhateverという関数を作成し、このような何かを書く:

void insertwhatever(std::multimap<float, int>& a, std::multimap<float, int>&b) 
    { 
    for(auto iterb : b) 
    { 
     if(a.size() < NUM_RES) 
     { 
     a.insert(iterb); 
     } 
     else if(....) 
     { 
     (dont know what you want to do here) 
     } 
    } 
    } 

その後、私は完全にわからないが、私は、これは動作するはずだと思う

#pragma omp declare reduction (merge : std::multimap<float, int> : insertwhatever(omp_out,omp_in)) 

の減少を変更します。それでも私は実際に何をしようとしているのかは分かりません。

+0

OKこれを行うには、この部分を平行にする。地図に値を挿入するだけではなく、地図の固定サイズを維持して、注文した値を多く維持することを避けたいと思います。これは理由は他の理由です... – CIVI89

+0

しかし、私は2つの値、スコアと私は、グローバルなマップを挿入したい – CIVI89