From 19d3509e8cf032181656e88b6cc0f898cc4e1a59 Mon Sep 17 00:00:00 2001 From: Alexander_KS Date: Thu, 14 Sep 2023 17:31:47 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=208.=20=D0=94=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D0=B2?= =?UTF-8?q?=D1=8B=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B5=20SAPFOR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5-SAPFOR.md | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 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 diff --git a/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 b/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 new file mode 100644 index 0000000..5b6e9ad --- /dev/null +++ b/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 @@ -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 ( [,] ) | + EXPAND [ ( <Идент> [,<Идент>] ) ] | + SHRINK (<Идент> (<Цифра>, [<Цифра>])) +<спец4> ::= INTERVAL(TIME | ITER, <Цифра>) | FILES_COUNT (<Цифра>) | VARLIST (<Идент> [,<Идент>]) | EXCEPT (<Идент>[,<Идент>]) | TYPE (ASYNC | FLEXIBLE) + +<редукция> := REDUCTION (< ред лист> [,< ред лист> ]) +<ред лист> ::= <операция> ( <Идент>) | <операция_loc> ( ) +<операция>::= max | min | sum | prod | and | or | eqv | neqv +<операция_loc> ::= minloc | maxloc + ::= (< Идент >, < Идент >, <Константа>) +<приватные> ::= PRIVATE (< Идент > [,< Идент >]) +<параметр задачи> ::= PARAMETER(< Идент > = [,< Идент > = ]) + <теневые грани> ::= SHADOW ( <описание массива> [,<описание массива>] ) +< рег зависимости> ::= ACROSS (<описание массива> [,<описание массива>] ) +<описание массива> ::= (< Идент > (<Константа>:<Константа>>[,<Константа>:<Константа>])) +<удаленная ссылка> ::= REMOTE_ACCESS ( [,] ) + ::= <Идент>() + ::= <Идент> [ ] | <Константа> [ ] | <Идент> [ ()] | + <Константа> [( )] + ::= * | + | - | / +<Буква> ::= [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 - общее количество измерений в имя_массива.