omp_set_num_threads(20);
20件のスレッド(利用可能な40個のスレッドを持っている)を使用するのOpenMPを伝えます。 (まだそうでないかもしれない最良の方法はなく)forループの主のための
#pragma omp parallel for shared(x,y,z)
、およびホテルトップ介してCPU使用率を監視します。
私は、ディレクティブが含まれている私のコードを実行します。 forループが実行しなければならない50個の "タスク"があり、それぞれかなりの時間がかかります。私がhtopを通して観察していることは、タスクが完了した後、スレッド数が減少することです。具体的には、20スレッドを使用すると、20スレッド以下のタスクが残ってからスレッドが「フリー」になるまで、edは2000%のCPU使用率を見ています。しかし、私が見ているのは最初の2000%であり、n個のタスクが完了した後、私は2000% - (n * 100%)のパフォーマンスを見ます。したがって、タスクが完了すると、新しいタスクを実行するのではなく、スレッドがシャットダウンするように見えます。
これは予期されるのか、それとも奇妙なのでしょうか?
20タスク後にCPU使用率がゼロになり、並列ループは終了しませんか? –
いいえ、終了します。私の質問は、処理が必要なタスクがまだ存在するときにスレッドが死んでしまうように見える理由です。 – user1938803
50を20で割った値が2.5で、ほとんどのコンパイラでのデフォルトのループスケジューリングが 'static'なので、スレッドの半分は2回の反復を処理し、残りの半分は3回の反復を処理します。 –