radixx sortiranje
TRANSCRIPT
-
8/18/2019 radixx sortiranje
1/50
-
8/18/2019 radixx sortiranje
2/50
1. Uvod
ee od naj/e%e ori%teni operacija pri ra!li/itim o(radama podataa su poranjivanje i pronalaenje podataa6 %to !apravo poa!uje vanost ori%tenja e7iasni
algoritama !a tave manipulacije podacima. Budui da je sortiranje jedna vrlo vana i u
ra/unarsim o(radama podataa /esto ori%tena operacija6 ra!umljivo je da je ra!vijeno
mnogo algoritama !a sortiranje. 'i algoritmi se ra!liuju prije svega po svojoj e7iasnosti6 a
naravno i po sloenosti njiove implementacije. 8e9utim6 vrlo je vano istanuti da svai od
ti algoritama ima svoje prednosti i svoje nedostate6 %to !apravo !na/i da je priladan i
optimalan i!(or algoritma sortiranja ovisan o svaoj onretnoj situaciji. U ovom raduimplementirana su 2 algoritma !a sortiranje Bitonic i Radix sort. :(a algoritma se temelje na
paralelnoj i!ved(i6 te su jao pogodna !a sortiranje. U prvom dijelu rada o(jasnit e se na/in
i!vo9enja o(a algoritma6 te tenie i alati oji se oriste6 a u drugom dijelu vr%it e se njiova
uspored(a na na/in da e se mjeriti vremena i!vo9enja. )evencijalna i paralelna*C11+
implementacija su implementirane u $isual )tudiu 2&12 C ;; 6 do je paralelna *CU#A
i!ved(a+ implementirana preo testnog servera.
Bitonic sort algoritam radi na principu spajanja dva sortirana ni!a duine 2i
-
8/18/2019 radixx sortiranje
3/50
2. Algoritmi sortiranja
a sortiranje ni!a elemenata predloen je velii (roj ra!li/iti algoritama. )a gledi%taardverse implementacije najpogodniji su algoritmi oji se reali!iraju pomou mrea !a
sortiranje6 ao %to su Radix sort6 =eap sort6 8erge sort6 Bitonic sort. aime6 mree !a
sortiranje su di!ajnirane tao da omoguavaju paralelnu reali!aciju6 %to !na/ajno srauje
vrijeme potre(no !a sortiranje ni!a elemenata. Poa!ano je da je Radix sort algoritam
naje7iasniji !a sortiranje velii ni!ova6 do !a ni!ove manje duine Bitonic sort algoritam
omoguava naj(re do(ivanje re!ultata.
2.1 Bitonic sortiranje
Bitonic sort je jao pogodan algoritam !a paralelnu i!ved(u na procesoru6 a pose(no !a
i!ved(u na gra7i/oj artici. Postupa sortiranja je sljedei. Ao imamo ni! (rojeva a &6
a16......6 an
1. Ao postoji inedex i6 taav da je 0≤i≤n−1 taav da vrijedi?
a+ Podni! a&6.....a j monotono rastui (+ Podni! a j6......an
-
8/18/2019 radixx sortiranje
4/50
Slika 1.Bitonic sortiranje ulazno-izlazno sortiranog niza
)ljedei primjer poa!uje princip (itonic sortiranja ni!a oji je nesortiran tj. nije podijeljen u
(itoni/e sevence. Pretpostavimo da tre(amo sortirati ni! od 0 (rojeva> "6 36 06 -6 46 16 56 2.
)ortiranje je pria!ano na sljedeoj slici.
Slika 2. Bitonic sortiranje neuređenog niza.
Ao imamo n 2 elemenata u listi6 moramo upotrije(iti 2 D2 2
2
-
8/18/2019 radixx sortiranje
5/50
n+1log ¿¿¿n¿log ¿
k (k +1)2
=¿
i odatle slijedi da je vremensa sloenost algoritma E*log2n+. F5G
5
-
8/18/2019 radixx sortiranje
6/50
2.2 Radix sortiranje
Hod algoritma Radix sort ula!ni elementi se ne tretiraju ao cjeline6 nego se sortiranje
temelji na odvojenim anali!ama !naova na odgovarajuim po!icijama. Pretpostavimo da su
lju/evi pria!ani ao decimalni (rojevi6 pri /emu se !a pria! svaog lju/a oristi
!nameni>
d
I&6....6I,. U narednom orau se u!imaju elementi i! ni!a i ponovno ra!vrstavaju u redove6
suladno vrijednosti druge !namene d1. aon drugog ra!vrstavanja6 redovi se ponovno
spajaju u jedan ni!. Postupa se nastavlja !a sve ostale !namene> d 26 d36 ...d
-
8/18/2019 radixx sortiranje
7/50
Slika
3.Primjer Radix sortiranja
2.2.1 Counting sortiranje
Countig sort algoritam u!ima ni! A od
-
8/18/2019 radixx sortiranje
8/50
vrijednost indesa -j od C odgovara olio se puta -j pojavio u ni!u A. $rijeme i!ved(e ovog
oraa je :*n+.
A:
C:
Slika . Princi! iz"ed#e !r"og koraka kod counting sortiranja
Had smo do(ili ni! C6 tada ga moramo onstruirati na na/in da svai element
-
8/18/2019 radixx sortiranje
9/50
Slika (. Princi! iz"ed#e za"r)nog koraka kod counting sortiranja
3. aralelni !rograms"i je#ici
U ovom poglavlju (it e predstavljene dvije ariteture C11 standard i CU#A
aritetura oje se temelje na paralelnoj i!ved(i u programsom je!iu C;;. :(e ariteture
su testirane na radix i (itonic sortiranju i uspore9ene su (r!ine i!vo9enja. CPU i LPU
ariteture dijele isti osnovni model i!vr%avanja. Posjeduju preu!mi i dovati instruciju6
oju tre(aju i!vr%iti te oriste nei ontest i!vr%avanja ili registre.
3.1 CU$A !rograms"i model
Hao odgovor na trend ori%tenja gra7i/i procesora u openite svre ra/unanja6
vidia je porenula CU#A
-
8/18/2019 radixx sortiranje
10/50
-
8/18/2019 radixx sortiranje
11/50
memorija (loa vidljiva je svim dretvama u (lou i o(i/no ima mnogo manje vrijeme
a%njenja *eng. latencO+ od glo(alne memorije pa se oristi ao priru/na memorija (loa te
moe posluiti !a u(r!avanje i!vr%avanja i u/inovitu omuniaciju me9u dretvama (loa.
#retve u pojedinom (lou mogu se sinroni!irati po!ivom ugra9eni 7uncija !a
sinroni!aciju /ime se osigurava da nijedna dretva nede nastaviti s i!vr%avanjem do sve
dretve nisu do%le do sinroni!acijse granice. )inroni!acija je neopodna pri ori%tenju
dijeljene memorije. aon prola!a sinroni!acijse granice6 sve dretve mogu u dijeljenoj
memoriji (loa vidjeti memorijse !apise ostali dretvi (loa oje su napravljene prije
sinroni!acije i na taj na/in mogu me9uso(no omunicirati. Llo(alna memorija !ajedni/a je
dretvama svi (loova u re%eti i oristi se !a pri(avljanje ula!ni podataa i !apisivanje
rajnji re!ultata. 8emorijsi prostor !a onstante6 testure te loalna i glo(alna memorija
7i!i/i se nala!e u #RA8 memoriji na gra7i/om ure9aju6 ali onstantama i testurama se
pristupa preo priru/ne memorije te se tao u(r!ava njiovo dovaanje. #retve oje se
i!vode na LPU i! memorija !a onstante i testure mogu samo /itati do u ostale memorije
mogu i pisati.F2G F3G
Registri
Registri su najbrža memorija, sa pristupom bez
ikakve letencije na svakom ciklusu takta, kao i na
regularnom CPU. Registri i dretve se ne mogu dijeliti
s drugim dretvama
Dijeljena memorija
#ijeljena memorija je usporediva sa 1 e% memorijom na CPU.ei (li!u multiprocesora i ima veoma rata pristup vremena.#ijeljena memorija se dijeli me9u svim dretvama na !adanom
(lou
Globalna memorije
Llo(alna memorija lei na ure9aju6 ali van /ipa multiprocesora6tao da je vrijeme pristupa 1&& puta vee nego na dijeljenojmemorije
Lokalna memorija
)peci7i/na memorija dretvi gdje se /uva glo(alna memorija.
$arija(le se /uvaju u loalnoj memoriji dretvi ao ompajlerodlu/i da nema dovoljno registara da /uvaju podate dretvi.
Konstantna
memorija
-4 onstante memorije se /uva van /ipa multiprocesora imemorija je oja se samo /ita. =ost od pi%e u onstantumemoriju prije lansiranja ernela6 a ernel moe /itati ovumemoriju. Honstantna memorija je e%irana. )vai multiprocesormoe e%irati do 0 onstantne memorije tao da /itanja saonstantne memorije mogu (iti veoma (r!a. )ve dretve imaju
pristup onstantnoj memoriji.Teksturna
memorija )pecijali!irana memorija !a povr%inso mapiranje testura
11
-
8/18/2019 radixx sortiranje
12/50
a#lica 1. rste memorije na /P0 i njio"o !oja)njenje
12
-
8/18/2019 radixx sortiranje
13/50
-
8/18/2019 radixx sortiranje
14/50
1+ 8anje vremena od!iva. $i%enitna tenia omoguava interativnim apliacijama da
nastave rad6 /a i ada je dio programa (loiran ili i!vr%ava neu dugotrajnu
speci7i/nu operaciju. a primjer6 vi%enitni Ne( /ita/ moe da nastavi interaciju s
orisniom u jednoj niti6 do druga nit simultano u/itava neu veliu sliu sa
nterneta6 trea sljedeu sliu itd.
2+ onomi/nost. :gleda se u dijeljenju prostora i resursa ao i u%tedi vremena oje
tao9er drasti/no uti/e na per7ormanse. iti dijele memoriju i sve ostale resurse oji
pripadaju istom procesu.
3+ sori%tavanje vi%eprocesorse ariteture. Bilo oje niti mogu se istovremenoi!vr%avati6 svaa na ra!li/itom procesoru. Podr%a !a orisni/e niti reali!iraju se
preo (i(liotee !a rad s orisni/im nitima. :va (i(liotea omoguava podr%u !a
stvaranje niti6 raspored i!vr%avanja niti i upravljanje nitima6 ali (e! utjecaja je!gre.
@o% nee od prednosti dretvi su sljedee> (olja isoristivost prirodne onurentnosti programa
*dole je jedna dretva (loirana6 ostale se dretve !a to vrijeme mogu normalno i!voditi+ te
modularni model programiranja *rastavljanje programa na dijelove *module+ oji /ine!ase(ne cjeline+. 8ana je u vremenu potre(nom !a sinroni!aciju dretvi. 'ao9er6 uvo9enje
dretvi u svru rje%avanja neog pro(lema moe i!a!vati nee posve nove i!nenadne pro(leme
/iji opseg je te%o predvidjeti ili i!mjeriti. U velioj mjeri oristi se ve gotov od oji ne
mora uvije (iti siguran !a ori%tenje u dretvama. Hreiranje rje%enja neog pro(lema
!atijeva paljivo planiranje i ra!mi%ljanje. 8ana je i oteano de(uggiranje *tj. traenje i
otrivanje neispravnosti i pogre%aa te njiovo ulanjanje odnosno popravljanje od strane
ompajlera+. aime6 de(uggiranje nepovratno mijenja vrijeme doga9aja. $i%enitno
programiranje predstavlja pisanje tavi programa oji se sastoje od vi%e ooperativni
procesa i niti oje se i!vr%avaju simultano ili paralelno6 pri tom oristei !ajedni/e resurse
ra/unalnog sistema. U vi%enitnim apliacijama6 niti su distri(uirane preo vi%e procesora *ao
su raspoloivi+6 tao da se vi%e tasova moe i!vr%avati onurentno6 omoguavajui
apliacijama da o(avljaju posao vi%e e7iasno.
14
-
8/18/2019 radixx sortiranje
15/50
. (i!ovi !araleli#ma
Paralelna o(rada je postupa od ojega se vi%e instrucija o(ra9uje istovremeno.
:(rada se !asniva na principu da se velii pro(lemi gotovo uvije mogu podijeliti na manje
te onda o(raditi istovremeno. U posljednje vrijeme paralelna o(rada je postala vodea
paradigma u ra/unalnim ariteturama6 najveim djelom u o(liu vi%eje!greni procesora.
pa je potro%nja u paralelnim ra/unalima postala !a(rinjavajua. Paralelne ra/unalne
programe je mnogo tee ra!vijati nego sevencijalne !ato %to istodo(nost uvodi neolio
novi lasa potencijalni so7tversi (ugova od oji su race conditionQ naj/e%i.
Homuniacija i sinroni!acija i!me9u ra!li/iti pod!adataa je jedno od najvei ograni/enja
!a do(ivanje do(ri per7ormansi paralelnog programa. Postoji neolio tipova paralelne
o(rade oji se naj/e%e oriste a to su>
1+ Paraleli!am na ra!ini (ita?:d otria tenologije integracije vrlo visoog stupnja proi!vodnje ra/unalni /ipova
1,"&
-
8/18/2019 radixx sortiranje
16/50
imati do ra!li/iti instrucija u ra!li/itim stadijima i!vo9enja. Hanonsi primjer
procesora sa cjevovodima je R)C procesor sa pet stadija> dovaanje instrucije6
deodiranje6 i!vr%avanje6 pristup memoriji i !apisivanje na!ad. Procesor Pentium 4
ima 35
-
8/18/2019 radixx sortiranje
17/50
-
8/18/2019 radixx sortiranje
18/50
).1 Se"vencijalne im!lementacije algoritama
B/(0/C S0R(/RA
void merge_up!int -data,intn" $$vr%imo sortiranje ulazno
int j=/,k=/#
int step=n$
0ile !step /"
'or !int i=/#i2n#i3=step-&" $$dijeljenje niza u podnizove
j=i#
'or !k=/#k 2 step#k33"
i' !data4j5 data4j3step5" $$uporedizamijeni
int tmp=data4j5#
data4j5=data4j3step5#
data4j3step5=tmp#
10
-
8/18/2019 radixx sortiranje
19/50
6
j33#
6
6
step$=
6
6
Tuncija merge u! ao parametar u!ima veli/inu ni!a i tu veli/inu (itoni/i sortira ula!no6
sli/no radi i 7uncija merge+do,n tj. sortira (rojeve sila!no. :snovna pro(lematia ove
7uncije je u tome %to ni! ojeg elimo sortirati mora (iti podijeljen u (itoni/esevence*sortiran ula!no
-
8/18/2019 radixx sortiranje
20/50
merge_up!!data 3 i", s"#
i' !s2n"
merge_don!!data 3i 3s",s"#
6
6
6
6
Budui da ni! nije sortiran *ula!no
-
8/18/2019 radixx sortiranje
21/50
provjera se je li sljedei /lan vei od max6 ao jeste u varija(lu max sprema se taj (roj.
a raju ad T:R petlja pro9e ro! cijeli ni!6 7uncija getmax vraa vrijednost najveeg
(roja u ni!u.
Tuncija count+sort radi counting sortiranje ali po !namenci6 me9utim !ajedni/om
implementacijom s radix sortom i!vr%ava se cjeloupno sortiranje. ajvaniji dio ove
7uncije je pre7ix sum6 jedan od najvaniji (loova !a gra9enje paralelni algoritama. Ao
imamo ni! a od n elemenata Fa&6 a16......6 an
scan(a,3"=48, :, 11, 11, 1
-
8/18/2019 radixx sortiranje
22/50
int ind=!arr4i5$ep"*base# $$koristi modul da prona>e znamenku
count4ind533# $$uve?avamo broja@ za pojedinu znamenku
6
'or!int i = 1# i 2 base# i33"
count4i5 3= count4i15# $$radi inclusive sum operaciju
'or!int i = n1# i = /# i" $$radi counting sort koji se
int ind=!arr4i5$ep"*base# implementira zajedno s radiom
output4count4ind515 = arr4i5#
count4ind5#
6
'or!int i = /# i 2n#i33"
$$vra?amo nazad sortirani niz po znamenci
arr4i5 = output4i5#
6
6
22
-
8/18/2019 radixx sortiranje
23/50
)ljedea najvanija 7uncija je radix+sort. U spomenutoj 7unciji se i!vr%ava cjeloupno
sortiranje. #ale pretodne dvije 7uncije se po!ivaju unutar ove 7unciji. U T:R petlji se !a
svau !namenu *jedinice6 desetice6 stotice...+ vr%i sortiranje i sortirani ni! se prenosi !a
sortiranje po sljedeoj !namenci. Had se o(avi sortiranje po !adnjoj !namenci6 tada do(ivamo
ona/an sortiran ni! (rojeva.
void radi_sort!intarr45,intn"
int m = get_ma!arr,n"# $$najveci broj u nizu spremamo u varijablu m
int- output = !int-"malloc!n-sizeo' !int""#
$$radimo counting sort za svaku znamenku
$$ umjeto broja prenosimo ep 1/Ai gdje je i trenutna znamenka
'or!int ep = 1# m$ep /# ep-= base"
count_sort!arr,n,ep,output,pom"#
6 'ree!output"#
23
-
8/18/2019 radixx sortiranje
24/50
U sljedeoj ta(lici (it e predstavljena vremena sevencijalne i!ved(e (itonic i radix
sortiranja. a ra/unanje vremena i!ved(e u!eti su random (rojevi gdje je najmanja vrijednost
&6 a najvea vrijednost 32"-0. $remena u ta(lici su i!raena u seundama.
Se"vencijalna
i#ved*a532.678 -21) 51.98.)67 -229 533.)).32 -22)
Bitonic sortiranje &6&5s 2631 s 0061& s
Radix sortiranje &6&1 s &633 s 1&610 s
a#lica 2. estiranje sek"encijalne im!lementacije #itonica i radixa za razli,ite nizo"e
Bitonic sort
Radi=sort!rijeme i"vedbe usekundama
/ra4ikon 1./ra4i,ki !rikaz #rzine sortiranja sek"encijalne iz"ed#e za
niz od 32.*(5#roje"a
Bitonic sort
Radi=sort!rijeme i"vedbe usekundama
/ra4ikon 2./ra4i,ki !rikaz #rzine
sortiranja sek"encijalne iz"ed#e za
niz od 1.65.'*( #roje"a
24
-
8/18/2019 radixx sortiranje
25/50
Bitonic sort
Radi=sort!rijeme i"vedbe u sekundama
/ra4ikon 3./ra4i,ki !rikaz #rzine
sortiranja sek"encijalne iz"ed#e za
niz od 33.''.32 #roje"a
25
-
8/18/2019 radixx sortiranje
26/50
).2 aralelne -C11 standard im!lementacije algoritama
B/(0/C S0R(/RA
)ljedei odsje/a oda predstavlja paralelnu i!ved(u (itonic sortiranja. #ale u main
programu su delarirane i inicijali!irane tri niti oje e odraditi sortiranje.
stdt0read t1,t&,t8# $$deklaracija 8 dretvet1=t0read!bitonic_sort_up,data,n$&"# $$dretva 1 sortira niz od / do n$&t&=t0read!bitonic_sort_don,data,n$&"# $$dretva & sortira niz od n$& do n
t1.join!"#$$main program ceka na potpuno izvr%enje dretve 1t&.join!"#$$main program ceka na potpuno izvr%enje dretve &
t8=t0read!merge_up,data,n"# $$dretva 8 sortira bitoni@ki nizt8.join!"#
Tuncije inicijali!acija6ispisni!a o(avljaju isti !adata ao u pretodnom sortiranju. Hod je
implementiran tao da se preo 3 instrucijse niti sortira ni!. aon sortiranja ni!a moe se
primijetiti !natna (r!ina i!ved(e u odnosu na sevencijalnu i!ved(u ali !a ni!ove vee od 2 2&
jer je !a manje ni!ove (r!ina gotovo identi/na. )ljedea slia pria!uje princip sortiranje
preo tredova.
Slika 5. Princi! !aralelnog #itonic sortiranja
a slici 0 moemo vidjeti 3 (loa oji predstavljaju 3 niti. Prva nit sortira ni! ula!no ali od &
do polovice ni!a. #ruga nit sortira ni! od polovice do raja sila!no. :ve dvije niti se
paralelno i!vr%avaju. aon %to se one i!vr%e6 na red dola!i trea nit. 'rea nit odradi lasi/nimerge sort !a ni! oji je podijeljen u dvije (itoni/e sevence.
-
8/18/2019 radixx sortiranje
27/50
RA$/4 S0R(/RA
Hod paralelne i!ved(e radix sorta *C11 standard+ ori%tene su tri niti. Prva nit e sortirat prvu
polovicu ni!a6 do e druga nit sortirati drugu polovicu ni!a. 'e dvije niti e se i!vr%avat
paralelno6do trea nit /ea njiovo i!vr%avanje. aon !avr%eta poree se trea nit oja e
odrediti merge sort na dva sortirana podni!a.
1, 3- 42 2& 2, 35 1" 14 2" 3"
U pretodnoj ta(lici nala!i se ni! od 1& (rojeva *1,6 3-6 426 2&6 2,6 356 1"6 146 2"6 3"+. Prva
nit e sortirati prvi 5 (rojeva6 do e druga nit sortirati !adnji 5 (rojeva
$:# ' 1 $:# ' 2
Had niti !avr%e sa svojim dijelom sortiranja6 tada emo do(iti 2 sortirana podni!a6 te se tada
poree trea nit oja odradi merge sort
$:# ' 3
1, 2& 2, 3- 42 14 1" 2" 35 3"
Hona/no ad trea nit odradi lasi/ni merge sort do(ivamo sortirani ni! od 1& elemenata
14 1" 1, 2& 2" 2, 35 3- 3" 42
)ljedei odsje/a predstavlja po!ivanje niti u main programu6 oje i!vode pretodne !adate.
'or!int i = /# i 2 n$ i33"
pom14i5=rand!"# $$uzimamo random brojeve za prvu polovicu nizapom&4i5=rand!"# $$uzimamo random brojeve za drugu polovicu niza
6
stdt0read t1,t&,t8# $$deklariramo 8 nitit1=t0read!radi_sort,pom1,n$&"# $$prva nit sortira prvi nizt&=t0read!radi_sort,pom&,n$&"# $$druga nit sortira drugi niz
t1.join!"#t&.join!"#
t8=t0read!merge,pom1,n$&,pom&,n$&,arrsorted"#$$tre?a nit radi merge sort prvog it8.join!"# drugog niza
35 1" 14 2" 3"1, 3- 42 2& 2,
-
8/18/2019 radixx sortiranje
28/50
C11 standard 532.678 -21) 51.98.)67 -229 533.)).32 -22)
Bitonic sortiranje &6&41 s 1622 s 206"1 s
Radix sortiranje &6&1 s &6&3 s 5621 s
U sljedeoj ta(lici (it e predstavljena vremena paralelne C11 i!ved(e (itonic i radix
sortiranja. a ra/unanje vremena i!ved(e u!eti su random (rojevi gdje je najmanja vrijednost
&6 a najvea vrijednost 32"-0. $remena u ta(lici su i!raena u seundama.
a#lica 3. estiranje !aralelne $11 im!lementacije #itonica i radixa za razli,ite nizo"e
Bitonic sort
Radi=sort!rijeme i"vedbe u sekundama
/ra4ikon . /ra4i,ki !rikaz #rzine
sortiranja $11 im!lementacije za
niz od 32.*(5 #roje"a
Bitonic sort
Radi=sort!rijeme i"vedbe u s ekundama
/ra4ikon '. /ra4i,ki !rikaz #rzine
sortiranja $11 im!lementacije za
niz od 1.65.'*( #roje"a
Bitonic sort
Radi=sort!rijeme i"vedbe u sekundama
/ra4ikon (. /ra4i,ki !rikaz #rzine
sortiranja $11 im!lementacije za
niz od 33.''.32 #roje"a
-
8/18/2019 radixx sortiranje
29/50
).3 aralelne -CU$A i#ved*a im!lementacije algoritama
.
B/(0/C S0R(/RA:
DdeEne FGRHIJK 1/&:DdeEneBLMCNK 8&9;ODdeEneUQ_)ILKFGRHIJK-BLMCNK $$niz podijeljen na 8&9;O blokova po 1/&: niti
__global__ void bitonic_sort_korak!int -data, int j, int k" $$jezgrena 'unkcija
int i, ij#i = t0readd. 3 blockJim. - blockd.#$$svaka nit predstvlja jedan element u blokuij = iAj#i' !!ij"i"
i' !!iSk"==/" $$ulazno sortiranje
i' !data4i5data4ij5"
int temp = data4i5#data4i5 = data4ij5#data4ij5 = temp#
66else $$silazno sortiranje
' !data4i52data4ij5"
int temp = data4i5#data4i5 = data4ij5#data4ij5 = temp#
66
6
void bitonic_sort!int -values"
int -data#int n = UQ_)ILK - sizeo' !int"#cudaQalloc!!void--" Sdata, n"#
$$vr%imo prijenos iz radne u globalnu memorijucudaQemcpT!data, values, n, cudaQemcpTGostFoJevice"#
$$konEguracija jezgrene 'unkcijedim8 blocks!BLMCNK,1"#dim8 t0reads! FGRHIJK,1"#int j, k#'or !k = k 2=UQ_)ILK# k-=&"
'or !j=k$ j/# j$=&"
$$poziv jezgrene 'unkcijebitonic_sort_korak222blocks, t0reads!data, j, k"#
66$$prijenos memorije iz globalne u radnu memorijucudaQemcpT!values, data, n, cudaQemcpTJeviceFoGost"#cudaree!data"#
-
8/18/2019 radixx sortiranje
30/50
6
:vaj od predstavlja paralelnu i!ved(u (itoni/og sortiranja na CU#A gra7i/om procesoru.
Programsi od oji se i!vr%ava na gra7i/om procesoru sastoji se od ni!a 7uncija oje se
na!ivaju erneli6 u na%em programu nala!i se jedna je!grena 7uncija a to je
*itonic+sort+"ora" . Po!ivom te 7uncije sve dretve o(avljaju isti posao oji im !ada ta
je!grena 7uncija. a ni! od 33.554.432 (rojeva *225 (rojeva+ oristili emo 1&24 dretve oje
su raspodijeljene na 32."-0 (loova. #ale svai (roj u (lou predstavlja jednu nit. :vavim
pristupom programu do(ili smo !natno veu u%tedu vremena u i!vo9enju programa.
RA$/4 S0R(/RA:
@edna od vani operacija oje se oriste u CU# je seniranje odnosno pre7ix sum. )ljedea
7uncija predstavlja seniranje.
__device__ F plus_scan!F -"
unsignedint i = t0readd.# $$ id dretve koja se trenutno izvr%avaunsignedint n = blockJim.# $$ ukupan broj niti u blokuunsignedint oVset# $$ udaljenost izme>u elemenata koji se dodaju
'or! oVset = 1# oVset 2 n# oVset -= &"
F t#
i' ! i = oVset "t = 4ioVset5#
__sTnct0reads!"#
i' ! i = oVset "4i5 = t 3 4i5# $$ 4i5 = 4i5 3 4i15
__sTnct0reads!"# 6
return 4i5#6
Ula!ni ni! xF G sadri to/no jednu nit po (lou. $remensa sloenost je log2n6 !a svau ora
ro! petlju parcijalni suma. #a (i la%e to ra!umjeli na slici *slia 0+ je predstavljeno jedno
tao seniranje6 gdje imamo 0 elemenata ili dretvi. )vaa ra!ina dijagrama predstavlja jedan
prola! ro! petlju. inije predstavljaju loacije odale su podaci u!eti. a svai i!la!ni
element smo i!radili sta(lo !(rajanja !a sve ula!ne elemente. Plave linije poa!uju o(li
ovavog sta(la !(rajanja !a ona/ne elemente. istovi ovog sta(la su po/etni elementi. Put
do ula!nog elementa poa!uje da on sadri sve elemente do i ulju/ujui se(e.
-
8/18/2019 radixx sortiranje
31/50
Slika 7. Princi! !aralelnog skeniranja !odataka
@edna od vani primjena ovog seniranja se oristi od sortiranja. )ljedea 7uncija
predstavlja radix sortiranje preo jednog (loa niti.
__device__ void radi_sort!unsigned int -values,unsigned int oVset"
int bit#
'or! bit = /# bit 2 8 33bit " partition_bT_bit!values, bit, oVset"#
__sTnct0reads!"# 66
:va 7uncija ao ula!ni parametar u!ima ni! oji sadri 32
-
8/18/2019 radixx sortiranje
32/50
__device__ void partition_bT_bit !unsignedint -values, unsignedint bit,unsignedint oVset"
__s0ared__ unsigned odlomak41/&:5#$$ alociramo dijeljeno memoriju za 1/&: broja
unsignedint i = t0readd.#unsignedint size = blockJim.#
odlomak4i5=values4i3oVset5#$$prebacujemo 1/&: broja po@etnog niza udijeljenu memoriju
__sTnct0reads!"#
unsignedint _i = odlomak4i5# $$ vrijednost broja na poziciji iiunsignedint p_i = !_i bit" S 1# $$ vrijednost bita na poziciji bit
odlomak4i5 = p_i#
__sTnct0reads!"#
unsignedint F_be'ore = plus_scan!odlomak"#unsignedint F_total = odlomak4size15#unsignedint _total = size F_total#
__sTnct0reads!"#
i' ! p_i " odlomak4F_be'ore1 3 _total5 = _i#
else odlomak4i F_be'ore5 = _i#
__sTnct0reads!"#
values4i3oVset5=odlomak4i5#6
U sljedeoj ta(lici (it e predstavljena vremena CU#A i!ved(e (itonic i radix sortiranja. a
ra/unanje vremena i!ved(e u!eti su random (rojevi gdje je najmanja vrijednost &6 a najvea
vrijednost 32"-0. $remena u ta(lici su i!raena u seundama.
CU$A i#ved*a 532.678 -2
1)
51.98.)67 -2
29
533.)).32 -2
2)
Bitonic sortiranje &6&4 s &61& s 26"5 s
Radix sortiranje &6&4 s &614 s 46&" s
Radix sortiranje
-scattter&6&5s &62- s -650 s
a#lica . estiranje $089 im!lementacije #itonica i radixa za razli,ite nizo"e
-
8/18/2019 radixx sortiranje
33/50
=8&.9;O/
/./1
/./&
/./8
/./:
/./<
/./;
Bitonic sort
Radi sort
Radisort!scatter"
!rijeme i"vedbe u sec#
/ra4ikon *. /ra4i,ki !rikaz
#rzine sortiranja $089
im!lementacije za niz od 32.*(5
#roje"a
=1./:O.
-
8/18/2019 radixx sortiranje
34/50
CU$A i#ved*a 532.678 51.98.)67 -229 533.)).32 -22)
Radix sortiranje
-8;*itni registar&6&4 s &612 s 362- s
Radix sortiranje-1);*itni registar
&6&4 s &614 s 46&" s
Radix sortiranje
-31;*itni registar&6&, s &62& s 56," s
a#lica '. estiranje $089 im!lementacije radix sortiranja za razli,ite "eli,ine registara
=8&.9;O/
/./&
/./:
/./;
/./O
/.1
Obitni registar
1
-
8/18/2019 radixx sortiranje
35/50
=88.
-
8/18/2019 radixx sortiranje
36/50
-
8/18/2019 radixx sortiranje
37/50
6. >iteratura
F1G Bitonic )orting6 Anastasio '
F2G Paralelno programiranje6 @ao(ovi #
F3G Programming 8assivelO Parallel Processors6 #avid B6 NenDDVVV.7s(.uni!g.rDmatDDsupercomputing(log.comDcudaDcuda
-
8/18/2019 radixx sortiranje
38/50
8. rilog
B/(0/C S0R(/RA -se"vencijalna im!lementacija
Dinclude2iostreamDinclude2stdio.0Dinclude2stdlib.0Dinclude2t0readDinclude2cmat0Dinclude(mjerenje.0(
usingnamespace std#void merge_up!int -data,int n"
int j=/,k=/#int step=n$0ile !step /"
'or !int i=/#i2n#i3=step-&"
j=i#'or !k=/#k 2 step#k33"
i' !data4j5 data4j3step5"
int tmp=data4j5#data4j5=data4j3step5#data4j3step5=tmp#
6 j33#
66
step$=6void merge_don!int -data,int n"
int j=/,k=/#int step=n$0ile !step /"
'or !int i=/#i2n#i3=step-&"
j=i#'or !k=/#k 2 step#k33"
i' !data4j5 2 data4j3step5"
int tmp=data4j5#data4j5=data4j3step5#
data4j3step5=tmp#6 j33#
6step$=
66void bitonic_sort_up!int -data,int n"
'or !int s=s2=n#s-=&"
'or !int i=/#i2n#i3=!s-&""
merge_up!!data 3 i", s"#i' !s2n"
merge_don!!data 3i 3s",s"#66
-
8/18/2019 radixx sortiranje
39/50
6
void bitonic_sort_don!int -data,int n"
'or !int s=s2=n#s-=&"
'or !int i=/#i2n#i3=!s-&""
merge_don!!data 3 i3n", s"#i' !s2n"
merge_up!!data 3i3n 3s",s"#6
66void ispis_niza!int -data ,int n"
'or !int i=/#i2n#i33"print'!(*d (, -!data3i""#
6
void inicijalizacija!int -data, int n"
'or !int i=/#i2n#i33"
-!data3i"=rand!"*1///#
6int main!"
int -data,n,p#print'!(unesite neki broj za potenciranje broja +n("#scan'!(*d(,Sp"#n=po!&,p"#
srand!time!ULL""#data=!int-"malloc!!n"-sizeo' !int""# $$alociranje memorije za niz od n clanova
print'!(iz+n("#inicijalizacija!data, n"# $$inicijalizacija nizaispis_niza!data, n"# $$ispis niza prije sortiranja
double all/=get_all_time!"#bitonic_sort_up!data,n"#double all1=get_all_time!"#
print'!(+n iz nakon sortiranja +n("#ispis_niza!data, n"# $$ispis niza nakon sortiranja
print'!(+n)rijeme izvodenja Kekvencialno. *l' s+n(, all1all/"#return /#
-
8/18/2019 radixx sortiranje
40/50
B/(0/C S0R(/RA-!aralelna C11 im!lementacija
Dinclude2iostreamDinclude2stdio.0Dinclude2stdlib.0Dinclude2t0readDinclude2cmat0Dinclude(mjerenje.0(
usingnamespace std#
void merge_up!int -data,intn"
int j=/,k=/#int step=n$0ile !step /"
'or !int i=/#i2n#i3=step-&"
j=i#'or !k=/#k 2 step#k33"
i' !data4j5 data4j3step5"
int tmp=data4j5#data4j5=data4j3step5#data4j3step5=tmp#
6 j33#
66step$=
66
void merge_don!int -data,intn"
int j=/,k=/#int step=n$0ile !step /"
'or !int i=/#i2n#i3=step-&"
j=i#'or !k=/#k 2 step#k33"
i' !data4j5 2data4j3step5"
int tmp=data4j5#data4j5=data4j3step5#data4j3step5=tmp#
6 j33#
66step$=
66void bitonic_sort_up!int -data,intn"
'or !int s=s2=n#s-=&"'or !int i=/#i2n#i3=!s-&""
merge_up!!data 3 i", s"#
-
8/18/2019 radixx sortiranje
41/50
i' !s2n"merge_don!!data 3i 3s",s"#
66void bitonic_sort_don!int -data,intn"
'or !int s=s2=n#s-=&"
'or !int i=/#i2n#i3=!s-&""
merge_don!!data 3 i3n", s"#i' !s2n"
merge_up!!data 3i3n 3s",s"#6
66
6
void ispis_niza!int -data ,intn"
'or !int i=/#i2n#i33"
print'!(*d (, -!data3i""#6
6
void inicijalizacija!int -data, intn"
'or !int i=/#i2n#i33"
-!data3i"=rand!"*1///#
6
6
int main!"
int -data,n,p#print'!(unesite neki broj za potenciranje broja +n("#scan'!(*d(,Sp"#n=po!&,p"#
srand!time!ULL""#data=!int-"malloc!!n"-sizeo' !int""# $$alociranje memorije za niz od n clanova
print'!(iz+n("#inicijalizacija!data, n"# $$inicijalizacija nizaispis_niza!data, n"# $$ispis niza prije sortiranja
double all1=get_all_time!"#stdt0read t1,t&,t8#t1=t0read!bitonic_sort_up,data,n$&"#t&=t0read!bitonic_sort_don,data,n$&"#
t1.join!"#t&.join!"#
t8=t0read!merge_up,data,n"#t8.join!"#double all&=get_all_time!"#
print'!(+n iz nakon sortiranja +n("#
-
8/18/2019 radixx sortiranje
42/50
ispis_niza!data, n"# $$ispis niza nakon sortiranja
print'!(+n)rijeme izvodenja Paral. *l' s+n(, all&all1"#
delete 45 data#
return /#6
B/(0/C S0R(/RA -!aralelna CU$A im!lementacija
Dinclude2stdlib.0Dinclude2stdio.0Dinclude2time.0Dinclude(gputimer.0(DdeEne FGRHIJK 1/&:DdeEneBLMCNK 8&9;ODdeEneUQ_)ILKFGRHIJK-BLMCNK
void ispis_niza!int -data, intn"
'or !int i = /# i 2n# 33i"
print'!(*d (, data4i5"#6
void inicijalizacija!int -data, intn"
srand!time!ULL""#'or !int i = /# i 2n# 33i"
data4i5 = rand!"*1//31#6
__global__ void bitonic_sort_korak!int -data, int j, int k"
int i, ij#
i = t0readd. 3 blockJim. - blockd.#ij = iAj#i' !!ij"i"
i' !!iSk"==/"
i' !data4i5data4ij5"
int temp = data4i5#data4i5 = data4ij5#data4ij5 = temp#
66else
' !data4i52data4ij5"
int temp = data4i5#data4i5 = data4ij5#data4ij5 = temp#
66
6void bitonic_sort!int -values"
int -data#int n = UQ_)ILK - sizeo' !int"#
cudaQalloc!!void--" Sdata, n"#cudaQemcpT!data, values, n, cudaQemcpTGostFoJevice"#
dim8 blocks!BLMCNK,1"#dim8 t0reads! FGRHIJK,1"#
-
8/18/2019 radixx sortiranje
43/50
int j, k#'or !k = k 2=UQ_)ILK# k-=&"
'or !j=k$ j/# j$=&"bitonic_sort_korak222blocks, t0reads!data, j, k"#
cudaQemcpT!values, data, n, cudaQemcpTJeviceFoGost"#cudaree!data"#6int main!void"
WpuFimer timer#int -values = !int-" malloc! UQ_)ILK - sizeo' !int""#inicijalizacija!values, UQ_)ILK"#
print'!(spis niza prije sortiranja +n("#ispis_niza!values, UQ_)ILK"#
timer.Ktart!"#bitonic_sort!values"#timer.Ktop!"#
print'!(+n("#print'!(spis niza poslije sortiranja +n("#ispis_niza!values,UQ_)ILK"#
print'!()rijeme izvedbe u milisekundama je = *g ms+n(, timer.Hlapsed!""#print'!()rijeme izvedbe u sekundama je = *g s+n(, timer.Hlapsed!"$1///"#
6
RA$/4 S0R(/RA -se"vencijalna im!lementacija
Dinclude2iostreamDinclude(mjerenje.0(Dinclude2time.0Dinclude2t0readusingnamespace std#constint base = 1/#
$$pronalazi najve?i element kako bi znali koliko ?emo puta dijelitiint get_ma!int arr45,int n"
int ma = arr4/5#
'or!int i = 1# i 2 n# i33"i' !ma 2 arr4i5"
ma = arr4i5#
return ma#6void count_sort!int arr45,int n,int ep,int output45"
memset!output,/,sizeo' !int"-n"#
int count4base5=/6#
'or!int i = /# i 2 n#i33"int ind=!arr4i5$ep"*base# $$koristi modulo da prona>e znamenkucount4ind533# $$uve?avamo brojac za pojedinu znamenku
6
'or!int i = 1# i 2 base# i33"count4i5 3= count4i15# $$radi inclusive sum operaciju
'or!int i = n1# i = /# i"
-
8/18/2019 radixx sortiranje
44/50
int ind=!arr4i5$ep"*base#output4count4ind515 = arr4i5#count4ind5#
6'or!int i = /# i 2 n#i33"
$$vra?amo nazad sortirani niz po znamenci
arr4i5 = output4i5#66
void radi_sort!int arr45,int n"
int m = get_ma!arr,n"#
int- output = !int-"malloc!n-sizeo' !int""#
$$radimo counting sort za svaku znamenku$$ umijeto broja prenosimo ep 1/Ai gdje je i trenutna znamenka
'or!int ep = 1# m$ep /# ep-= base"
count_sort!arr,n,ep,output,pom"#
'ree!output"#6
int main!"
srand!time!ULL""#int n = 88
-
8/18/2019 radixx sortiranje
45/50
RA$/4 S0R(/RA -!aralelna C11 im!lementacija
Dinclude2iostreamDinclude(mjerenje.0(Dinclude2time.0Dinclude2t0read
$$DdeEne QIX_F &1:9:O8;:Ousingnamespace std#
constint base = 1/#$$pronalazi najve?i element kako bi znali koliko ?emo puta dijelitiint get_ma!int arr45,int n"
int ma = arr4/5#
'or!int i = 1# i 2 n# i33"i' !ma 2 arr4i5"
ma = arr4i5#
return ma#6
void count_sort!int arr45,int n,int ep,int output45"
memset!output,/,sizeo' !int"-n"#
int count4base5=/6#
'or!int i = /# i 2 n#i33"
int ind=!arr4i5$ep"*base# $$koristi modulo da prona>e znamenkucount4ind533# $$uve?avamo brojac za pojedinu znamenku
6
'or!int i = 1# i 2 base# i33"count4i5 3= count4i15# $$radi inclusive sum operaciju
'or!int i = n1# i = /# i"$$radi counting sort koji se implementira zajedno s radiom
int ind=!arr4i5$ep"*base#output4count4ind515 = arr4i5#count4ind5#
6
'or!int i = /# i 2 n#i33"
$$vra?amo nazad sortirani niz po znamenciarr4i5 = output4i5#
66
void radi_sort!int arr45,int n"int m=get_ma!arr,n"#$$int m=QIX_F#
int- output = !int-"malloc!n-sizeo' !int""#
$$radimo counting sort za svaku znamenku$$ umjeto broja prenosimo ep 1/Ai gdje je i trenutna znamenka
'or!int ep = 1# m$ep /# ep-= base"count_sort!arr,n,ep,output"#
'ree!output"#
6
-
8/18/2019 radixx sortiranje
46/50
void merge!int a45, int m, int b45, int n, int sorted45" int i, j, k#
j = k = /#
'or !i = /# i 2 m 3 n#"
i' !j 2 m SS k 2 n" i' !a4j5 2 b4k5" sorted4i5 = a4j5# j33# 6else sorted4i5 = b4k5# k33# 6 i33# 6elsei' !j == m" 'or !# i 2 m 3 n#" sorted4i5 = b4k5# k33#
i33# 6 6else 'or !# i 2 m 3 n#" sorted4i5 = a4j5# j33# i33# 6 6 66int main!"
srand!time!ULL""#int n = 88
-
8/18/2019 radixx sortiranje
47/50
6
-
8/18/2019 radixx sortiranje
48/50
RA$/4 S0R(/RA-!aralelna CU$A im!lementacija
Dinclude(cuda_runtime.0(Dinclude(device_launc0_parameters.0(Dinclude2stdio.0
Dinclude2stdlib.0Dinclude2time.0Dinclude(gputimer.0(DdeEneBLMCN 8&9;O $$promijenom velicine bloka mijenjamo niz
template2class F
__device__ F plus_scan!F -"unsignedint i = t0readd.# $$ id o' t0read eecuting t0is instanceunsignedint n = blockJim.# $$ total number o' t0reads in t0is blockunsignedint oVset# $$ distance beteen elements to be added'or! oVset = 1# oVset 2 n# oVset -= &" F t#
i' ! i = oVset "t = 4ioVset5#
__sTnct0reads!"#
i' ! i = oVset "4i5 = t 3 4i5# $$ i.e., 4i5 = 4i5 3 4i15
__sTnct0reads!"# 6return 4i5#6
__device__ void partition_bT_bit!unsignedint -values, unsignedint bit,unsignedint oVset"# __device__ void radi_sort!unsignedint -values,unsignedint oVset"#
__global__ void bitonic_sort_korak!unsignedint -values, int j, int k"#cudaHrror_t RadiCuda!unsignedint -a, unsignedint -b, unsignedint size"#
__global__ void radi!unsignedint -b, unsignedint -a,unsignedint oVset"
int i = blockd.-blockJim.3t0readd.#radi_sort!a,oVset"#b4i5 = a4i5#
6 __global__ void bitonic_sort_korak!unsignedint -values, int j, int k"
int i, ij#i = t0readd. 3 blockJim. - blockd.#ij = iAj#i' !!ij"i"
i' !!iSk"==/" i' !values4i5values4ij5"
int temp = values4i5#values4i5 = values4ij5#values4ij5 = temp#
66
else
i' !values4i52values4ij5"
int temp = values4i5#values4i5 = values4ij5#values4ij5 = temp#
6 66
-
8/18/2019 radixx sortiranje
49/50
int main!"
WpuFimer timer#constunsignedint arraTKize = BLMCN -1/&:# $$velicina bloka deEnirana u zaglavljuunsignedint -a = !unsignedint-" malloc! arraTKize - sizeo' !unsignedint""#unsignedint -b = !unsignedint-" malloc! arraTKize - sizeo' !unsignedint""#
srand!time!ULL""#
'or!int i=/#i2arraTKize#i33"a4i5= rand!"#
timer.Ktart!"# cudaHrror_t cudaKtatus = RadiCuda! a, b, arraTKize"#
i' !cudaKtatus Y= cudaKuccess" 'print'!stderr, (RadiCuda 'ailY("#return 1# 6timer.Ktop!"#
$-print'!(spis niza+n("#'or!int i=/#i2arraTKize#i33"
print'!( *d(,b4i5"#-$print'!()rijeme izvedbe u milisekundama je = *g ms+n(, timer.Hlapsed!""#print'!()rijeme izvedbe u sekundama je = *g s+n(, timer.Hlapsed!"$1///"#
'ree!a"#'ree!b"#
return /#6
__device__ void partition_bT_bit!unsignedint -values, unsignedint bit,unsignedint oVset"
__s0ared__ unsigned odlomak41/&:5#unsignedint i = t0readd.#unsignedint size = blockJim.#
odlomak4i5=values4i3oVset5# __sTnct0reads!"#
unsignedint _i = odlomak4i5# $$ value o' integer at position iunsignedint p_i = !_i bit" S 1# $$ value o' bit at position bitodlomak4i5 = p_i#
__sTnct0reads!"#
unsignedint F_be'ore = plus_scan!odlomak"#unsignedint F_total = odlomak4size15#
unsignedint _total = size F_total#
__sTnct0reads!"#
i' ! p_i "odlomak4F_be'ore1 3 _total5 = _i#
elseodlomak4i F_be'ore5 = _i#
__sTnct0reads!"#values4i3oVset5=odlomak4i5#
-
8/18/2019 radixx sortiranje
50/50
6
__device__ void radi_sort!unsignedint -values,unsignedint oVset"
int bit#'or! bit = /# bit 2 8 33bit "
partition_bT_bit!values, bit,oVset"# __sTnct0reads!"# 66
$$ Pomo?na 'unkcija koja priprema pozive za cuducudaHrror_t RadiCuda!unsignedint -a, unsignedint -b, unsignedint size"unsignedint -dev_a = /#unsignedint -dev_b = /#
cudaHrror_t cudaKtatus#
cudaKtatus = cudaQalloc!!void--"Sdev_a, size - sizeo' !unsignedint""# cudaKtatus = cudaQalloc!!void--"Sdev_b, size - sizeo' !unsignedint""# cudaKtatus = cudaQemcpT!dev_a, a, size - sizeo' !unsignedint", cudaQemcpTGostFoJevice"#
int broj=size$1/&:#
'or!int i=/#i2broj#i33"radi2221,1/&:!dev_b, dev_a,1/&:-i"#
int j, k#'or !k = 1/&:# k 2=size# k-=&"
'or !j=k$ j/# j$=&"bitonic_sort_korak222broj, 1/&:!dev_a, j, k"#
$$ Provjera gresaka uslijed poziva kernela cudaKtatus = cudaWetLastHrror!"# !cudaKtatus Y= cudaKuccess"
'print'!stderr, (RadiCuda pokretanje palo *s+n(, cudaWetHrrorKtring!cudaKtatus""#goto Hrror#
cudaKtatus = cudaJeviceKTnc0ronize!"#
$$ CopT output vector 'rom WPU buVer to 0ost memorT. cudaKtatus = cudaQemcpT!b, dev_a, size - sizeo' !unsignedint", cudaQemcpTJeviceFoGost"#
Hrror
cudaree!dev_a"# cudaree!dev_b"#
return cudaKtatus#6