MP C コンパイラには、指定されたループのスケジューリングを戦略的に制御するために、taskloop プラグマと同時に使用するいくつかのプラグマが用意されています。このプラグマの構文を以下に示します。
#pragma MP taskloop schedtype ( <スケジューリング型>)
このプラグマによって、並列化されたループをスケジュールするための <スケジューリング型> を指定することができます。<スケジューリング型> には、以下のいずれかを指定できます。
static
静的スケジューリングでは、ループ内のすべての繰り返しが、そのループを処理するすべての CPU に均等に配分されます。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(static) for (i=0; i<1000; i++) { ... }
上述の例では、4 個の CPU が、ループの繰り返しを 250 ずつ処理します。
self [<チャンクサイズ>]
自己スケジューリングでは、ループのすべての繰り返しが処理されるまで、固定された回数の繰り返し <チャンクサイズ> を、そのループを処理するそれぞれの CPU で処理します。<チャンクサイズ> は省略可能で、使用するチャンクサイズを指定します。 <チャンクサイズ> は、正の整数の定数か、もしくは整数型の変数でなければなりません。変数が指定された場合、<チャンクサイズ> はそのループを開始する前に、その変数が正の整数を保持していなければなりません。このオプションの引数が指定されていない場合、もしくは、この値が正の整数ではない場合、チャンクサイズはコンパイラによって決められます。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(self(120)) for (i=0; i<1000; i++) { ... }
上述の例では、ループを処理するそれぞれの CPU に割り当てられる繰り返し数は、割り当て順に以下のようになります。
120, 120, 120, 120, 120, 120, 120, 120, 40.
gss [<最小チャンクサイズ>]
ガイド付き自己スケジューリング (GSS) では、ループのすべての繰り返しが処理されるまで、可変な繰り返し回数 (チャンクサイズ) を、そのループを処理するそれぞれの CPU で処理します。オプションの <最小チャンクサイズ> 引数によって、可変チャンクサイズがそれぞれ最低でも <最小チャンクサイズ> になるように指示されます。 <最小チャンクサイズ> は、正の整数の定数か、もしくは整数型の変数でなければなりません。変数が指定された場合、<最小チャンクサイズ> はそのループを開始する前に、その変数が正の整数を保持していなければなりません。このオプションの引数が指定されていない場合、もしくは、この値が正の整数ではない場合には、チャンクサイズはコンパイラによって決められます。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(gss(10)) for (i=0; i<1000; i++) { ... }
上述の例では、ループを処理するそれぞれの CPU に割り当てられる繰り返し数は、割り当て順に以下のようになります。
250, 188, 141, 106, 79, 59, 45, 33, 25, 19, 14, 11, 10, 10, 10.
factoring [<最小チャンクサイズ>]
ファクタリング・スケジューリングでは、ループのすべての繰り返しが処理されるまで、可変数の繰り返し (チャンクサイズ) を、そのループを処理するそれぞれの CPU で処理します。オプションの <最小チャンクサイズ> 引数によって、可変チャンクサイズが、それぞれ最低でも <最小チャンクサイズ> になるように指示されます。<最小チャンクサイズ> は、正の整数の定数か、もしくは整数型の変数でなければなりません。変数が指定された場合、<最小チャンクサイズ> はそのループを開始する前に、その変数が正の整数を保持していなければなりません。このオプションの引数が指定されていない場合、もしくは、この値が正の整数ではない場合には、チャンクサイズはコンパイラによって決められます。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(factoring(10)) for (i=0; i<1000; i++) { ... }
上述の例では、ループを処理するそれぞれの CPU に割り当てられる繰り返し数は、割り当て順に解釈すると以下のようになります。
125, 125, 125, 125, 62, 62, 62, 62, 32, 32, 32, 32, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10.