fdvmLDr (1158337), страница 12
Текст из файла (страница 12)
| dvm-directive | is specification-directive |
| or executable-directive |
| specification-directive | is processors-directive |
| or align-directive | |
| or distribute-directive | |
| or template-directive | |
| or pointer-directive | |
| or shadow-directive | |
| or dynamic-directive | |
| or inherit-directive | |
| or remote-group-directive | |
| or reduction-group-directive | |
| or task-directive | |
| or heap-directive | |
| or asyncid-directive |
| executable-directive | is realign-directive |
| or redistribute-directive | |
| or parallel-directive | |
| or remote-access-directive | |
| or shadow-group-directive | |
| or shadow-start-directive | |
| or shadow-wait-directive | |
| or reduction-start-directive | |
| or reduction-wait-directive | |
| or new-value-directive | |
| or prefetch-directive | |
| or reset-directive | |
| or parallel-task-loop-directive | |
| or map-directive | |
| or task-region-directive | |
| or end-task-region-directive | |
| or on-directive | |
| or end-on-directive | |
| or f90-directuive | |
| or asynchronous-directive | |
| or end-asynchronous-directive | |
| or asyncwait-directive |
Ограничения:
-
Cпецкомментарий directive-line подчиняется правилам написания комментария в фиксированной форме.
-
Директивы спецификации должны находиться в разделе спецификаций.
-
Исполняемые директивы должны находиться среди исполняемых операторов.
-
Любое выражение, входящее в директиву спецификации, должно быть выражением спецификации.
Выражение спецификации – это выражение, в котором каждое первичное должно быть одной из следующих форм:
-
константа,
-
переменная, которая является формальным аргументом,
-
переменная из COMMON блока,
-
ссылка на встроенную функцию, где каждый аргумент является выражением спецификации,
-
выражение спецификации, заключенное в скобки.
3. Массивы виртуальных процессоров. Директива PROCESSORS
| processors-directive | is PROCESSORS processors-decl-list |
| processors-decl | is processors-name ( explicit-shape-spec-list ) |
| explicit-shape-spec | is [ lower-bound : ] upper-bound |
| lower-bound | is int-expr |
| upper-bound | is int-expr |
Ограничения.
-
Разрешается использовать несколько массивов виртуальных процессоров разной формы при следующем условии: количество процессоров в каждом массиве должно быть равно значению встроенной функции NUMBER_OF_PROCESSORS ( ).
-
Массивы данных с атрибутами COMMON и SAVE могут быть отображены на локальные массивы виртуальных процессоров при следующем условии: при каждом вызове процедуры локальный массив процессоров имеет одно и то же определение.
4.1. Директивы DISTRIBUTE и REDISTRIBUTE
| distribute-directive | is dist-action distributee dist-directive-stuff |
| or dist-action [ dist-directive-stuff ] :: distributee-list |
| dist-action | is DISTRIBUTE |
| or REDISTRIBUTE |
| dist-directive-stuff | is dist-format-list [ dist-onto-clause ] |
| distributee | is array-name |
| or pointer-name | |
| or template-name |
| dist-format | is BLOCK |
| or GEN_BLOCK ( block-size-array ) | |
| or WGT_BLOCK ( block-weight-array , nblock) | |
| or * |
| dist-onto-clause | is ONTO dist-target |
| dist-target | is processors-name [(processors-section-subscript-list )] | |
| or task-name ( task-index ) | ||
| processors-section-subscript | is [ subscript ] : [ subscript ] | |
| subscript | is int-expr | |
| nblock | is int-expr | |
| block-size-array | is array-name | |
| block-weight-array | is array-name | |
Ограничения:
-
Длина списка dist-format-list должна быть равна количеству измерений массива. Т.е. для каждого измерения должен быть задан формат распределения.
-
Количество распределенных измерений массива (формат задан не *) должно быть равно количеству измерений массива процессоров в dist-target.
-
Массив block-size-array в спецификации GEN_BLOCK, должен быть одномерным целочисленным массивом, размер которого равен размеру соответствующего измерения массива процессоров, а сумма значений его элементов равна размеру распределяемого измерения.
-
Массив block-weight-array в спецификации WGT_BLOCK, должен быть одномерным массивом типа DOUBLE PRECISION.
-
В одном списке dist-format-list не может быть указан формат GEN_BLOCK и формат WGT_BLOCK.
-
Директива REDISTRIBUTE может применяться только к массивам со спецификацией DYNAMIC.
-
Отсутствие dist-directive-stuff допустимо только в директиве DISTRIBUTE. В этом случае распределяемый массив может использоваться только после выполнения директивы REDISTRIBUTE.
4.2.2. Динамические массивы в модели FDVM. Директива POINTER
| pointer-directive | is type , POINTER ( dimension-list ) :: pointer-name-list |
| dimension | is : |
| pointer-name | is scalar-int-variable-name |
| or int-array-name | |
| heap-directive | is HEAP array-name-list |
Ограничения:
-
Переменной с атрибутом POINTER может быть присвоено только значение функции ALLOCATE или значение другой переменной с атрибутом POINTER.
-
Количество измерений в левой и правой части оператора присваивания переменной с атрибутом POINTER должны совпадать.
4.3.1. Директивы ALIGN и REALIGN
| align-directive | is align-action alignee align-directive-stuff |
| or align-action [ align-directive-stuff ] :: alignee‑list | |
| align-action | is ALIGN |
| or REALIGN | |
| align-directive-stuff | is ( align-source-list ) align-with-clause |
| alignee | is array-name |
| or pointer-name |
| align-source | is * |
| or align-dummy |
| align-dummy | is scalar-int-variable |
| align-with-clause | is WITH align-spec |
| align-spec | is align-target ( align-subscript-list ) |
| align-target | is array-name |
| or template-name | |
| or pointer-name |
| align-subscript | is int-expr |
| or align-dummy-use | |
| or * |
| 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 должна быть равна количеству измерений выравниваемого массива.
-
Длина списка align-subscript-list должна быть равна количеству измерений базового массива align-target.
-
Директива REALIGN может применяться только к массивам со спецификацией DYNAMIC.
-
Отсутствие align-directive-stuff допустимо только в директиве ALIGN. В этом случае распределяемый массив может использоваться только после выполнения директивы REALIGN.
4.3.2. Директива TEMPLATE
| template-directive | is TEMPLATE template-decl-list |
| template-decl | is template-name [ ( explicit-shape-spec-list ) ] |
4.4. Директивы DYNAMIC и NEW_VALUE
| dynamic-directive | is DYNAMIC alignee-or-distributee-list |
| alignee-or-distributee | is alignee |
| or distributee |















