fdvmLDr (1158337), страница 13
Текст из файла (страница 13)
| 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] [ , 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 ] |
5.1.3. Приватные переменные. Спецификация NEW
| new-clause | is NEW ( new-variable-list ) |
| new-variable | is array-name |
| or scalar-variable-name |
Ограничение:
-
NEW-переменные не могут быть распределенными массивами.
5.1.4. Редукционные операции и переменные. Спецификация REDUCTION
| reduction-clause | is REDUCTION ( [ reduction-group-name : ] reduction-op-list ) |
| reduction-op | is reduction-op-name ( reduction-variable ) |
| or reduction-loc-name ( reduction-variable , location-variable, int-expr) |
| reduction-variable | is array-name |
| or scalar-variable-name |
| location-variable | is array-name |
| reduction-op-name | is SUM |
| or PRODUCT | |
| or MAX | |
| or MIN | |
| or AND | |
| or OR | |
| or EQV | |
| or NEQV |
| reduction-loc-name | is MAXLOC |
| or MINLOC |
Ограничения:
-
Редукционными переменными не могут быть распределенные массивы.
-
Редукционные переменные вычисляются и используются только в операторах определенного вида - редукционных операторах.
6.2.1.Спецификация массива с теневыми гранями
| shadow-directive | is SHADOW dist-array ( shadow-edge-list ) |
| or SHADOW ( shadow-edge-list ) :: dist-array-list |
| dist-array | is array-name |
| or pointer-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 с обеих сторон каждого распределенного измерения.
6.2.2. Синхронная спецификация независимых ссылок типа SHADOW для одного цикла
| shadow-renew-clause | is SHADOW_RENEW ( renewee‑list ) |
| or shadow-start-directive | |
| or shadow-wait-directive |
| renewee | is dist-array-name [ ( shadow-edge-list ) ] [ (CORNER) ] |
Ограничения:
-
Размер теневых граней, заполняемых значениями, не должен превышать максимального размера, описанного в директиве SHADOW.
-
Если размеры теневых граней не указаны, то используются максимальные размеры.
6.2.3. Вычисление значений в теневых гранях. Спецификация SHADOW_COMPUTE
| shadow-compute-clause | is SHADOW_COMPUTE |
6.2.4. Спецификация AСROSS зависимых ссылок типа SHADOW для одного цикла
| across-clause | is ACROSS ( dependent-array-list ) |
| dependent-array | is dist-array-name ( dependence-list ) [(section-spec-list)] |
| dependence | is flow-dep-length : anti-dep-length | |
| flow-dep-length | is int-constant | |
| anti-dep-length | is int-constant | |
| section-spec | is SECTION ( section-subscript-list ) | |
Ограничение:
-
В каждой ссылке на массив может существовать зависимость по данным только по одному распределенному измерению.
6.2.5. Асинхронная cпецификация независимых ссылок типа SHADOW
| shadow-group-directive | is SHADOW_GROUP shadow-group-name ( renewee-list ) |
| shadow-start-directive | is SHADOW_START shadow-group-name |
| shadow-wait-directive | is SHADOW_WAIT shadow-group-name |
Ограничения.
-
Директива SHADOW_START должна выполняться после директивы SHADOW_GROUP.
-
Директива SHADOW_WAIT должна выполняться после директивы SHADOW_START.
-
Новые значения в теневых гранях могут использоваться только после выполнения директивы SHADOW_WAIT.
-
Директивы асинхронного обновления теневых граней не могут использоваться внутри параллельного цикла.
6.3.1. Директива REMOTE_ACCESS
| remote-access-directive | is REMOTE_ACCESS ( [ remote-group-name ] 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 |
6.3.3. Асинхронная спецификация удаленных ссылок типа REMOTE
| remote-group-directive | is REMOTE_GROUP remote-group-name-list |
Ограничение:
-
Идентификатор, определенный этой директивой, может использоваться только в директивах REMOTE_ACCESS , PREFETCH и RESET.
| prefetch-directive | is PREFETCH remote-group-name |
| reset-directive | is RESET remote-group-name |
Ограничения.
-
Повторное выполнение директивы PREFETCH является корректным только в том случае, когда характеристики группы удаленных ссылок (параметры циклов, распределения массивов и значения индексных выражений в удаленных ссылках) не меняются.
-
Директиву PREFETCH можно выполнять для нескольких циклов (нескольких директив REMOTE_ACCESS), если между этими циклами не существует зависимости по данным для распределенных массивов, указанных в директивах REMOTE_ACCESS.
6.3.4.2.1. Директива ASYNCID
| asyncid-directive | is ASYNCID async-name-list |
6.3.4.2.2. Директива 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 |
6.3.4.2.3. Директивы 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 |
6.3.4.2.4. Директива ASYNCWAIT
| asyncwait-directive | is ASYNCWAIT async-name |
6.4.2. Асинхронная спецификация удаленных ссылок типа REDUCTION
| reduction-group-directive | is REDUCTION_GROUP reduction-group-name-list |
| reduction-start-directive | is REDUCTION_START reduction-group-name |
| reduction-wait-directive | is REDUCTION_WAIT reduction-group-name |
Ограничения.
-
До выполнения директивы REDUCTION_START редукционные переменные группы могут использоваться только в редукционных операторах параллельных циклов.
-
Директива REDUCTION_START и REDUCTION_WAIT должны выполняться после окончания цикла (циклов), где вычислялись значения редукционных переменных. Между этими операторами могут выполняться только те операторы, в которых не используются значения редукционных переменных.
-
Директива REDUCTION_WAIT уничтожает группу редукционных операций.
7.1. Описание массива задач
| task-directive | is TASK task-list |
| task | is task-name ( max-task ) |
7.2. Отображение задач на процессоры. Директива MAP
| map-directive | is MAP task-name ( task-index ) |
| ONTO processors-name( processors-section-subscript-list) |
7.4. Распределение вычислений. Директива TASK_REGION
| block-task-region | is task-region-directive | |
| on-block | ||
| [ on-block ]... | ||
| end-task-region-directive | ||
| task-region-directive | is TASK_REGION task-name [ , reduction-clause ] | |
| end-task-region-directive | is END TASK_REGION | |
| on-block | is on-directive | |
| block | ||
| end-on-directive | ||
| on-directive | is ON task-name ( task-index ) [ , new-clause ] | |
| end-on-directive | is END ON | |
| loop-task-region | is task-region-directive | |
| parallel-task-loop | ||
| end-task-region-directive | ||
| parallel-task-loop | is parallel-task-loop-directive | |
| do-loop | ||
| parallel-task-loop-directive | is PARALLEL ( do-variable ) ON task-name ( do-variable ) [ , new-clause ] | |
9. Процедуры
| inherit-directive | is INHERIT dummy-array-name-list |
Приложение 2. Примеры программ
Семь небольших программ из научной области приводятся для иллюстрации свойств языка Fortran DVM. Они предназначены для решения систем линейных уравнений:















