Вторая версия (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
Если компилятор обнаруживает в исходной программе ошибку, то он выдает сообщение следующего вида