2017-05-14 17 views
0

これを行う際の危険の解決策は何ですか?OpenMPを使用したスレッドセーフカウンタ

#include <iostream> 
#include <unistd.h> 
#include <cstdlib> 
#include <ctime> 

int main(){ 

    int k = 0; 
    #pragma omp parallel for 
    for(int i = 0; i < 100000; i++){ 

     if (i % 2){ /** Conditional based on i **/ 
      #pragma omp atomic 
      k++; 

      usleep(1000 * ((float)std::rand()/RAND_MAX)); 

      #pragma omp task 
      std::cout << k << std::endl; /** Some sort of task **/ 
     } 

    } 
    return 0; 
} 

私はすべてkが一意である必要があります。これを行う良い方法は何でしょうか?

編集this questionは私が共有変数に基づいてタスクを起動したい。特に集計

を指し、どのよう

注意してください。私は競争状態に陥る危険があります。

スレッド2が完了し、条件付きでtrueを評価し、スレッド1がすべてのタスクを生成する前にkをインクリメントするとします。

編集編集

強制的に競合状態にしました。睡眠なしでは明らかではなかった。実際には問題があります。どのように私はこれを克服することができます。

は、ここでは簡単なソリューションです:

...  
#pragma omp atomic 
k++; 
int c = k; 
... 

が、私は保証したいと思います。

接線。なぜこの実装は機能しませんか?関数の最後に

... 
int c; 
#pragma omp crtical 
{ 
    k++; 
    c = k; 
} 
... 

std::cout << k;、私はすぐに私の質問に答えることを憎むが、私は、この特定のインスタンスのための解決策を見つけた予想50000出力proof

+0

[OpenMpで共有変数を管理する方法](http://stackoverflow.com/questions/14569954/how-to-manage-shared-variable -in-openmp) – Igor

+0

@Igor回答のハイライト表示の相違点を修正しました –

+0

'c ==(i + 1)/ 2'の' 'k == 50000'のように、 。しかし、ループ中に 'std :: cout << c'を実行し、parllelループの外側のクリティカルセクション内で' k'だけ読み込むべきです。 – Zulan

答えて

1

よりも一貫して小さいです。

ユースケースは、ちょうどこのような問題のためである"atomic capture"プラグマ

があるのOpenMP 3.1の通り。結果コード:

#include <iostream> 
#include <unistd.h> 
#include <cstdlib> 
#include <ctime> 

int main(){ 

    int k = 0; 
    #pragma omp parallel for 
    for(int i = 0; i < 100000; i++){ 

     if (i % 2){ /** Conditional based on i **/ 
      int c; 
      #pragma omp atomic capture 
      { 
       c = k; 
       k++; 
      } 

      usleep(1000 * ((float)std::rand()/RAND_MAX)); 

      #pragma omp task 
      std::cout << c << std::endl; /** Some sort of task **/ 
     } 
    } 
    std::cout << k << std::endl; /** Some sort of task **/ 
    std::cout.flush(); 
    return 0; 
} 

誰かがアイデア/コードアーチに貢献したい場合、私は開いているこの問題を残します。これらの問題を回避するための提案、#pragma omp crticalが動作しなかった理由

+1

'原子キャプチャ'はあなたの場合に行うべき正しいことです。 – Zulan

関連する問題