14
08. Директивы системе SAPFOR
Alexander_KS edited this page 2025-03-16 16:02:34 +00:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

БНФ

<директива> ::= !$SPF  <тип>( <спец> [, <спец >])
<тип> ::= ANALYSIS (<спец1> [, <спец1 >]) | PARALLEL (<спец2> [, <спец2 >]) | TRANSFORM (<спец3>) | PARALLEL_REG <Идент> [,(спец5)] | 
          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)
<спец5> ::= [APPLY_REGION(спец6)], [APPLY_FRAGMENT(спец6)]
<спец6> ::= CODE_COVERAGE | WEIGHT (<Цифра>)


<редукция> := 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 объявлены непосредственно там (в том же модуле/функции/процедуре), где стоят эти директивы. Переменные из модулей могут быть включены под разным именем, в том числе и после переименования. Включение одних и тех же переменных несколько раз разрешается. Исключение и включение одной и той же переменной считается её исключением вне зависимости от порядка следования клауз.
  1. !$SPF ANALYSIS(PARAMETER(ident=expr))
    • Ставится только перед исполняемыми операторами
    • ident должен присутствовать в следующем операторе, а также должен являться переменной
    • все переменные из expr должны быть объявлены
  2. !$SPF TRANSFORM(SHRINK(TMP (1, 0)))
    • Ставится только перед циклом
    • Должен иметь список переменных, к которым он применяется
    • Перечисленные переменные должны содержаться только в тесно-вложенных циклах (свойство perfect для SgForStatement)
    • Нельзя иметь несколько таких директив перед одним циклом
    • Общий вид SHRINK(имя_массива(маска)), где маска вектор из 1 и 0 размера n, где n - общее количество измерений в имя_массива.