View
166
Download
0
Category
Preview:
Citation preview
РОЗПАРАЛЕЛЮВАННЯ ПРОГРАМ НА ФОРТРАНІ З ВИКОРИСТАННЯМ ТЕХНІКИ ПЕРЕПИСУВАЛЬНИХ ПРАВИЛ
A.Ю. Дорошенко, K.А. Жереб, Є.М. Туліка
1
Актуальність
Багато унаслідованого коду Виникав в ті часи, коли паралелізація була не
основним напрямком оптимізації
3
Цільова задача
Задача електронної густини Програма обчислює електронну та спінову
густину атомів поліциклічних ароматичних вуглеводнів на прямокутній сітці заданого розміру N
4
Як працюють переписувальні правила source [condition ] -> destination [action]
source – вхідний зразок; destination – вихідний зразок; condition – умова, що визначає застосовність
правила; action – дія, виконувана при спрацьовуванні
правила.
6
Генерація термів з коду на Фортрані
Використано компілятор GCC В свому арсеналі має десяток різних мов Має відкритий код
8
Методологія генерації термів
Перетворюємо програму на фортрані в проміжне представлення GCC GENERIC
З проміжного представлення генеруємо терм
9
Generic представлення
gcc --fdump-tree-original-raw exits (integer(kind=4) & restrict k)@1 function_decl name: @2 mngl: @3 type: @4 scpe: @5 srcp: ElDen.for:1294 args: @6 link: extern body: @7 @2 identifier_node strg: exits lngt: 5 @3 identifier_node strg: exits_ lngt: 6 @4 function_type size: @8 algn: 8 retn: @9 prms: @10 @5 translation_unit_decl@6 parm_decl name: @11 type: @12 scpe: @1 srcp: ElDen.for:1294 argt: @12 size: @13 algn: 64 used: 1 @7 bind_expr type: @9 vars: @14 body: @15…
10
Синтаксична модель програми
function_decl ( identifier(node1), name(identifier_node ( strg(exits), lngt(5) )), mngl(identifier_node ( strg(exits_), lngt(6) )), type(),
args(parm_decl (Еук identifier(node6), name(identifier_node ( strg(k), lngt(1) )), argt(2), algn(64), used(1) )), body(bind_expr (...)))
11
Розпаралелювання
DoCnt($var,$start,$end,$body,_MARK_Parallel)-> ParallelDoCnt($var,$start,$end,$body)
12
Вибір циклів для перетворення
В коді 54 цикли Використовуємо профілювання
для знаходження найбільш критичних фрагментів
Знаходимо всі цикли, що містять такі фрагменти 6 циклів
Вибрано другий ззовні цикл
DO IB=1,NZ DO KD=1,NY
DO … CALL
ELDENS PROCEDURE
ELDENS DO …
DO … DO
<hotspot>
13
Знаходження циклів
1. [_MarkHotspot($x):$y] -> _MarkHotspot([$x:$y])
2. [$x:_MarkHotspot($y)] -> _MarkHotspot([$x:$y])DoCnt($var,$start,$end, _MarkHotspot($body)] -> _MarkHotspot(DoCnt($var,$start,$end,$body, _MARK_CAND_PARALLEL))
3. Function($name, $params, $return,_MarkHotspot($body)) -> Function($name,$params,$return,$body, _MARK_PASSED)
4. [addItem($name)]Call($name,$params) [hasItem($name)] -> _MarkHotspot(Call($name,$params))
14
Генерація коду програми з терму
Терм розбивається на окремі лексеми Лексеми додаються до дерева синтаксису Код програми будується на основі
синтаксичного дерева
15
Recommended