fdvmDDr (1158419), страница 4
Текст из файла (страница 4)
Вызываются функции AlignTreeAlloc( ) и AlignAllocArray( ).
void AlignTreeAlloc ( align *root )
| root | - указатель на корень дерева выравнивания |
Осуществляет просмотр дерева выравнивания, создает распределенный массив для каждой вершины дерева, которая соответствует массиву без атрибута POINTER, вызывая функцию AlignAllocArray() .
| void AlignAllocArray( | align | *node, | ||
| node | - указатель на вершину дерева выравнивания, соответствующую | |||
| root | - указатель на вершину дерева выравнивания, соответствующую | |||
| nr | - число правил выравнивания | |||
| iaxis | - правила выравнивания (AxisArray(nr), CoefArray(nr), dvm000(iaxis+1),... | |||
| desc | - указатель на дескриптор (дескриптор – | |||
Генерирует операторы для создания объекта системы Lib-DVM и отведения памяти для динамического массива с атрибутом ALIGN и вставляет эти операторы в процедуру вместо оператора: pointer = ALLOCATE(desc,...).
| void ArrayHeader ( | SgSymbol | *ar, | ||
| ar | - указатель на символ массива | |||
| ind | - 0, если ar имеет атрибут POINTER | |||
Добавляет атрибут ARRAY_HEADER к символу распределенного объекта ar (ind – значение атрибута).
5.1.2Ссылки на распределенные массивы
| void DistArrayRef ( | SgExpression | *e, | ||
| e | - указатель на выражение, являющееся ссылкой на массив | |||
| modified | - признак, определяющий в правой или левой части оператора | |||
| st | - указатель на оператор, где встретилась ссылка e | |||
Линеаризует ссылку на элемент распределенного массива в правой части оператора присваивания, т.е. заменяет ссылку
A(I1,I2, ..., IN)
выражением
N
base(A(N+2) + I1 + A(N-j+2) * Ij )
i=2
где base - i0000m , если A имеет тип integer
r0000m , если A имеет тип real
d0000m , если A имеет тип double precision
c0000m , если A имеет тип complex
l0000m , если A имеет тип logical
| SgExpression *LinearForm ( | SgSymbol | *ar, | ||
| ar | - указатель на символ распределенного массива | |||
| el | - указатель на список индексов (I1,I2, ..., IN) ссылки на массив | |||
Генерирует выражение
N
A(N+2) + I1 + A(N-j+2) * Ij
i=2
где A - имя распределенного массива.
void ChangeDistArrayRef ( SgExpression *e )
| e | - указатель на выражение |
Просматривает выражение e и линеаризует каждую ссылку на элемент распределенного массива (вызывает DistArrayRef( )).
void ChangeDistArrayRef_Left ( SgExpression *e )
| e | - указатель на выражение |
Просматривает выражение e в левой части оператора присваивания и линеаризует ссылку на элемент распределенного массива (вызывает DistArrayRef( )).
void ChangeArg_DistArrayRef ( SgExpression *ele )
| ele | - указатель на выражение, которое является фактическим аргументом |
Просматривает выражение ele и линеаризует ссылки на распределенные массивы, за исключением ссылок на весь массив.
| void DebugVarArrayRef( | SgExpression | *e, | ||
| e | - указатель на выражение | |||
| stmt | - указатель на оператор, содержащий выражение e | |||
Функция просматривает выражение e и линеаризует каждую ссылку на элемент распределенного массива (вызывает DistArrayRef( )). Если задан режим отладки, эта функция вставляет перед оператором stmt операторы для проверки значений переменных во время выполнения программы в отладочном режиме.
| void DebugVarArrayRef_Left ( | SgExpression | *e, | ||
| e | - указатель на выражение в левой части оператора присваивания | |||
| stmt | - указатель на оператор, содержащий выражение e | |||
| stcur | - указатель на оператор, вслед за котором новые операторы | |||
Функция просматривает выражение e и линеаризует каждую ссылку на элемент распределенного массива. Если задан режим отладки, эта функция вставляет вслед за операторами stcur и stmt обращения к функциям отладчика для проверки значений переменных во время выполнения программы в отладочном режиме.
| void DebugArg_VarArrayRef ( | SgExpression | *ele, | ||
| ele | - указатель на выражение, которое является фактическим аргументом | |||
| stmt | - указатель на оператор, содержащий выражение e | |||
Функция просматривает выражение ele и линеаризует ссылки на распределенные массивы, за исключением ссылок на весь массив. Если задан режим отладки, эта функция вставляет перед оператором stmt операторы для проверки значений переменных во время выполнения программы в отладочном режиме.
5.1.3Параллельный цикл
void ParallelLoop ( SgStatement *stmt )
| stmt | - указатель на директиву PARALLEL |
Параллельный цикл:
*DVM$ PARALLEL (I1, ..., In) ON A(…)...
DO label I1 = ...
. . .
DO label In = ...
тело-цикла
label CONTINUE
транслируется в последовательность операторов:
[ ACROSS-block-1 ]
[ REDUCTION-block-1 ]
* создание параллельного цикла
ipl = crtpl(n)
[ SHADOW-RENEW-block-1 ]
[ SHADOW-START-block ]
[ SHADOW-WAIT-block ]
* отображение параллельного цикла (1)
it = mappl(ipl,A,...)
[ SHADOW-RENEW-block-2 ]
[ REDUCTION-block-2 ]
[ REMOTE-ACCESS-block ]
* запрос о продолжении выполнения параллельного цикла
lab1 if(dopl(ipl) .eq. 0) go to lab2
DO label I1 = ...
. . .
DO label In = ...
тело-цикла
label CONTINUE
go to lab1
* завершение параллельного цикла
lab2 it = endpl(ipl)
[ ACROSS-block-2 ]
[ REDUCTION-block-3 ]
Функция генерирует и вставляет в процедуру те операторы, которые предшествуют гнезду DO операторов. Кроме того, заменяются начальное значение, конечное значение и шаг управляющих переменных параллельного цикла. Операторы, следующие за последним оператором параллельного цикла
label CONTINUE
генерируются функцией TransFunc( ) во время обработки данного оператора.
Если задан режим отладки, создаются операторы CALL:
call dbegpl(...)
call diter(...)
call dendl(...)
, которые вставляются в блок (1) перед оператором IF, перед первым оператором тела параллельного цикла и после оператора
go to lab1
, соответственно.
Если задан режим анализа производительности, создаются операторы CALL:
call bploop(...)
call eloop(...)
, которые вставляются перед первым и вслед за последним операторами блока (1).
Для генерации блоков реализации спецификаций ACROSS, SHADOW_RENEW, REDUCTION и REMOTE_ACCESS, вызываются следующие функции:
DepList
ShadowList
doIfForReduction
ReductionList
RemoteVariableList
void ParallelLoop_Debug ( SgStatement *stmt )
| stmt | - указатель на директиву PARALLEL |
Если задан режим отладки, создаются операторы CALL:
call dbegpl(...)
call diter(...)
, которые вставляются перед гнездом операторов DO и перед первым оператором тела параллельного цикла, соответственно. Эта функция генерирует блоки операторов REDUCTION‑block-1 и REDUCTION-block-2, если необходимо.
Если задан режим анализа производительности, создаются операторы CALL:
call bploop(...)
call eloop(...)
, которые вставляются, соответственно, перед и после гнезда циклов DO.
| void ReductionList ( | SgExpression | *el, | ||
| el | - список редукций | |||
| gref | - указатель на выражение, являющееся ссылкой на группу редукций | |||
| st | - указатель на директиву PARALLEL со спецификацией REDUCTION, | |||
| stmt1 | - указатель на оператор, вслед за которым вставляются новые | |||
| stmt2 | - указатель на оператор, вслед за которым вставляются новые | |||
Для каждой редукции в списке el, функция генерирует и вставляет в процедуру следующие операторы:
* создание редукционной переменной
dvm000(irv) = crtrgf(reduction-function, red-var,…)
* включение редукционной переменной в группу
dvm000(i) = insred(gref,dvm000(irv),…)















