0

私は、OpenMPに新たなんだと に時間を費やすことなく、並列用インナー行う方法を私はこのような状況に直面しています:のための内部のために - 作成スレッド

私は内側のループ並列にしたい
int someArray[ARRAY_SIZE]; 

//outer loop 
for(int i = 0; i < 100; ++i) { 

    //inner loop 
    for(int j = 0; i < ARRAY_SIZE; ++i) { 
     //calculaations in someArray (every cell can be calculated separately) 
    } 

    //some code that needs to be run by only one thread - for example sorting someArray 
} 

、私が試みたアイデア(以下のコード)は効果的ではありません(単一のスレッドは複数のスレッドより高速に処理できます)。私は、ここで多くの時間をウエストの上に複数のスレッドを作成すると思う。

私の悪いソリューション:

int someArray[ARRAY_SIZE]; 

//outer loop 
for(int i = 0; i < 100; ++i) { 

    #pragma omp parallel num_threads(THREADS_NUMBER) shared(someArray) 
    { 
     //inner loop 
     #pragma omp for 
     for(int j = 0; i < ARRAY_SIZE; ++i) { 
      //calculaations in someArray (every cell can be calculated separately) 
     } 
    } 

    //some code that needs to be run by only one thread - for example sorting someArray 
} 

あなたは、このタスクを最適化する方法任意のアイデアを持っていますか?

答えて

0

ループ用に2倍の値を設定している場合は、ほとんどの場合、外側のループを並列化することがほとんどです。あなたの場合:

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

    for(int j = 0; i < ARRAY_SIZE; ++i) { 
     //calculations in someArray (every cell can be calculated separately) 
    } 

    //some code that needs to be run by only one thread - for example sorting someArray 
} 

4つのCPUがある場合、これは4つのCPUにわたって100回の反復を25回に分割します。これは100回の反復ごとにARRAY_SIZEをCPUに分割するため(つまり、オーバーヘッドが100倍になるため)、結局あなたのコードよりもはるかに効率的です。

+0

しかし、サイクルの終わりに配列の並べ替えがあるので(スケーリングされたリソース)、外側のループは1つのスレッド内にある必要があります。 ARRAY_SIZEは約66億です。だから私が望むのは、内部ループ(独立したセルが独立して再計算される)だけを並列化することです。 –

+0

私はバリアを入れてから偽のマスター - > if(0 = thread_number) でもその不正なステートメントを試みました。 –

+0

私は何かを達成しようとしていますか?あなたのサンプルを精巧にして、パフォーマンスの問題を見せてもらえますか? – GaspardP

関連する問題