Добавить 8. Директивы системе SAPFOR
96
8.-%D0%94%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D1%8B-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5-SAPFOR.md
Normal file
96
8.-%D0%94%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D1%8B-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5-SAPFOR.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
### БНФ
|
||||||
|
```
|
||||||
|
<директива> ::= !$SPF <тип>( <спец> [, <спец >])
|
||||||
|
<тип> ::= ANALYSIS (<спец1> [, <спец1 >]) | PARALLEL (<спец2> [, <спец2 >]) | TRANSFORM (<спец3>) | PARALLEL_REG <Идент> | END PARALLEL_REG | CHECKPOINT(<спец4>,[<спец4>])
|
||||||
|
|
||||||
|
<спец1> ::= <редукция> | <приватные>|<параметр задачи>
|
||||||
|
<спец2> ::= <теневые грани> | < рег зависимости> | <удаленная ссылка>
|
||||||
|
<спец3> ::= NOINLINE | UNROLL [(<Цифра>, <Цифра>, <Цифра>)] |
|
||||||
|
FISSION ( <access_list> [,<access_list>] ) |
|
||||||
|
EXPAND [ ( <Идент> [,<Идент>] ) ] |
|
||||||
|
SHRINK (<Идент> (<Цифра>, [<Цифра>]))
|
||||||
|
<спец4> ::= INTERVAL(TIME | ITER, <Цифра>) | FILES_COUNT (<Цифра>) | VARLIST (<Идент> [,<Идент>]) | EXCEPT (<Идент>[,<Идент>]) | TYPE (ASYNC | FLEXIBLE)
|
||||||
|
|
||||||
|
<редукция> := REDUCTION (< ред лист> [,< ред лист> ])
|
||||||
|
<ред лист> ::= <операция> ( <Идент>) | <операция_loc> ( <loc_ident> )
|
||||||
|
<операция>::= max | min | sum | prod | and | or | eqv | neqv
|
||||||
|
<операция_loc> ::= minloc | maxloc
|
||||||
|
<loc_ident> ::= (< Идент >, < Идент >, <Константа>)
|
||||||
|
<приватные> ::= PRIVATE (< Идент > [,< Идент >])
|
||||||
|
<параметр задачи> ::= PARAMETER(< Идент > = <expr>[,< Идент > = <expr>])
|
||||||
|
<теневые грани> ::= SHADOW ( <описание массива> [,<описание массива>] )
|
||||||
|
< рег зависимости> ::= ACROSS (<описание массива> [,<описание массива>] )
|
||||||
|
<описание массива> ::= (< Идент > (<Константа>:<Константа>>[,<Константа>:<Константа>]))
|
||||||
|
<удаленная ссылка> ::= REMOTE_ACCESS ( <access_list> [,<access_list>] )
|
||||||
|
<access_list> ::= <Идент>(<expr>)
|
||||||
|
<expr> ::= <Идент> [<op> <expr>] | <Константа> [<op> <expr>] | <Идент> [<op> (<expr>)] |
|
||||||
|
<Константа> [<op>( <expr>)]
|
||||||
|
<op> ::= * | + | - | /
|
||||||
|
<Буква> ::= [a-z] | [A-Z]
|
||||||
|
<Цифра> ::= [0-9]
|
||||||
|
<Константа> ::= <Цифра>[<Константа>]
|
||||||
|
<Идент> ::= <Буква> {<Буква> | <Цифра>}
|
||||||
|
```
|
||||||
|
### Семантика директив
|
||||||
|
1. !\$SPF ANALYSIS (PRIVATE(VAR))
|
||||||
|
- Данная директива должна быть либо перед объявлением переменной, либо перед заголовком цикла.
|
||||||
|
- Если директива перед объявлением переменной, то данная переменная VAR должна присутствовать в этом объявлении, иначе – ошибка.
|
||||||
|
- Если директива перед циклом, то данная переменная должна использоваться внутри цикла, иначе предупреждение. Также переменная должна быть объявлена в текущей области видимости, иначе – ошибка. Переменная может быть как скаляром, так и массивом. Если переменная используется только на чтение в данном цикле, то необходимо выдавать предупреждение.
|
||||||
|
2. !\$SPF ANALYSIS (REDUCTION(OP(VAR), MIN/MAXLOC(VAR_LOC, ARRAY, CONST)
|
||||||
|
- Данная директива должна присутствовать только перед заголовком цикла, переменные VAR/VAR_LOC/ARRAY должны быть объявлены в текущей области видимости.
|
||||||
|
- Переменная VAR/VAR_LOC должна использоваться на запись в теле цикла, иначе – предупреждение.
|
||||||
|
- В случае LOC операций, ARRAY – это обязательно одномерный массив типа INTEGER, иначе – ошибка. CONST задает количество элементов массива ARRAY и если это возможно проверить (размер массива является статическим и вычисляемым на этапе анализа), то выдавать ошибку, если размер массива меньше необходимого.
|
||||||
|
- Также VAR_LOC и ARRAY должны использоваться на запись в теле цикла, иначе – предупреждение.
|
||||||
|
- Если переменная VAR/VAR_LOC является массивом, то она должна содержаться в директиве PRIVATE в директиве перед объявлением этого массива, а также НЕ должна содержаться в директиве PRIVATE в текущем цикле – иначе ошибка.
|
||||||
|
3. !$SPF PARALLEL(SHADOW (VAR(list of shadows)) / ACROSS (VAR(list of shadows)))
|
||||||
|
- Данные директивы должны присутствовать только перед заголовком цикла
|
||||||
|
- Переменная VAR должна быть объявлена в текущей области видимости
|
||||||
|
- Переменная VAR должна быть массивом и не должна содержаться в директиве PRIVATE перед описанием этого массива, иначе – ошибки. Также VAR не должна содержаться в PRIVATE при текущем цикле.
|
||||||
|
- Лист теневых граней (его размерность), должен в точности соответствовать размерности массива, иначе – ошибка.
|
||||||
|
4. !$SPF PARALLEL(REMOTE_ACCESS(EXPR))
|
||||||
|
- Данная директива должна присутствовать либо перед заголовком цикла, либо перед оператором, иначе – ошибка.
|
||||||
|
- В случае присутствия перед оператором выражение EXPR должно текстуально содержаться в этом операторе, иначе – ошибка. (оператор может быть составным, например, цикл или IF, SWITCH и т.д.)
|
||||||
|
- В случае присутствия перед заголовком цикла, если выражение содержит обращение к массиву, то данный массив НЕ должен содержаться в PRIVATE перед объявлением и в текущем цикле, иначе – ошибка
|
||||||
|
- Если в выражении НЕ присутствует индексная переменная цикла и выражение не содержит «:» (например, А(:, :)) в обращении к массиву, то выражение должно текстуально содержаться в среди операторов тела цикла, иначе – ошибка.
|
||||||
|
5. !$SPF TRANSFORM(NOINLINE)
|
||||||
|
- Данная директива должна присутствовать только после заголовка процедуры или функции, иначе – ошибка. В случае вставки данной директивы после функции main (program для фортрана) или в любом другом месте – ошибка.
|
||||||
|
6. !$SPF PARALLEL_REG IDENT и !$SPF END PARALLEL_REG
|
||||||
|
- Парные директивы, обозначающие области распараллеливания. IDENT – не должен содержаться среди всех объявлений переменных текущей функции, а также используемых common блоков, иначе – ошибка.
|
||||||
|
- Начало и конец региона должны принадлежать одному составному родительскому оператору (например, цикл, IF, функция и т.д.), иначе – ошибка.
|
||||||
|
- Не допускается пересечение регионов и вложенные регионы, иначе – ошибка.
|
||||||
|
- Не допускается объявление региона в области описания данных, разрешено только в области исполняемых операторов, иначе – ошибка.
|
||||||
|
7. !$SPF TRANSFORM FISSION (K,J,I)
|
||||||
|
- Ставится только перед циклом
|
||||||
|
- Должна иметь список переменных цикла, на которых она должна распространяться
|
||||||
|
- Нельзя иметь несколько таких директив перед одним циклом
|
||||||
|
- Переменные в списке этой директивы должны в точности соответствовать переменным цикла в том же порядке: !SPF TRANSFORM FISSION (K,J,I) DO K ; DO J; DO I;
|
||||||
|
- Перечисленные переменные должны распространяться только на тесно-вложенные циклы (свойство perfect для SgForStatement)
|
||||||
|
8. !$SPF TRANSFORM EXPAND [ (K,J,I) ]
|
||||||
|
- Ставится только перед циклом
|
||||||
|
- Может иметь список переменных, а может и не иметь
|
||||||
|
- Перечисленные переменные должны распространяться только на тесно-вложенные циклы (свойство perfect для SgForStatement)
|
||||||
|
- Переменные в списке этой директивы должны в точности соответствовать переменным цикла в том же порядке: !SPF TRANSFORM PRIVATES_EXPANSION (K,J,I) DO K ; DO J; DO I;
|
||||||
|
- Нельзя иметь несколько таких директив перед одним циклом
|
||||||
|
9. !$SPF CHECKPOINT(INTERVAL(TIME, 10), FILES_COUNT(4), VARLIST(var1, var2, var), TYPE(ASYNC), EXCEPT(var3, var5))
|
||||||
|
- INTERVAL(TIME, 10) - если задана, то все аргументы должны быть, первый аргумент - ключевое TIME|ITER, второй - целое число
|
||||||
|
- FILES_COUNT(4) - если задана, то аргумент обязателен, целое число
|
||||||
|
- VARLIST(var1, var2, var) - список из 1 и более аргумента, аргументы - идентификаторы
|
||||||
|
- EXCEPT(var3, var5) - список из 1 и более аргумента, аргументы - идентификаторы
|
||||||
|
- TYPE(ASYNC) - если указана, то минимум одно ключевое слово должно быть, в аргументах список ключевых слов, ASYNC, FLEXIBLE, ...
|
||||||
|
|
||||||
|
Расстановка директивы.
|
||||||
|
|
||||||
|
- Если директива стоит в исполняемой части кода и содержит в себе INTERVAL, то считается, что она является директивой КТ, то есть задает точку создания КТ. В такой директиве все остальные параметры не являются обязательными. Наполнение может содержать все возможные клаузы (FILES, VARLIST …)
|
||||||
|
|
||||||
|
- Если директива стоит в исполняемой или не исполняемой части, но не содержит в себе INTEVAL, то она считается директивой включения и исключения переменных из всех КТ, которые могут быть заданы директивой. В такой директиве можно задавать только VARLIST и EXCEPT клаузы. Нужно проверять, что переменные в VARLIST и EXCEPT объявлены непосредственно там (в том же модуле/функции/процедуре), где стоят эти директивы. Переменные из модулей могут быть включены под разным именем, в том числе и после переименования. Включение одних и тех же переменных несколько раз разрешается. Исключение и включение одной и той же переменной считается её исключением вне зависимости от порядка следования клауз.
|
||||||
|
|
||||||
|
10) !$SPF ANALYSIS(PARAMETER(ident=expr))
|
||||||
|
- Ставится только перед исполняемыми операторами
|
||||||
|
- ident должен присутствовать в следующем операторе, а также должен являться переменной
|
||||||
|
- все переменные из expr должны быть объявлены
|
||||||
|
11) !$SPF TRANSFORM(SHRINK(TMP (1, 0)))
|
||||||
|
- Ставится только перед циклом
|
||||||
|
- Должен иметь список переменных, к которым он применяется
|
||||||
|
- Перечисленные переменные должны содержаться только в тесно-вложенных циклах (свойство perfect для SgForStatement)
|
||||||
|
- Нельзя иметь несколько таких директив перед одним циклом
|
||||||
|
- Общий вид SHRINK(имя_массива(маска)), где маска – вектор из 1 и 0 размера n, где n - общее количество измерений в имя_массива.
|
||||||
Reference in New Issue
Block a user