Solaris Studio ISO C 编译器支持多种 pragma,这些 pragma 可与 taskloop pragma 配合使用,以控制给定循环的循环调度策略。此 pragma 的语法是:
#pragma MP taskloop schedtype (scheduling_type)
此 pragma 可用来指定要用来调度并行化循环的特定 scheduling_type。Scheduling_type 可为以下类型之一:
static
在 static 调度中,循环的所有迭代均匀地分布在参与处理的所有处理器中。请看以下示例:
#pragma MP taskloop maxcpus(4) #pragma MP taskloop schedtype(static) for (i=0; i<1000; i++) { ... } |
在以上示例中,四个处理器中的每个处理器将处理循环的 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