Добавить 8. Директивы системе SAPFOR

2023-09-14 17:31:47 +00:00
parent 30369e3d90
commit 19d3509e8c

@@ -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 - общее количество измерений в имя_массива.