2.4.1结构化
为 指令标识指定的迭代的工作划分构造关联的循环的迭代并行要执行。 为 循环的迭代中已存在执行并行构造的团队将它绑定的线程分布。 为 构造的语法如下所示:
#pragma omp for [clause[[,] clause] ... ] new-line
for-loop
子句为下列之一:
(专用变量列表**)**
(firstprivate变量列表**)**
(lastprivate变量列表**)**
(减少运算符**:变量列表)**
排序
计划 (类型, chunk_size[])
nowait
为 指令来限制对应的 为 循环的结构。 具体而言,对应的 为 循环必须具有规范形状:
(initexpr;var 逻辑操作;b incr expr)
init expr
以下之一:var = lb
整数类型 var = lb
incr expr
以下之一:++var
var C++
-- var
var --
var += incr
var - = 增加
var = var + 增加
var = 增加 + var
var = var - incr
var
一个带符号整数变量。 如果此变量将否则共享,因此它隐式使私有为 为的持续时间。 无法在 为 语句体内修改此变量。 除非该变量是指定的 lastprivate,其值,在循环是不确定的后面。逻辑运算
以下之一:<
<=
>
>=
lb、 b和 incr
循环固定整数表达式。 不同步。这些表达式的计算时。 因此,所有已评估的副作用导致不确定的结果。
请注意规范格式项在允许循环迭代数加到循环。 此计算对值执行在 var 的类型,在整数提升后。 特别是,因此,如果 b 的值 -lb + 增加 该类型不能表示,结果是不确定的。 此外,,如果 逻辑操作的 是 AMP_LT 或 AMP_LT= increxpr 在每次循环迭代必须将导致 var 增加。 如果 逻辑操作的 是 AMP_GT 或 AMP_GT= increxpr 在每次循环迭代必须将导致 var 降低。
计划 子句指定 为 循环的迭代如何在团队的线程之间划分。 程序的正确性不能取决于线程执行特定迭代。 值 chunk_size,因此,如果指定,必须是一个正值的循环固定整数表达式。 不同步此表达式的计算时。 因此,所有已评估的副作用导致不确定的结果。 计划 类型 可以是下列操作之一:
表 2-1 计划 子句 类型 值
static |
当 计划 (静态的, chunk_size 时) 指定,迭代分为指定的范围都 chunk_size。 区块静态分配给团队的线程一个循环方式按线程数量的序列。 当没有 chunk_size 时 指定,迭代空间划分为的大小大约等效的块,当一个区块分配给每个线程。 |
dynamic |
当 计划 (动态的, chunk_size 时) 指定,迭代分成一系列块,每个包含 chunk_size 迭代。 每个区块分配给等待分配的线程。 线程执行迭代区块然后等待其下一个分配,,直到区块不是仍然要分配。 请注意将分配的最后一个区块可具有迭代的一个更小的数字。 当没有 chunk_size 时 指定,则它默认为 1。 |
引导 |
当 计划 (指导, chunk_size 时) 指定,迭代指派到区块的线程与如此的大小。 当某个线程完成迭代时其分配的块,它动态分配另一块,,直到没有保持为。 对于 chunk_size 1,每个区块的大小大约是线程数部件的未指定的迭代数。 这些范围大致以指数级降低到 1。 对于具有大于的值 k 开头的 一 chunk_size 大于 1,大致范围以指数级降低到 k,除此之外,最后一个区块小于 k 迭代能具有。 当没有 chunk_size 时 指定,则它默认为 1。 |
Runtime — 运行时 |
当 计划 (运行时)。 指定时,有关计划决策将延迟到运行时。 区块的此计划和大小可以选择在运行时通过设置环境变量 OMP_SCHEDULE。 如果此未设置环境变量,生成计划实现中定义。 当 计划 (运行时)。 指定时, chunk_size 不能指定。 |
在未显式定义的 计划 子句时,默认 计划 实现中定义。
一个 OpenMP 兼容程序不应依赖于特定为正确执行计划。 ,因为在相同的实现的更改计划在不同的编译器中,的 类型 是可能的程序不应依赖准确地符合该声明的计划 给定 类型中。 描述可用于选择对特定情形是相应的计划。
,当 排序 指令绑定到 为 构造时, 排序 子句必须存在。
,除非 nowait 子句指定,包含隐式障碍在 为 构造结束时。
为 为 指令的限制如下所示:
必须是结构化 为 循环块,,因此,此外,不能被 中断 语句停止其执行。
为 循环的循环控制表达式的值与 为 指令必须相同。团队的所有线程上的。
为 循环迭代变量必须有一个带符号整数类型。
唯一 计划 子句可以出现在 为 指令。
唯一 排序 子句可以出现在 为 指令。
唯一 nowait 子句可以出现在 为 指令。
没有指定的,则或在 chunk_size、 lb、 b、 incr 表达式内的任何副作用的频率发生。
chunk_size 表达式的值必须相同。团队的所有线程上的。