交換

2016-12-12 21 views
-3

私はここでの問題は、私のコードは、のA+=B部分に多くの計算を行っているということである。この交換

#pragma omp parallel shared(vector1) private(i,j) 
{ 
#pragma omp for schedule(dynamic) 
    for (i = 0; i < vector1.size(); ++i){ 

     //some code here 

     for (j = 0; j < vector1.size(); ++j){ 

      //some other code goes here 
     #pragma omp critical 
     A+=B; 
     } 
    C +=A; 
    } 
} 

のように動作し、ネストされたループ上のOpenMPを使用していますコード。したがって、それを重要なものにすることによって、私はスピードアップを達成していません。 (実際には、プログラムの実行に時間がかかり、それが順番に書かれているので、オーバーヘッドがあるようです。

私はこれはしかし、実行時間をスピードアップし、それは私がAの同じ結果を得ていないおりますのでcritical句のような競合状態の世話をしていないようだ

#pragma omp reduction private(B) reduction(+:A) 
    A+=B 

を使用してみました

これに代わる方法はありますか?

+3

あなたの擬似コードだけで、私たちがあなたを助けることができるものがほとんどないので、[最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 。 – Gilles

+0

あなたは正しいかもしれないが、その間にreduce()は競争条件を正しく処理しないだろうか? –

+1

もちろん、それはこのように振る舞います。「批判的」と「削減」は何をしていますか?あなたは、プログラムの意味を完全に変えるアイデアを無作為に適用しているようです。 'A'と' B'は定義されていないので、このスニペットが何を意味するのかを推測することは全く不可能です。 「競合状態を世話しているプラ​​グマ」というものはありません。これは手渡されているため、コードが表示されないように構造化する責任があります。私。何もそれを世話しない、彼らは現れないことが保証されています。 – luk32

答えて

1

Vector3クラスをスレッドセーフにするか、std::atomic<Vector3>で使用するために操作を書き直したい場合を除き、どちらもパフォーマンスの問題を抱えています(ただし、クリティカルセクションを使用するほど深刻ではありません)これはあなたの「いくつかのコード」のコメントの中に読み取るためAにアクセスしないことを前提としていることを

#pragma omp parallel // no need to declare variables declared outside/inside as shared/private 
{ 

    Vector3 A{}, LocalC{}; // both thread-private 

    #pragma omp for schedule(dynamic) 
    for (i = 0; i < vector1.size(); ++i){ 

     //some code here 

     for (j = 0; j < vector1.size(); ++j){ 

      //some other code goes here 

      A += B; // does not need a barrier 
     } 
     LocalC += A; // does not need a barrier 
    } 

    #pragma omp critical 
    C += LocalC; 
} 

NBができますが、あなたは今までreductionを使用して考えていない、とにかく必要がある場合:、あなたが実際にbehaviour of OpenMP reductionを模倣することができます句。

+0

はい外側のループでAが読み込まれています(私は今すぐコードを編集しました)。削減節は使用できません。 –

+0

@ j.doe私はあなたの質問にそれが表示されません。更新された値を確認してもよろしいですか?マルチスレッドの状況では 'A'を読み込み、他のスレッドは問題のレシピのように聞こえます。本当にそうなら、あなたはそれを「揮発性」なものにしたいかもしれませんが、なぜそれをしたいのかについての詳細を聞きたいのですが。 –

+0

私はちょうど質問 'c + = A'を更新しました。 'C + = A'の前に' #pragma omp critical 'もあります。 Cの計算集約的な命令を実行していないので、Aのクリティカルな節のみが実行時間を遅くするようです。 –