2017-07-26 7 views
0

OpenMPと並列プログラミングを初めて勉強して試してみます。私は30要素の単純なforループを持ち、各要素はprocess()関数で処理されています。しかし、私は意図的に1つの要素(5th要素)を遅らせました。ここでは、コードです:OpenMP:すべてのスレッドが1つのスレッドで遅れて停止する

std::mutex mu; 
void print_msg(const char* msg, size_t n) 
{ 
    mu.lock(); 
    cout << msg << n << endl; 
    mu.unlock(); 
} 

void process(size_t i) 
{ 
    print_msg("Processing ... ", i); 

    if (i == 5) // the 5th element is big, so takes time 
     for(int u=0; u<std::numeric_limits<int>::max(); u++); 
} 

int main(int argc, char *argv[]) 
{ 
    #pragma omp parallel 
    { 
     #pragma omp for ordered schedule(dynamic, 3) 
     for(size_t i=0; i<30; i++) 
     { 
      process(i); 
     } 
    } 

    return 0; 
} 

私が期待したもの:

5th要素(および他の2要素)を割り当てられているスレッドが遅れてしまいますが、残りは並行して継続します。

結果:ここで

が言及した遅延位置との結果である...

Processing ... 1 
Processing ... 0 
Processing ... 4 
Processing ... 2 
Processing ... 5 
Processing ... 3 
Processing ... 6 
Processing ... 7 
Processing ... 8 
[[ Here the execution paused for a couple of seconds and then 
the below printed out all at once ]] 
Processing ... 9 
Processing ... 11 
Processing ... 12 
Processing ... 13 
Processing ... 10 
Processing ... 14 
Processing ... 15 
Processing ... 16 
Processing ... 17 
Processing ... 21 
Processing ... 20 
Processing ... 19 
Processing ... 18 
Processing ... 22 
Processing ... 24 
Processing ... 23 
Processing ... 26 
Processing ... 27 
Processing ... 25 
Processing ... 29 
Processing ... 28 

は、だから、5th元素を含有したスレッドだけでなく停止していることに私には思われるが、すべての他のスレッドも停止しました。それは正常な行動ですか?

答えて

2

まず、あなたのスレッドは「スリープ状態」ではなく、いわゆる「ビジー待機」を実行します。これは長い遅延にはあまり大きくありません(例:What are trade offs for “busy wait” vs “sleep”?を参照)。

しかし、ここで本当の問題は、基本的には、スレッドが3のグループで実行され、次のグループが(前回の1の結果を待つことになることを、意味

#pragma omp for ordered schedule(dynamic, 3) 

の使用のようです特定のグループは順番に実行されます)。 dynamicの場合、動作はいくらかランダム化されています。staticグループ0,1,2,3,4,5の後に一時停止が表示されることが予想されます。ここでは動的では3番目のグループがまだ実行するように見えますが、次のグループはスレッド5が終了するのを待つ。

は、パラレルので、他のスレッドがスレッドの実行によってブロックされることはありません5.

+0

おかげですべてのスレッドを実行できるようにする必要がありomp orderedラインを、削除するようにしてください。それが助けになりました。 :) –

関連する問題