2.4.1 for 构造

指令标识指定的迭代的工作划分构造关联的循环的迭代并行要执行。 循环的迭代中已存在执行并行构造的团队将它绑定的线程分布。 构造的语法如下所示:

#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,其值,在循环是不确定的后面。

  • 逻辑运算
    以下之一:

    <

    <=

    >

    >=

  • lbbincr
    循环固定整数表达式。 不同步。这些表达式的计算时。 因此,所有已评估的副作用导致不确定的结果。

请注意规范格式项在允许循环迭代数加到循环。 此计算对值执行在 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_sizelbbincr 表达式内的任何副作用的频率发生。

  • chunk_size 表达式的值必须相同。团队的所有线程上的。

交叉引用:

  • 专用firstprivatelastprivate减少 子句,请参见中的第 25 页的 第2.7.2部分

  • OMP_SCHEDULE 环境变量,请参见中的第 48 页的 第4.1部分

  • 排序 构造,请参见中的第 22 页的 第2.6.6部分

  • 附录 D,第 93 页,提供有关使用计划子句的更多信息。