fdvmLDr (1158421), страница 10
Текст из файла (страница 10)
Директивы спецификации удаленных данных не имеют аналогов в HPF2. , т.к. предполагается, что компилятор HPF2 автоматически определяет оптимальный доступ к удаленным данным.
Следовательно, множество директив FDVM может автоматически трансформироваться во множество директив HPF2.
12. Отличие версии FDVM 2.0 от версии FDVM 1.0
Версия FDVM 1.0 является подмножеством версии FDVM 2.0. Дополнительно определены следующие возможности:
-
Модель динамических массивов. Эта модель может быть автоматически трансформирована для выполнения в языках F77, FDVM и HPF (раздел 4.2).
-
Параллелизм задач (раздел 7).
-
Формат GEN_BLOCK для распределения массивов (раздел 4.1.2).
-
Распределение цикла с регулярной зависимостью по данным (раздел 6.2.3).
-
Более точная спецификация удаленных данных, обеспечивающая эффективный доступ к ним (раздел 6.3).
-
Совмещение счета и обмена данными (разделы 6.2.4, 6.3.3, 6.4.2).
Литература
-
Message-Passing Interface Forum, Document for a Standard Message-Passing Interface, 1993. Version 1.0.
-
OpenMP Consortium: OpenMP Fortran Application Program Interface, Version 1.0, October 1997.
-
High Performance Fortran Forum. High Performance Fortran Language Specification. Version 1.0
-
High Performance Fortran Forum. High Performance Fortran Language Specification. Version 2.0, January 31, 1997.
-
ANSI X3.9-1978 Programming Language Fotran. New York 1978.
Приложение 1. Синтаксис
2.4. Синтаксис директив FDVM
| directive-line | is CDVM$ dvm-directive |
| or *DVM$ dvm-directive |
| 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 |
| 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 |
Ограничения:
-
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-array-name ) | |
| or * |
| dist-onto-clause | is ONTO dist-target |
| dist-target | is processors-name [( section-subscript-list )] | |
| or task-name ( task-index ) | ||
| section-subscript | is [ subscript ] : [ subscript ] | |
Ограничения:
-
Длина списка dist-format-list должна быть равна количеству измерений массива. Т.е. для каждого измерения должен быть задан формат распределения.
-
Количество распределенных измерений массива (формат задан не *) должно быть равно количеству измерений dist-target.
-
Массив block-array-name в спецификации GEN_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 |
Ограничения:
-
Переменной с атрибутом 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 |
| new-value-directive | is NEW_VALUE |
5.1.2. Распределение витков цикла. Директива PARALLEL
| parallel-directive | is PARALLEL ( do-variable-list ) ON iteration-align-spec [ , new-clause ] [ , reduction-clause] [ , shadow-renew-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 ] |
5.1.3. Приватные переменные. Спецификация NEW
| new-clause | is NEW ( new-variable-list ) |














