DO CONCURRENT (Fortran 2008)
用途
DO CONCURRENT 语句是 DO CONCURRENT 构造中的第一个语句,它允许您指定各个循环迭代没有相互依赖关系。
语法
- DO_construct_name
- 是标识 DO CONCURRENT 构造的名称。
- stmt_label
- 是出现在同一作用域限定单元中 DO CONCURRENT 语句之后的可执行语句的语句标签。 它表示 DO CONCURRENT 构造的结束。
- scalar_mask_expr
- 是一个标量逻辑表达式。 对 index-name 值的每个组合进行求值的方式与在 FORALL 构造中使用的方式相同。
- index_name
- 是一个命名变量,也是一个标量整数。 它具有 DO CONCURRENT 构造的作用域。
- concurrent_limit, concurrent_step
- 都是标量整数表达式。 可以按 FORALL 构造中有效的任何顺序对它们进行求值。
约束
- concurrent_control 中的 concurrent_limit 或 concurrent_step 不得在出现 concurrent_limit 或 concurrent_step 参数的 concurrent_control_list 中引用任何 index_name。
- 如果 CYCLE 语句属于外部构造,那么它不得出现在 DO CONCURRENT 构造中。
- RETURN 语句不得出现在 DO CONCURRENT 构造中。
- DO CONCURRENT 构造中的分支不得具有构造外部的分支目标。
- 对非纯过程的引用不得出现在 DO CONCURRENT 构造中。
- 内部模块 IEEE_EXCEPTIONS 中对过程 IEEE_GET_FLAG, IEEE_SET_HALTING_MODE或 IEEE_GET_HALTING_MODE 的引用不得出现在 DO CONCURRENT 构造中。
- EXIT 语句不得出现在 CRITICAL 或 DO CONCURRENT 构造中 (如果它属于该构造或外部构造)。
规则
如果 DO 构造的 DO 语句指定了 DO_construct_name,那么对应的 END_DO_statement 必须指定相同的 DO_construct_name; 否则,对应的 END_DO_statement 不得指定 DO_construct_name。
属于 DO CONCURRENT 构造的 CYCLE 语句的执行将完成构造的该迭代的执行。
如果 integer_type_spec 出现在 concurrent_header 中,那么它具有指定的类型和类型参数; 否则,将以下规则适用:
- 其类型和类型参数与其是最内侧可执行结构或作用域单元中变量的名称情况下相同。 此外,此类型必须是整数。
- index_name 不得与可访问全局标识符、本地标识符或外部构造实体的标识符相同(公共块名或标量变量名除外)。
index_name 值组合的集合是由每个控制规范定义的集合的笛卡尔乘积。 当 scalar_mask_expr 具有值 .TRUE.时, index_name 值的组合集处于活动状态。 对此集合求值时,将定义 index_name。 将对 index_name 值的每个活动组合执行 DO CONCURRENT 构造的范围。 每次执行范围都是一个迭代。 执行可能会以任何顺序执行。
包含的 DO CONCURRENT 构造的 index_name 不得与其包含的任何 DO CONCURRENT 构造的 index_name 相同。
对于 DO CONCURRENT 构造,当完成所有迭代的执行时,循环将终止,并且 DO 构造将变为不活动状态。
当 DO CONCURRENT 构造终止时,以下规则适用:
- 如果指针的关联状态在构造的多个迭代中更改,那么指针的关联状态将取决于处理器。
- 在构造的多次迭代期间已定义或变为未定义的变量将变为未定义。
DO CONCURRENT 构造的不同迭代所写入的记录之间的顺序取决于处理器,前提是这些记录被写入到一个通过多个迭代连接以进行顺序访问的文件中。
以下规则与 DO CONCURRENT 构造的执行相关:
- 在迭代中引用的变量在该迭代期间必须先前已经定义,或者不得定义,或者在任何其他迭代期间变为未定义。 当循环终止时,已经定义的变量或者多次迭代之后变为未定义的变量将会变为未定义。 此规则适用于在循环中调用的任何过程。
- 如果在除指针赋值、分配或无效化的情况下之外的迭代中使用某个指针,那么此指针必须是在该迭代期间之前已经关联的指针,或者在任何其他迭代期间不得更改其指针关联。 在构造终止时,在多次迭代中更改指针关联的指针将具有未定义的关联状态。
- 如果可分配对象在迭代中被引用、定义、解除分配,或在迭代中查询其分配状态、动态类型或延迟类型参数值,那么必须符合以下条件之一:之前已经在该迭代中分配;不得在任何其他迭代中分配或取消分配。 如果一个可分配对象在多次迭代中分配,那么在每次迭代结束时,该对象的分配状态必须为未分配。
- 如果数据在一次迭代中写入文件记录或位置,那么不能在不同的迭代中读取或写入该文件中的该记录或位置。
