radixx sortiranje

Upload: pancito555

Post on 07-Jul-2018

224 views

Category:

Documents


0 download

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