Сложные выражения в правилах выравнивания CDVMH
Компилятор CDVMH в данный момент допускает правила выравнивания строго в форме a*i+b
. При этом порядок слагаемых важен, индексная переменная i
не может размещаться в скобках, а коэффициент a
и свободный член b
должны быть единым выражением. Таким образом, если a
или b
не являются неотрицательными константами, то их необходимо поместить внутрь скобок (...)
.
Например, корректная запись директивы должны иметь вид:
#pragma dvm parallel ([i][j][k] on A[(-1) * i + (L-2)][j][k])
В этом случае a
получает значение -1
, а b
получает значение L-2
.
Следующие директивы ошибочны:
// Ошибка выполнения программы - неправильная запись правила выравнивания.
#pragma dvm parallel ([i][j][k] on A[L-2-(i)][j][k])
Все выражение L-2-(i)
будет рассматриваться компилятором как одно выражение (инвариантное для цикла) в правиле выравнивание, i
индексная переменная не будет обнаружена и выравнивания на итерацию цикла не будет. При этом такая программа может компилироваться успешно, но работать будет некорректно.
// Ошибка компиляции программы - неправильная запись правила выравнивания.
#pragma dvm parallel ([i][j][k] on A[L-2-i][j][k]
Будет выдана синтаксическая ошибка разбора данного выражения вида error #3431: Syntax error in mapping specification. Invalid axis mapping rule at column ...
.