Solaris Studio ISO C コンパイラには、指定されたループのスケジューリングを戦略的に制御するために、taskloop プラグマと同時に使用するいくつかのプラグマが用意されています。このプラグマの構文を次に示します。
#pragma MP taskloop schedtype (スケジューリング型)
このプラグマによって、並列化されたループをスケジュールするためのスケジューリング型を指定することができます。スケジューリング型には、次のいずれかを指定できます。
static
static スケジューリングでは、ループのすべての繰り返しが、そのループを処理するすべてのプロセッサに均等に配分されます。次の例を考えてみましょう。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(static) for (i=0; i<1000; i++) { ... } |
前述の例では、4 個のプロセッサが、ループの繰り返しを 250 ずつ処理します。
self [(chunk_size)]
self スケジューリングでは、ループのすべての繰り返しが処理されるまで、固定された回数の繰り返しチャンクサイズを、そのループを処理するそれぞれのプロセッサで処理します。オプションの chunk_size には、使用するチャンクサイズを指定します。chunk_size は、正の整定数か、もしくは整数型の変数でなければいけません。変数の chunk_size が指定された場合は、そのループを開始する前に、その変数が正の整数値であるかどうかが評価されます。最小チャンクサイズが指定されていない場合、もしくは、この値が正でない場合、チャンクサイズはコンパイラによって決められます。次の例を考えてみましょう。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(self(120)) for (i=0; i<1000; i++) { ... } |
前述の例では、ループを処理するそれぞれのプロセッサに割り当てられる繰り返し数は、割り当て順に解釈すると次のようになります。
120、120、120、120、120、120、120、120、40。
gss [(min_chunk_size)]
guided self スケジューリングでは、ループのすべての繰り返しが処理されるまで、可変数の繰り返し (「最小チャンクサイズ」) を、そのループを処理するそれぞれのプロセッサで処理します。オプションの min_chunk_size を指定すると、可変なチャンクサイズが最低でも min_chunk_size になるように設定されます。min_chunk_size は、正の整定数か、もしくは整数型の変数でなければいけません。変数の min_chunk_size が指定された場合は、そのループを開始する前に、その変数が正の整数値であるかどうかが評価されます。最小チャンクサイズが指定されていない場合、もしくは、この値が正でない場合、チャンクサイズはコンパイラによって決められます。次の例を考えてみましょう。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(gss(10)) for (i=0; i<1000; i++) { ... } |
前述の例では、ループを処理するそれぞれのプロセッサに割り当てられる繰り返し数は、割り当て順に解釈すると次のようになります。
250、188、141、106、79、59、45、33、25、19、14、11、10、10、10。
factoring [(min_chunk_size)]
factoring スケジューリングでは、ループのすべての繰り返しが処理されるまで、可変数の繰り返し (「最小チャンクサイズ」) を、そのループを処理するそれぞれのプロセッサで処理します。オプションの min_chunk_size を指定すると、可変なチャンクサイズが最低でも min_chunk_size になるように設定されます。min_chunk_size は、正の整定数か、もしくは整数型の変数でなければいけません。変数の min_chunk_size が指定された場合は、そのループを開始する前に、その変数が正の整数値であるかどうかが評価されます。最小チャンクサイズが指定されていない場合、もしくは、この値が正でない場合、チャンクサイズはコンパイラによって決められます。次の例を考えてみましょう。
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(factoring(10)) for (i=0; i<1000; i++) { ... } |
前述の例では、ループを処理するそれぞれのプロセッサに割り当てられる繰り返し数は、割り当て順に解釈すると次のようになります。
125、125、125、125、62、62、62、62、32、32、32、32、16、16、16、16、10、10、10、10、10、10