C 编译器接受传统 pragma 来进行显式并行化。《C 用户指南》中有对这些内容的描述。与 Fortran 指令相同,这些只是建议值。
传统并行化 pragma 为:
表 B–5 将传统 C 并行化 Pragma 转换为 OpenMP
传统 C Pragma |
等效的 OpenMP Pragma |
---|---|
#pragma MP taskloop [clauses] |
#pragma omp parallel for [clauses] |
#pragma MP serial_loop |
无完全等效指令。可以使用 #pragma omp master loop |
#pragma MP serial_loop_nested |
无完全等效指令。可以使用 #pragma omp master loopnest |
taskloop pragma 可带有下列可选子句中的一个或多个子句。
表 B–6 taskloop 可选子句和等效的 OpenMP 子句
taskloop 子句 |
等效的 OpenMP parallel for 子句 |
---|---|
maxcpus(n) |
无完全等效指令。使用 num_threads(n) |
private(v1,v2,...) |
private(v1,v2,...) |
shared(v1,v2,...) |
shared(v1,v2,...) |
readonly(v1,v2,...) |
无完全等效指令。使用 firstprivate(v1,v2,...) 可以获得相同效果。 |
storeback(v1,v2,...) |
使用 lastprivate(v1,v2,...) 可以获得相同效果。 |
savelast |
无完全等效指令。使用 lastprivate(v1,v2,...) 可以获得相同效果。 |
reduction(v1,v2,...) |
reduction(operator:v1,v2,...)。必须提供约简操作符和变量列表。 |
schedtype(spec) |
schedule(spec)(请参见表 B–7) |
schedtype(spec) 子句接受下列调度规范。
表 B–7 SCHEDTYPE 调度和等效的 OpenMP schedule 子句
schedtype(spec) |
等效的 OpenMP schedule(spec) 子句 |
---|---|
SCHEDTYPE(STATIC) |
schedule(static) |
SCHEDTYPE(SELF(chunksize)) |
schedule(dynamic,chunksize) 注意: 缺省 chunksize 为 1。 |
SCHEDTYPE(FACTORING(m)) |
无完全等效指令。 |
SCHEDTYPE(GSS(m)) |
schedule(guided, m) 缺省 m 为 1。 |
OpenMP 作用域变量在并行构造内声明为 private。#pragma omp parallel for 指令中的 default(none) 子句会使编译器标记未显式确定作用域的变量。
由于没有 serial_loop 指令,因此混合使用自动和显式 OpenMP 并行化的效果可能会不同: 某些使用传统 C 指令不能自动并行化的循环可能会被自动并行化。
由于 OpenMP 提供了更丰富的并行操作模型,因此使用传统 C 指令来重新设计程序的并行操作策略,以利用这些功能,往往可能会获得更高的性能。