cdvmPDr (1158404), страница 3
Текст из файла (страница 3)
rg=0;
RMG_##rg=0;
3.4.5Удаленные ссылки
Удаленные ссылки заменяются на ссылки к соответствующему буферу.
3.5Редукционные операции
3.5.1Директива REDUCTION_GROUP
Контекст и синтаксис.
DVM(REDUCTION_GROUP) void * red-group-id;
Выход компилятора.
RedGroupRef red-group-id;
Замечание. Исходное описание заменено.
3.5.2Поддиректива REDUCTION
Контекст и синтаксис.
DVM( PARALLEL | TASK_REGION ... ;
REDUCTION [ red-group-id : ] red-operation...
... ) ...
Выход компилятора.
DVM_CREATE_RG(rg, (
DVM_RVAL(...) | DVM_RLOC(...) // for each operation
...
));
loop creation and mapping
DVM_REDUCTION20(loopid,rg); // insert to the group
loop headers and body
[ DVM_END_REDUCTION(); ] // synchronous reduction
Замечание. Макрокоманда DVM_CREATE_RG(rg,rvs) расширяется в
if(rg==0) rg=crtrg_(1,1);
(void)rvs;
Макрокоманда DVM_REDUCTION(loopid,rvs) расширяется в
{ RedGroupRef DVM_RG;
LoopRef DVM_LP0=0;
PSSpaceRef DVM_PSSpace=DVM_LP##loopid;
DVM_RG=crtrg_(1, 1);
(void)rvs;
DVM_INSERT_RV();
Макрокоманда DVM_REDUCTION20(loopid, rg) расширяется в
{ RedGroupRef DVM_RG=rg;
LoopRef DVM_LP0=0;
PSSpaceRef DVM_PSSpace=DVM_LP##loopid;
DVM_INSERT_RV();
rg=DVM_RG;}
Макрокоманда DVM_INSERT_RV() расширяется в
while(CDVM_TOP!=CDVM_BOTTOM) {
insred_( &DVM_RG, (RedRef*)CDVM_TOP, &DVM_PSSpace, 1);
}
Макрокоманда DVM_END_REDUCTION() расширяется в
{strtrd_(&DVM_RG);
waitrd_(&DVM_RG);
delrg_(&DVM_RG);}
}
3.5.3Редукционные переменные и операции
Контекст и синтаксис.
DVM(...; REDUCTION ... MAX(red-var) ... )
DVM(...; REDUCTION ... MIN(red-var) ... )
DVM(...; REDUCTION ... SUM(red-var) ... )
DVM(...; REDUCTION ... PROD(red-var) ... )
DVM(...; REDUCTION ... AND(red-var) ... )
DVM(...; REDUCTION ... OR(red-var) ... )
DVM(...; REDUCTION ... MAXLOC(red-var,loc-var) ... )
DVM(...; REDUCTION ... MINLOC(red-var,loc-var) ... )
Выход компилятора.
DVM_RVAR(rf_MAX,var,t,l)
DVM_RVAR(rf_MIN,var,t,l)
DVM_RVAR(rf_SUM,var,t,l)
DVM_RVAR(rf_PROD,var,t,l)
DVM_RVAR(rf_AND,var,t,l)
DVM_RVAR(rf_OR,var,t,l)
DVM_RLOC(rf_MAX,var,t,l,loc-var)
DVM_RLOC(rf_MIN,var,t,l,loc-var)
Замечание. Параметр t -- это код типа переменной (rt_INT, rt_LONG, rt_FLOAT, rt_DOUBLE). Параметр l -- это число элементов в red-var (если это массив) или 1. Макрокоманда DVM_RVAR(f,v,t,l) расширяется в
crtred_(f, &(v), t, l, 0, 0, 1)
Макрокоманда DVM_RLOC(f,v,t,l,loc) расширяется в
crtred_(f, &(v), t, l, &(loc), sizeof(loc), 1)
3.5.4Директива REDUCTION_START
Контекст и синтаксис.
DVM(REDUCTION_START red-group-id);
Выход компилятора.
DVM_REDUCTION_START(red-group-id);
Замечание. Выполнимая директива конвертируется в оператор. Макрокоманда DVM_REDUCTION_START(rg) расширяется в
strtrd_((RedGroupRef*) &rg)
3.5.5Директива REDUCTION_WAIT
Контекст и синтаксис.
DVM(REDUCTION_WAIT red-group-id);
Выход компилятора.
DVM_REDUCTION_WAIT(red-group-id);
Замечание. Выполнимая директива конвертируется в оператор. Макрокоманда DVM_REDUCTION_WAIT(rg) расширяется в
waitrd_((RedGroupRef*) &rg);
delrg_((RedGroupRef*) &rg);
rg=0;
3.6Неявные конструкции
3.6.1Создание и удаление распределенных массивов
Контекст и синтаксис.
array = malloc(dim1 *...* dimr * elem-size);
free( array );
Выход компилятора. Генерируются все или часть следующих операторов в зависимости от описания массива array.
[ DVM_CREATE_TEMPLATE(am,t,r,di); // implicit template ]
[ DVM_ONTO(ps,k,ls,hs); // target system ]
[ DVM_DISTRIBUTE(amv,ps,k,axs); // distribute template ]
[ DVM_GENBLOCK(am,ps,k,gbs); // GENBLOCK parameters ]
DVM_MALLOC(arr,r,len,dim,lw,hw,redis) // initialize array handler
[ DVM_ALIGN(arr,base,k,i,a,b) // align with template ]
Замечание. Макрокоманда DVM_MALLOC(arr,r,len,dim,lw,hw,redis) расширяется в
{crtda_( arr, 0, NULL, r, len, dim, 0, redis, lw, hw );
}
Макрокоманда DVM_ALIGN(arr,base,k,i,a,b) расширяется в
{align_( arr, &(base), i, a, b);
}
Макрокоманда DVM_FREE(arr) расширяется в
(delda_(arr));
3.6.2Статические распределенные массивы
Контекст и синтаксис.
DVM(DISTRIBUTE | ALIGN...)
element-type array-id "["const-dim"]"...;
Выход компилятора. Стандартная последовательность создания массива как и в случае malloc.
Замечание. Для глобальных описаний неявный malloc вставляется в начало функции main. Для локальных -- перед первым оператором блока.
3.6.3Доступ к распределенным данным
Контекст и синтаксис. Обычные ссылки на элементы массивов array[ind1]...[indr] с распределенным array. Допускается также специальная форма ссылок в виде макрокоманд array(ind1,...,indr) для моделирования динамических массивов.
Выход компилятора.
DAElm<r>(type,array-id,ind1,...indr)
Замечание. Это макрокоманды RTL.
3.6.4Собственные вычисления
Контекст и синтаксис.
lhs=rhs; // assignement
Выход компилятора.
if(DVM_ISLOCAL(lhs)) {
lhs = rhs ; }
DVM_ENDLOCAL();
Замечание. Оператор собственных вычислений это присваивание распределенному массиву в нераспределенной ветки программы. Оно должно "охраняться" проверкой локальности элемента. Макрокоманда DVM_ISLOCAL(a,r,ind) расширяется в
tstelm_(a, ind)
Макрокоманда DVM_ENDLOCAL() расширяется в
dskpbl_()
3.6.5Инициализация и завершение параллельного выполнения
Контекст и синтаксис.
int main( int argc, char ** arg)
{
declarations...
first-statement
...
[ exit(rc); ]
...
return rc;
}
Выход компилятора.
int main( int argn, char ** args)
{
declarations...
DVM_INIT(0,argn,args); // initialization of RTL
[ implicit static array creation ]
[ tracing of initialized variables ]
[ other implicit actions ]
first-statement
...
[ DVM_EXIT(rc); ] // exit through RTL
...
DVM_RETURN(rc); // exit through RTL
}
Замечание. Для генерации корректной программы функция main должна принимать параметры командной строки (которые затем будут переданы RTL) и должна завершаться оператором return или exit. Макрокоманда DVM_INIT(argn,args) расширяется в
{rtl_init(0L,argn,args);
}
Макрокоманда DVM_RETURN(r) расширяется в
{lexit_(r);}
Макрокоманда DVM_EXIT(r) расширяется в
{lexit_(r);}
3.6.6Функции ввода-вывода
Компиляция функций ввода-вывода сводится к переименованию функции iofun на ее RTL аналог dvm_iofun. Единственным исключением являются функции fread() и fwrite(), когда они применяются к распределенному массиву. В это случае массив читается или пишется целиком. Остальные параметры игнорируются.
3.7Отладочные расширения
3.7.1Анализатор производительности. Циклы
Контекст и синтаксис.
[ DVM(PARALLEL... ) ]
DO(var,first,last,step) // or
FOR(var,times)
loop-body
Выход компилятора.
BPLOOP(n) // for parallel loop or
BSLOOP(n) // for sequential loop
code for loop
ELOOP(n)
Замечание. Параметр n это порядковый номер цикла для идентификации парных команд. Множество циклов, для которых генерируются эти макрокоманды, зависит от параметров командной строки (-e1 ... -e4). Макрокоманда DVM_BPLOOP(n) расширяется в
bploop_(n);
Макрокоманда DVM_BSLOOP(n) расширяется в
bsloop_(n);
Макрокоманда DVM_ELOOP(n) расширяется в
eloop_(n, line);
3.7.2Анализатор производительности. Интервалы
Контекст и синтаксис.
DVM(INTERVAL [ int-expr ] )
{ C-statements }
Выход компилятора.
DVM_BINTER(n,v)
{ code for statements }
DVM_EINTER(n)
Замечание. Параметр n это порядковый номер цикла для идентификации парных команд. Если int-expr отсутствует, то параметр v будет иметь некоторое стандартное значение. Макрокоманда DVM_BINTER(n,v) расширяется в
binter_(n, v)
Макрокоманда DVM_EINTER(n) расширяется в
einter_(n,line )
3.7.3Отладчик. Трассировка данных
Контекст и синтаксис. Любая ссылка на обычную или распределенную переменную var в операторах СИ или инициализация переменной.
Выход компилятора.
DVM_STVA(type,rt,var,base,rhs) // lh-side of assignement
DVM_LDV(type,rt,var,base) // for read access
DVM_STV(type,rt,var,base) // to register initialization
Замечание. Множество ссылок, для которых генерируются эти макрокоманды, зависит от параметров командной строки (-d1 ... -d4). Макрокоманда DVM_LDV(type,rt,var,base) расширяется в
*(type*) ( ( DVM2A((long)&(var),rt) &&
dldv_(&CDVM_TOP[1],
(AddrType *)&CDVM_TOP[0],
(long *) base, #var, -1) && 0) ? 0 :
)
Макрокоманда DVM_STV(type,rt,var,base) расширяется в
( DVM2A((long)&(var), rt),
dprstv_(&CDVM_TOP[1], (AddrType *)&CDVM_TOP[0],
(long *) base, #var, -1),
dstv_())
Макрокоманда DVM_STVA(type,rt,var,base,rhs) расширяется в
( DVM2A((long)&(var), rt),
dprstv_(&CDVM_TOP[1], (AddrType *)&CDVM_TOP[0],
(long *) base, #var, -1),
(*(type *)(CDVM_TOP[0]) = rhs),
dstv_())
Такая ужасная конструкция появилась в результе попытки переноса под MS Visual-C 5.0. -- Необычный порядок вычисления операции-запятая.
3.7.4Отладчик. Трассировка вычислений
Контекст и синтаксис. Любой цикл или конструкция TASK_REGION.
Выход компилятора.
parallel loop creation
DVM_PLOOP(n,r,ls,hs,ss) // or DVM_SLOOP(n)
loop-headers
DVM_ITER(r,vars)
code for loop body
DVM_ENDLOOP(n)
для цикла или
DVM_BTASK(n) // in TASK_REGION header
...
DVM_ETASK(n)
ON-block or ON-loop body
...
DVM_NTASK(ind) // end of TASK_REGION construct
для конструкции TASK_REGION.
Замечание. Макрокоманда DVM_PLOOP(n,r,ls,hs,ss) расширяется в















