schedule(runtime)
C++でOpenMPのディレクティブを使用する方法を理解しようとしています。いくつかの調査の後、私は見つけましOMP_SCHEDULE(1)
たOMP_SCHEDULE(2)
。
OMP_SCHEDULE
バリバールを一定の値に設定する必要があると結論付けました。ただし、その方法がわかりません。また、正しく行う方法を説明するC++の実用的な例は見つかりませんでした。
誰かが変数を設定してC++の実用的な例を提供する方法を教えてもらえますか?
schedule(runtime)
C++でOpenMPのディレクティブを使用する方法を理解しようとしています。いくつかの調査の後、私は見つけましOMP_SCHEDULE(1)
たOMP_SCHEDULE(2)
。
OMP_SCHEDULE
バリバールを一定の値に設定する必要があると結論付けました。ただし、その方法がわかりません。また、正しく行う方法を説明するC++の実用的な例は見つかりませんでした。
誰かが変数を設定してC++の実用的な例を提供する方法を教えてもらえますか?
OMP スケジューリングには 4 つのタイプがあります。それらは、静的、動的、ランタイム、およびガイド付きです。それぞれのスケジューリングには利点があります。スケジューリングは、スレッド間の負荷分散を改善するために存在します。
静的および動的スケジューリングの例をいくつか挙げます。ガイドも同様です。
schedule(runtime) 句は、環境変数を使用してスケジュールを設定するように指示します。環境変数は、他のスケジュール タイプに設定できます。で設定できます
setenv OMP_SCHEDULE “dynamic,5”
静的スケジューリング
静的スケジューリングは、コンパイル時に各スレッドが多かれ少なかれ同じ量の作業を行うことがわかっている場合に使用されます。
たとえば、次のコードは OMP を使用して並列化できます。4 つのスレッドのみを使用すると仮定します。
デフォルトの静的スケジューリングを使用し、プラグマを外側の for ループに配置する場合、各スレッドは外側のループ ( i ) の作業の 25% を実行し、内側のループ ( j )の作業と同等の量を実行します。 したがって、実行される作業の合計量は各スレッドで同じです。したがって、デフォルトの静的スケジューリングをそのまま使用して、最適な負荷分散を実現できます。
float A[100][100];
for(int i = 0; i < 100; i++)
{
for(int j = 0; j < 100; j++)
{
A[i][j] = 1.0f;
}
}
動的スケジューリング
動的スケジューリングは、静的スケジューリングを使用すると各スレッドが同じ量の作業を実行しないことがわかっている場合に使用されます。
一方、この次のコードでは、
float A[100][100];
for(int i = 0; i < 100; i++)
{
for(int j = 0; j < i; j++)
{
A[i][j] = 1.0f;
}
}
内側のループ変数jはiに依存します。デフォルトの静的スケジューリングを使用する場合、外側のループ ( i ) の作業は 4 つのスレッド間で均等に分割される可能性がありますが、一部のスレッドでは内側のループ ( j ) の作業が大きくなります。これは、各スレッドが静的スケジューリングで同じ量の作業を行うわけではないことを意味します。静的スケジューリングでは、スレッド間の最適な負荷分散が行われません。したがって、動的スケジューリングに切り替えます (スケジューリングは実行時に行われます)。このようにして、コードが最適な負荷分散を実現するようにすることができます。
注: スケジューリング用に chunk_size を指定することもできます。ループのサイズによって異なります。