Аутоматска паралелизацијаАутоматска паралелизација, такође аутопаралелизација, или паралелизација, користи се у контексту претварања секвенцијалног кода у вишенитни или векторски код (или чак оба), како би се симултано искористило више процесора у заједничкој меморији мултипроцесорске (СМП) машине. Циљ аутоматске паралелизације је да ослободи програмере од напорних и грешакама склоних процеса ручне паралелизације.[1] Иако је квалитет аутоматске паралелизације побољшан последњих неколико деценија, потпуна аутоматска паралелизација секвенцијалних програма компајлерима остаје велики изазов због потребе за комплексним анализама програма и непознатих фактора (као што је опсег улазних података ) током компилације.[2] Програмске контролне структуре на којима аутопаралелизација највише ставља акценат су петље, јер, генерално, највише времена извршења програма се одвија унутар неког облика петље. Постоје два основна приступа паралелизацији петље: угнежђена вишенитна обрада и циклична вишенитна обрада.[3] На пример, размотримо петљу која у свакој итерацији врши стотине операција, и траје хиљаду итерација. Ово се може посматрати као мрежа 100 колона од 1000 редова, укупно 100.000 операција. Циклична вишенитна обрада додељује сваки ред засебној нити. Линијска вишенитна обрада додељује сваку колону засебној нити. Циклична вишенитна обрадаЦиклична вишенитна обрада паралелног компајлера покушава да раздвоји петљу тако да се свако понављање може извршити на засебном процесору истовремено. Компајлер паралелне анализеКомпајлер обично спроводи две пролазне анализе пре стварне паралелизације како би се утврдило следеће:
Први пролаз компајлера обавља анализу зависности података петље да би се утврдило да ли се свака итерација петље може извршити независно од других. Зависности података се понекад могу разрешити, али то може да унесе додатно оптерећење у виду размене порука, синхронизације заједничке меморије, или неког другог начина процесорске комуникације. Други пролаз покушава да оправда напоре паралелизације упоређивањем теоријског времена извршавања кода након паралелизације са секвенцијалним временом извршења. Понекад се, у нескладу са интуицијом, код не побољшава паралелизацијом. Додатни рад узрокован коришећењем вишеструких процесора може да поништи потенцијална убрзања паралелизованог кода. ПримерПетља се зове DOALL ако се све њене итерације, у сваком призивању, могу упоредо извршити. Фортран код испод је DOALL, и компајлер га може аутоматски паралелизовати јер је свака итерација независна од других, а крајњи резултат низа do i = 1, n
z(i) = x(i) + y(i)
enddo
Постоји много пријатних паралелних проблема које имају такве DOALL петље. На пример, када рендеринг прати филм, сваки фрејм филма може независно да се искаже, а сваки пиксел појединачног оквира може бити независно исказан. Са друге стране, следећи код не може бити аутопаралелизован, јер вредност do i = 2, n
z(i) = z(i - 1)*2
enddo
То не значи да се код не може паралелизовати. Еквивалентно је do i = 2, n
z(i) = z(1)*2**(i - 1)
enddo
Међутим, садашњи компајлери паралелизације обично нису у стању да произведу аутоматску паралелизацију, а и питање је да ли ће тај код имати користи од паралелизације на првом месту. Угнежђено коришћење кодаУгнежђено коришћење кода паралелног компајлера покушава да расчлани редослед операција унутар петље у низ кодних блокова, тако да се сваки блок кода извршава на одвојеним процесорима истовремено. Постоје многи пријатно паралелни проблеми које имају такве релативно независне кодне блокове, посебно системи који користе цеви и филтере. На пример, при преносу телевизијког програма уживо, следећи задаци се морају обављати више пута у секунди:
Угнежђена вишенитна обрада паралелизирајућег компајлера може да додели сваку од ових 6 операција различитом процесору, можда уређехих у систолном низу, умећући одговарајући код да проследи излаз једног процесора на следећи процесор. Недавна истраживања су фокусирана на коришћење моћи ГПУ процесора[4] и вишејезгарних система[5] за израчунавање таквих независних кодних блокова (или једноставно независних итерација петље) у рунтиме. Меморија приступа (директно или индиректно) може бити једноставно обележена за различите итерације петље и може се поредити ради детекције зависности. Користећи ову информацију, итерације се групишу у нивое тако да су итерације истог нивоа независне једна од друге, те да се могу паралелно извршавати. ТешкоћеАутоматска паралелизација компајлерима или алатима је веома тешка из следећих разлога:[6]
ЗаобилазакЗбог својствених потешкоћа остваривања потпуно аутоматске паралелизације, постоји неколико лакших приступа да би се добио паралелни програм вишег квалитета. Они су:
Историјска паралелизација компајлераВећина истраживања компајлера за аутоматску паралелизацију разматра Фортран програме, јер Фортран чини јаче гаранције о алијасу него језици као што су C. Типични примери су:
Види јошРеференце
|
Portal di Ensiklopedia Dunia