2016-12-10 15 views
0

のために私は、OpenMPに新しいですし、私の仕事は、2つの異なる可能性を使用して、以下のコードを改善することである。のOpenMPがループ

// Size = 400, CHUNKSIZE = 100 and there are 4 threads 
#pragma omp parallel for schedule(static, CHUNK_SIZE) 
    for(int i=0; i<SIZE; i++){ 
     for(int k=0; k<i; k++){ 
      A[i][k] = 42*foo 
     } 
    } 

最初は私が仕事ので、静的から導かれるまでのスケジュールを変更します第2のループは不均衡であり、着実に成長している。 最初に、チャンクサイズは大きく開始し、反復間の負荷の不均衡をよりよく処理するために減少します。 大きいほど、2番目のループの作業が多くなります。 ダイナミックがガイドの代わりに良いかもしれない場合は、この時点ではわかりませんか?

2番目の可能性についてはわかりません。

+2

StackOverflowはタスクをダンプするサイトではありません。試したことを示し、特定の問題に絞り込む必要があります。また、空のループの実行について推論することはありません。 – Zulan

+0

また、コードに入力ミスや間隔がありません。質問をする前にこの投稿にもっと力を入れてください... – NoseKnowsAll

+0

私は自分の質問を編集しました。今はいいですか? –

答えて

1

ロードバランシングの問題があるというコードを見て、IMOはスケジュール(静的、1)でテストして、スレッド間のロードバランシングを最小限に抑えることができることを知っています。スケジュール(動的、1)と比較し、動的(ダイナミックな内部ロックメカニズムを使用)のオーバーヘッドがスレッド間の作業のバランスを取ることで得られる利益に圧倒されているかどうかを確認するよりも、

あなたは慎重にチェックすると、内側ループの作業は、三角形(N = SIZE)のように成長する:

*k/i 0 1 2 3 4 5 ... N-1 
* 0 - x x x x x ... x 
* 1 - - x x x x ... x 
* 2 - - - x x x ... x 
* 3 - - - - x x ... x 
* 4 - - - - - x ... x 
* 5 - - - - - - ... x 
* . - - - - - - ... x 
* . - - - - - - ... x 
*N-1 - - - - - - ... -  
* N - - - - - - ... - 

ですから、反復0パフォーマンスの反復をパフォーマンスのスレッドを保証するために、独自のディストリビューションを作ることができN- 1、そのスレッドがパフォーマンスを実行すると、繰り返し1が実行され、反復N-2が実行されます。この方法では、各反復スレッドがN - 1回の内部ループ反復を実行することを保証します。このような

何か:

int halfSIZE = SIZE >> 1; 

    #pragma omp for schedule (static,1) nowait 
    for(int i = 0; i < halfSIZE; i++) 
    { 
     for(int k=0; k<i; k++) 
      A[i][k] = 42*foo 
    } 

    #pragma omp for schedule (static,1)  
    for(int i = SIZE - 1; i >= halfSIZE; i--) 
    { 
      for(int k=0; k<i; k++) 
      A[i][k] = 42*foo 
    } 
+0

並列化を適用する前に2レベルのループを崩壊させるという考えはどうでしょうか?#pragma omp for collapse(2)? –

0

あなたは、単一のOMP並列に含まれるループのペアを持っている意味と仮定すると、これは仕事の不均衡を回避するための合理的な方法であってもよいです。それでも私はそれが大いに保証されているとは思わない。 スレッドの数に外側ループを置き、各スレッドによって設定された配列要素の数を厳密に調整するiループの反復回数を計算することができます。ターゲットにとって重要な場合は、これはNUMAのローカリティを維持するより効果的な方法です。

関連する問題