cdvmDDr (1158400), страница 5
Текст из файла (страница 5)
Выход компилятора.
DVM_PAR_SHADOW_START(n,sg); // in loop header
Реализация.
Функция wfLXIsg проверяет sh-group-id и выдает сообщение, если он не определен или не специфицирован как SHADOW_GROUP.
Требуемые поддеревья строит функция wfSHSTART(). Окончательное построение выполняется функцией Ploop, когда цикл полностью разобран. Она вставляет ранее построенное поддерево в нужное место оболочки параллельного цикла.
3.3.7Директива SHADOW_WAIT
Контекст и синтаксис.
DVM(SHADOW_WAIT sh-group-id);
Выход компилятора.
DVM_SHADOW_WAIT(sg);
Замечание. Выполнимая директива конвертируется в оператор.
Реализация.
Функция wfLXIsg проверяет sh-group-id и выдает сообщение, если он не определен или не специфицирован как SHADOW_GROUP.
Требуемые поддеревья строит функция wfSHWAIT().
3.3.8Поддиректива SHADOW_WAIT
Контекст и синтаксис.
DVM(PARALLEL ... ; SHADOW_WAIT sh-group-id ...) ...
Выход компилятора.
DVM_PAR_SHADOW_WAIT(n,sg); // in loop header
Реализация.
Функция wfLXIsg проверяет sh-group-id и выдает сообщение, если он не определен или не специфицирован как SHADOW_GROUP.
Требуемые поддеревья строит функция wfSHWAIT(). Окончательное построение выполняется функцией Ploop, когда цикл полностью разобран. Она вставляет ранее построенное поддерево в нужное место оболочки параллельного цикла.
3.4Удаленный доступ
3.4.1Директива и поддиректива REMOTE_ACCESS
Контекст и синтаксис.
DVM(REMOTE_ACCESS ra-reference...)
C-statement
DVM(PARALLEL ... ;
REMOTE_ACCESS [ ra-group : ] ra-reference...
...) ...
ra-reference ::= array [ "["[expr]"]"... ]
Выход компилятора.
DVM_BLOCK_BEG();
DVM_REMOTE20(arr,buf,k,as,bs);
statements using remote referencies
DVM_BLOCK_END();
Реализация.
Функция wfREMOTE() проверяет индексные выражения и выдает сообщение, если они некорректны. Она также сохраняет информацию, необходимую для распознавания и преобразования удаленных ссылок.
Требуемые поддеревья строит функция mk_remote(dir,oper). Она использует функции:
-
mk_rabufid(lx,n) генерирует идентификатор буфера удаленного доступа;
-
mk_radcl(ra) порождает описания буферов;
-
mk_racrt(ra,rg) порождает операторы для создания буферов.
3.4.2Директива REMOTE_GROUP
Контекст и синтаксис.
DVM(REMOTE_GROUP) void * ra-group-id;
Выход компилятора.
RegularAccessGroupRef ra-group-id;
long RMG_ra-group-id;
Замечание. Исходное описание заменено. Для операций PREFETCH и RESET требуется вспомогательная переменная, управляющая операциями обновления буферов.
Реализация.
Функция ISWFdcltr проверяет (кроме прочего), что ra-group-id описан как void *, и выдает сообщение, если это не так.
Функция crRef(N,type) заменяет тип "void*" на тип "RegularAccessGroupRef" и порождает описание вспомогательной переменной "RMG_...". Функция crRMGdcltrs(N) генерирует ее декларатор.
3.4.3Директива PREFETCH
Контекст и синтаксис.
DVM(PREFETCH ra-group-id );
Выход компилятора.
DVM_PREFETCH(rg);
Замечание. Выполнимая директива конвертируется в оператор.
Реализация.
Функция wfLXIag проверяет ra-group-id и выдает сообщение, если он не определен или не специфицирован как REMORE_GROUP.
Требуемые поддеревья строит функция wfPREFETCH().
3.4.4Директива RESET
Контекст и синтаксис.
DVM(RESET ra-group-id );
Выход компилятора.
DVM_RESET(rg);
Замечание. Выполнимая директива конвертируется в оператор.
Реализация.
Функция wfLXIag проверяет ra-group-id и выдает сообщение, если он не определен или не специфицирован как REMORE_GROUP.
Требуемые поддеревья строит функция wfRESET().
3.4.5Удаленные ссылки
Удаленные ссылки заменяются на ссылки к соответствующему буферу.
Реализация.
-
Функция inRemote() ищет объемлющую директиву REMOTE_ACCESS;
-
RAfind(N,ra) ищет в директиве подходящий образец удаленной ссылки;
-
RAcmpR(N,ra) сравнивает ссылку с образцом;
-
RAsubstR(N,ra,bufid) создает ссылку на буфер удаленного доступа bufid.
3.5Редукционные операции
3.5.1Директива REDUCTION_GROUP
Контекст и синтаксис.
DVM(REDUCTION_GROUP) void * red-group-id;
Выход компилятора.
RedGroupRef red-group-id;
Замечание. Исходное описание заменено.
Реализация.
Функция ISWFdcltr проверяет (кроме прочего), что red-group-id описан как void *, и выдает сообщение, если это не так.
Функция crRef(N,type) заменяет тип "void*" на тип "RedGroupGroupRef".
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
Реализация.
Требуемые поддеревья строит функция wfREDUCTION, а именно, создается список макрокоманд DVM_RVAR или DVM_RLOC для всех редукционных операций в директиве. Окончательное построение выполняется функцией Ploop, когда цикл полностью разобран. Она вставляет ранее построенное поддерево в нужное место оболочки параллельного цикла, в зависимости от того, является ли редукция синхронной или асинхронной.
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.
Реализация.
Функция cRG0() строит макрокоманду DVM_RVAR или DVM_RLOC для одной операции в списке. Ее первый параметр - имя операции - порождается функцией rts_name(t). Функция cRG(Ad,N) создает список макрокоманд для всех операций в директиве.
3.5.4Директива REDUCTION_START
Контекст и синтаксис.
DVM(REDUCTION_START red-group-id);
Выход компилятора.
DVM_REDUCTION_START(red-group-id);
Замечание. Выполнимая директива конвертируется в оператор.
Реализация.
Функция wfLXIrg проверяет red-group-id и выдает сообщение, если он не определен или не специфицирован как REDUCTION_GROUP.
Требуемые поддеревья строит функция wfRSTART().
3.5.5Директива REDUCTION_WAIT
Контекст и синтаксис.
DVM(REDUCTION_WAIT red-group-id);
Выход компилятора.
DVM_REDUCTION_WAIT(red-group-id);
Замечание. Выполнимая директива конвертируется в оператор.
Реализация.
Функция wfLXIrg проверяет red-group-id и выдает сообщение, если он не определен или не специфицирован как REDUCTION_GROUP.
Требуемые поддеревья строит функция wfRWAIT().
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 ]
Реализация.
Функция ISWF проверяет параметр malloc, левую часть присваивания и выдает сообщение, если:
-
параметр не записан в виде произведения;
-
слишком много или слишком мало сомножителей-размерностей;
-
последний сомножитель не записан в форме sizeof(...) (предупреждение).
Требуемые поддеревья строит функция mk_alloc(lhs,parm). Она вызывает функции mk_templ и mk_genblock, и использует поддерево, построенное для предложения ONTO директивы DISTRIBUTE.
3.6.2Статические распределенные массивы
Контекст и синтаксис.
DVM(DISTRIBUTE | ALIGN...)
element-type array-id "["const-dim"]"...;
Выход компилятора. Обычная последовательность действий, как в случае malloc.
Замечание. Для глобальных описаний неявный malloc вставляется в начало функции main. Для локальных -- перед первым оператором блока.
Реализация.
Функция ISWFdcltr (кроме прочего) определяет, не является ли декларатор "статическим". В этом случае она строит поддерево для неявного создания и с помощью функции addIMloc сохраняет его во временном глобальном или локальном списке и выдает сообщение, если точка вставки уже пройдена. Операторы будут вставлены в нужное место функцией genIMglob или genIMloc
3.6.3Доступ к распределенным данным
Контекст и синтаксис. Обычные ссылки на элементы массивов array[ind1]...[indr] с распределенным array. Допускается также специальная форма ссылок в виде макрокоманд array(ind1,...,indr) для моделирования динамических массивов.
Выход компилятора.
DAElm<r>(type,array-id,ind1,...indr)
Замечание. Это макрокоманды RTL.















