Вторая версия (1158279), страница 8
Текст из файла (страница 8)
| align-dummy-use | is [ primary-expr * ] align‑dummy [ add-op primary-expr ] |
| primary-expr | is int-constant |
| or int-variable | |
| or ( int-expr ) | |
| add-op | is + |
| or - |
Ограничение:
-
Длина списка align-source-list должна быть равна количеству измерений выравниваемого массива.
Директива TEMPLATE
| template-directive | is TEMPLATE template-decl-list |
| template-decl | is template-name [ ( explicit-shape-spec-list ) ] |
Параллельная область
| omp-parallel–directive | is !$OMP PARALLEL [ompparallel-clause-list] block !$OMP END PARALLEL |
| ompparallel-clause | is ompreduction-clause or ompshared-clause or ompprivate-clause |
Распределение витков цикла. Директива PARALLEL ON.
| dvm-parallel-on-directive | is CDVM$ PARALLEL ( do-variable-list ) ON iteration-align-spec [ , ompprivate-clause] [ , reduction-clause] [ , shadow-renew-clause][ , shadow-compute-clause] [ , remote-access-clause ][ , across-clause ] |
| Iteration-align-spec | is align-target ( iteration-align-subscript-list ) |
| Iteration-align-subscript | is int-expr |
| or do-variable-use | |
| or * | |
| do-variable-use | is [ primary-expr * ] do-variable [ add-op primary-expr ] |
Распределение витков цикла между нитями внутри узла. Директивы DO и PARALLEL DO
| Omp-do–directive | is !$OMP DO [omp-do-clause-list] do-loop [!$OMP END DO [NOWAIT]] |
| Omp-do–clause | is ompschedule-clause or ompreduction-clause or ompprivate-clause |
| ompschedule–clause | is SCHEDULE (schedule-expr) |
| schedule-expr | is STATIC [, int-expr] or DYNAMIC [, int-expr] or GUIDED[, int-expr] or RUNTIME |
| omp-paralleldo–directive | is !$OMP PARALLEL DO [[ ,] ompschedule-clause] [[ ,] ompreduction-clause] [[ ,] ompshared-clause] [[ ,] ompprivate-clause] do-loop [!$OMP END PARALLEL DO] |
Редукционные операции и переменные. Спецификация REDUCTION
OpenMP-спецификация
| ompreduction-clause | is REDUCTION (ompreduction-op-name : reduction-variable-list) |
| reduction-variable | is array-name |
| or scalar-variable-name | |
| ompreduction-op-name | is + |
| or * | |
| or MAX | |
| or MIN | |
| or .AND. | |
| or .OR. |
DVM-спецификация
| reduction-clause | is REDUCTION ( reduction-op-list ) |
| reduction-op | is reduction-op-name ( reduction-variable ) |
| reduction-op-name | is SUM |
| or PRODUCT | |
| or MAX | |
| or MIN | |
| or AND | |
| or OR |
Ограничения:
-
Редукционными переменными не могут быть распределенные массивы.
-
Редукционные переменные вычисляются и используются только в операторах определенного вида - редукционных операторах.
Классы переменных.
Общие данные. Спецификация SHARED
| Ompshared–clause | is SHARED (list) |
Приватные данные. Спецификация PRIVATE
| ompprivate–clause | is PRIVATE (list) |
Спецификация массива с теневыми гранями
| shadow-directive | is SHADOW dist-array ( shadow-edge-list ) |
| dist-array | is array-name |
| shadow-edge | is width |
| or low-width : high-width |
| width | is int-expr |
| low-width | is int-expr |
| high-width | is int-expr |
Ограничения:
-
Размер левой теневой грани (low-width) и размер правой теневой грани (high-width) должны быть целыми константными выражениями, значения которых больше или равны 0.
-
Задание размера теневых граней как width эквивалентно заданию width : width.
-
По умолчанию, распределенный массив имеет теневые грани шириной 1 с обеих сторон каждого распределенного измерения.
Спецификация SHADOW_RENEW
| shadow-renew-clause | is SHADOW_RENEW ( renewee‑list ) |
| renewee | is dist-array-name [ ( shadow-edge-list ) |
Ограничения:
-
Размер теневых граней, заполняемых значениями, не должен превышать максимального размера, описанного в директиве SHADOW.
-
Если размеры теневых граней не указаны, то используются максимальные размеры.
Спецификация AСROSS
| across-clause | is ACROSS ( dependent-array-list ) |
| dependent-array | is dist-array-name ( dependence-list ) |
| dependence | is flow-dep-length : anti-dep-length |
| flow-dep-length | is int-constant |
| anti-dep-length | is int-constant |
Ограничение:
-
В каждой ссылке на массив может существовать зависимость по данным только по одному распределенному измерению.
Директива REMOTE_ACCESS
| remote-access-directive | is REMOTE_ACCESS ( regular-reference-list) |
| regular-reference | is dist-array-name [( regular-subscript-list )] |
| regular-subscript | is int-expr |
| or do-variable-use | |
| or : | |
| remote-access-clause | is remote-access-directive |
Директива ASYNCID
| asyncid-directive | is ASYNCID async-name-list |
Директива F90
| f90-directive | is F90 copy-statement |
| copy-statement | is array-section = array-section |
| array-section | is array-name [( section-subscript-list )] |
| section-subscript | is subscript |
| or subscript-triplet | |
| subscript-triplet | is [ subscript ] : [ subscript ] [ : stride] |
| subscript | is int-expr |
| stride | is int-expr |
Директивы ASYNCHRONOUS и END ASYNCHRONOUS
| asynchronous-construct | is asynchronous-directive |
| f90-directive [ f90-directive ] … copy-loop [ copy-loop ] … | |
| end-asynchronous-directive | |
| asynchronous-directive | is ASYNCHRONOUS async-name |
| end-asynchronous-directive | is END ASYNCHRONOUS |
Директива ASYNCWAIT
| asyncwait-directive | is ASYNCWAIT async-name |
Процедуры
Наследуемое распределение описывается директивой:
| inherit-directive | is INHERIT dummy-array-name-list |
Вызов процедуры из параллельной области:
| From-one-thread- directive | is CDVM$ FROM ONE THREAD |
Приложение 2. Сообщения компилятора Fortran DVM
Если компилятор обнаруживает в исходной программе ошибку, то он выдает сообщение следующего вида















