• Nebyly nalezeny žádné výsledky

JanP´ıro Efektivn´ıparalelizacealgoritmuTimsort Bakal´aˇrsk´apr´ace

N/A
N/A
Protected

Academic year: 2022

Podíl "JanP´ıro Efektivn´ıparalelizacealgoritmuTimsort Bakal´aˇrsk´apr´ace"

Copied!
47
0
0

Načítání.... (zobrazit plný text nyní)

Fulltext

(1)

doc. Ing. Jan Janoušek, Ph.D.

vedoucí katedry doc. RNDr. Ing. Marcel Jiřina, Ph.D.

děkan

ZADÁNÍ BAKALÁŘSKÉ PRÁCE

Název: Efektivní paralelní Timsort algoritmus

Student: Jan Píro

Vedoucí: doc. Ing. Ivan Šimeček, Ph.D.

Studijní program: Informatika

Studijní obor: Teoretická informatika Katedra: Katedra teoretické informatiky Platnost zadání: Do konce letního semestru 2018/19

Pokyny pro vypracování

1) Nastudujte sekvenční verzi algoritmu Timsort. [1,2,3]

2) Diskutujte možnosti optimalizace a paralelizace tohoto algoritmu [4].

3) Implementujte vybrané optimalizace sekvenční i paralelní verze algoritmu.

4) Porovnejte výkonnost jednotlivých verzí optimalizace a paralelizace (navzájem a i s neoptimalizovanou sekvenční verzí) na školním serveru STAR a diskutujte dosažené výsledky.

Seznam odborné literatury

[1] http://www.drmaciver.com/2010/01/understanding-timsort-1adaptive-mergesort/

[2] https://hal-upec-upem.archives-ouvertes.fr/hal-01212839v2/document [3] https://mail.python.org/pipermail/python-dev/2002-July/026837.html [4] http://rabie-ben-atitallah.com/paper/hpcs-2017.pdf

(2)
(3)

Bakal´ aˇrsk´ a pr´ ace

Efektivn´ı paralelizace algoritmu Timsort

Jan P´ ıro

Katedra Teoretick´e Informatiky

Vedouc´ı pr´ace: doc. Ing. Ivan ˇSimeˇcek, Ph.D.

15. kvˇetna 2018

(4)
(5)

Podˇ ekov´ an´ı

R´ad bych zde podˇekoval vedouc´ımu bakal´aˇrsk´e pr´ace doc. Ing. Ivanu ˇSimeˇckovi, Ph.D. za jeho rady, ˇcas a trpˇelivost, kterou mi vˇenoval.

(6)
(7)

Prohl´ sen´ı

Prohlaˇsuji, ˇze jsem pˇredloˇzenou pr´aci vypracoval(a) samostatnˇe a ˇze jsem uvedl(a) veˇsker´e pouˇzit´e informaˇcn´ı zdroje v souladu s Metodick´ym pokynem o etick´e pˇr´ıpravˇe vysokoˇskolsk´ych z´avˇereˇcn´ych prac´ı.

Beru na vˇedom´ı, ˇze se na moji pr´aci vztahuj´ı pr´ava a povinnosti vypl´yvaj´ıc´ı ze z´akona ˇc. 121/2000 Sb., autorsk´eho z´akona, ve znˇen´ı pozdˇejˇs´ıch pˇredpis˚u.

V souladu s ust.§46 odst. 6 tohoto z´akona t´ımto udˇeluji nev´yhradn´ı opr´avnˇen´ı (licenci) k uˇzit´ı t´eto moj´ı pr´ace, a to vˇcetnˇe vˇsech poˇc´ıtaˇcov´ych program˚u, jeˇz jsou jej´ı souˇc´ast´ı ˇci pˇr´ılohou, a veˇsker´e jejich dokumentace (d´ale souhrnnˇe jen

”D´ılo“), a to vˇsem osob´am, kter´e si pˇrej´ı D´ılo uˇz´ıt. Tyto osoby jsou opr´avnˇeny D´ılo uˇz´ıt jak´ymkoli zp˚usobem, kter´y nesniˇzuje hodnotu D´ıla, a za jak´ymkoli

´

uˇcelem (vˇcetnˇe uˇzit´ı k v´ydˇeleˇcn´ym ´uˇcel˚um). Toto opr´avnˇen´ı je ˇcasovˇe, teri- tori´alnˇe i mnoˇzstevnˇe neomezen´e. Kaˇzd´a osoba, kter´a vyuˇzije v´yˇse uvedenou licenci, se vˇsak zavazuje udˇelit ke kaˇzd´emu d´ılu, kter´e vznikne (byt’ jen zˇc´asti) na z´akladˇe D´ıla, ´upravou D´ıla, spojen´ım D´ıla s jin´ym d´ılem, zaˇrazen´ım D´ıla do d´ıla souborn´eho ˇci zpracov´an´ım D´ıla (vˇcetnˇe pˇrekladu), licenci alespoˇn ve v´yˇse uveden´em rozsahu a z´aroveˇn zpˇr´ıstupnit zdrojov´y k´od takov´eho d´ıla ale- spoˇn srovnateln´ym zp˚usobem a ve srovnateln´em rozsahu, jako je zpˇr´ıstupnˇen zdrojov´y k´od D´ıla.

V Praze dne 15. kvˇetna 2018 . . . .

(8)

Cesk´ˇ e vysok´e uˇcen´ı technick´e v Praze Fakulta informaˇcn´ıch technologi´ı

c 2018 Jan P´ıro. Vˇsechna pr´ava vyhrazena.

Tato pr´ace vznikla jako ˇskoln´ı d´ılo na ˇCesk´em vysok´em uˇcen´ı technick´em v Praze, Fakultˇe informaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena pr´avn´ımi pˇredpisy a mezin´arodn´ımi ´umluvami o pr´avu autorsk´em a pr´avech souvisej´ıc´ıch s pr´avem autorsk´ym. K jej´ımu uˇzit´ı, s v´yjimkou bez´uplatn´ych z´akonn´ych licenc´ı a nad r´amec opr´avnˇen´ı uveden´ych v Prohl´aˇsen´ı na pˇredchoz´ı stranˇe, je nezbytn´y sou- hlas autora.

Odkaz na tuto pr´aci

P´ıro, Jan.Efektivn´ı paralelizace algoritmu Timsort. Bakal´aˇrsk´a pr´ace. Praha:

Cesk´ˇ e vysok´e uˇcen´ı technick´e v Praze, Fakulta informaˇcn´ıch technologi´ı, 2018.

(9)

Abstrakt

Tato bakal´aˇrsk´a pr´ace se zamˇeˇruje na tˇr´ıd´ıc´ı algoritmus Timsort. C´ılem bylo paralelizovat algoritmus tak, aby byl efektivnˇejˇs´ı neˇz jeho sekvenˇcn´ı verze a porovnat jeho rychlost s jin´ymi algoritmy.

Kl´ıˇcov´a slova timsort, paraleln´ı timsort, tˇr´ıd´ıc´ı algoritmy, openMP, C++

Thread support library

Abstract

This thesis focuses on sorting algorithm Timsort. The goal is to paralelize the algorithm in a way to make it more efficient than its sequential version and compare its speed with other algorithms.

Keywords timsort, parallel timsort, sorting algorithms, openMP, C++ Thread support library

(10)
(11)

Obsah

Uvod´ 1

1 C´ıl pr´ace a z´akladn´ı pojmy 3

1.1 C´ıl a motivace . . . 3

1.2 Z´akladn´ı pojmy . . . 3

1.3 Pouˇzit´e technologie . . . 4

2 Algoritmus Timsort 5 2.1 Hled´an´ı run˚u . . . 5

2.2 Strategie sluˇcov´an´ı . . . 6

2.3 Algoritmy sluˇcov´an´ı . . . 7

2.4 Galloping . . . 8

3 Anal´yza a n´avrh 11 3.1 Moˇznosti optimalizace sekvenˇcn´ı verze . . . 11

3.2 Moˇznosti paralelizace . . . 11

4 Realizace 13 4.1 Kompilace . . . 13

4.2 Sekvenˇcn´ı verze . . . 13

4.3 Paraleln´ı verze 1 . . . 15

4.4 Paraleln´ı verze 2 . . . 16

4.5 Druh´a f´aze testov´an´ı . . . 17

5 Metody mˇeˇren´ı 19 5.1 server STAR . . . 19

5.2 Typy dat . . . 19

5.3 Metodika . . . 20

6 V´ysledky mˇeˇren´ı 21

(12)

6.1 Prvn´ı f´aze . . . 21 6.2 Druh´a f´aze . . . 25

Z´avˇer 29

Literatura 31

A Obsah pˇriloˇzen´eho CD 33

x

(13)

Seznam obr´ azk˚ u

6.1 N´ahodn´a data . . . 21

6.2 M´alo ruzn´ych hodnot . . . 22

6.3 Seˇrazen´a data s v´yjimkami . . . 23

6.4 Vˇsechna data stejn´a . . . 23

6.5 Seˇrazen´a data . . . 24

6.6 C´ˇasteˇcnˇe seˇrazen´a data . . . 24

6.7 N´ahodn´a data - F´aze 2 . . . 25

6.8 M´alo r˚uzn´ych hodnot - F´aze 2 . . . 26

6.9 Seˇrazen´a data s v´yjimkami - F´aze 2 . . . 27

6.10 Vˇschna data stejn´a - F´aze 2 . . . 27

6.11 Seˇrazen´a data - F´aze 2 . . . 28

6.12 ˇC´asteˇcnˇe seˇrazen´a data - F´aze 2 . . . 28

(14)
(15)

Uvod ´

S probl´emem seˇradit za sebe nˇejak´e prvky podle urˇcit´ych krit´eri´ı se setk´av´ame v t´emˇeˇr kaˇzd´em pracovn´ım odvˇetv´ı. Algoritmy zab´yvaj´ıc´ı se tˇemito probl´emy se naz´yvaj´ı tˇr´ıd´ıc´ı algoritmy a jsou jedny z nejpouˇz´ıvanˇejˇs´ıch algoritm˚u v˚ubec.

Pouˇz´ıvaj´ı se vˇsude od datab´az´ı, pˇres umˇelou inteligenci aˇz po vojensk´e tech- nologie. Toto odvˇetv´ı je tedy st´ale zkoum´ano s c´ılem zrychlit a zefektivnit st´avaj´ıc´ı algoritmy, pˇr´ıpadnˇe vymyslet nov´e.

Jejich sloˇzitost posuzujeme pˇredevˇs´ım dle poˇctu operac´ı srovn´an´ı dvou prvk˚u (a tedy zjiˇstˇen´ım, kter´y z prvk˚u m´a b´yt ve v´ysledn´e ˇradˇe dˇr´ıve). D´ale se posuzuj´ı podle operaˇcn´ı pamˇeti, kterou potˇrebuj´ı alokovat (tedy pamˇet’

alokovan´a nad r´amec zadan´e ˇrady prvk˚u).

Jedn´ım z takov´ych algoritm˚u je Timsort, kter´y byl navrˇzen roku 2002 Timem Petersem. Je pouˇz´ıv´an jako standardn´ı tˇr´ıd´ıc´ı algoritmus v Pythonu od verze 2.3 a v Javˇe SE 7. Jedn´a se o optimalizovanou kombinaci jiˇz zn´am´ych algoritm˚u MergeSort a InsertionSort.

V teoretick´e ˇc´asti je posps´an samotn´y algoritmus a jsou zde diskutov´any moˇznosti jeho optimalizace a paralelizace. V praktick´e ˇc´asti jsou vytvoˇreny verze s r˚uzn´ymi stupni optimalizace a paralelizace, mˇeˇreny jejich v´ykony a jednotliv´e verze porovn´any.

(16)
(17)

Kapitola 1

C´ıl pr´ ace a z´ akladn´ı pojmy

1.1 C´ıl a motivace

Timsort m´a operaˇcn´ı sloˇzitost v nejhorˇs´ım pˇr´ıpadˇe O(nlogn), ale v praxi prov´ad´ı u ˇc´asteˇcnˇe seˇrazen´ych pol´ı mnohem m´enˇe porovn´av´an´ı. Jeho nev´yhoda je, ˇze podstatn´a ˇc´ast algoritmu je z´avisl´a na vykon´av´an´ı se v urˇcit´em poˇrad´ı a tedy je sloˇzit´e ho paralelizovat.

Jeho efektivn´ı paralelizace by mohla v´est ke zrychlen´ı standardn´ıch algo- ritm˚u v r˚uzn´ych jazyc´ıch a t´ım i ke zrychlen´ı aplikac´ı, kter´e je vyuˇz´ıvaj´ı.

Hlavn´ım c´ılem pr´ace je tedy implementace paraleln´ı verze algoritmu Tim- sort a jej´ı porovn´an´ı s jin´ymi algoritmy, sekvenˇcn´ı verz´ı a r˚uzn´ymi paraleln´ımi verzemi. Mˇeˇren´ı chci prov´est pro r˚uzn´e typy dat abych mˇel o efektivitˇe ˇreˇsen´ı co nejpˇresnˇejˇs´ı pˇredstavu.

Pro paralelizaci budu vyuˇz´ıvat technologii OpenMP a C++ Thread sup- port library, podle konkr´etn´ıho postupu paralelizace.

1.2 akladn´ı pojmy

V pr´aci budu pracovat s n´asleduj´ıc´ı term´ıny:

tˇr´ıd´ıc´ı algoritmy jsou skupina algoritm˚u zab´yvaj´ıc´ı se ˇrazen´ım pole prvk˚u dle urˇcit´eho krit´eria, typicky podle jejich velikosti

vl´akno je proud instrukc´ı, kter´y je zpracov´av´an j´adrem CPU [1]

sekvenˇcn´ı algoritmus bˇeˇz´ı cel´y pouze na jednom vl´aknˇe

paraleln´ı algoritmus vyuˇz´ıv´a v nˇekter´ych sv´ych ˇc´astech v´ıce vl´aken run seˇrazen´a ˇc´ast tˇr´ıdˇen´eho pole v algoritmu Timsort

(18)

1. C´ıl pr´ace a z´akladn´ı pojmy

mutex, condition variable a semaphore jsou synchronizaˇcn´ı typy, pou- ˇz´ıvan´e k zajiˇstˇen´ı v´yluˇcn´eho pˇr´ıstupu k dat˚um, pˇr´ıpadnˇe synchronizace posloupnosti prov´adˇen´ı operac´ı na v´ıce vl´aknech [2][3][4]

Merge (sluˇcov´an´ı) je proces, pˇri kter´em spoj´ıme dvˇe seˇrazen´a pole do jed- noho vˇetˇs´ıho seˇrazen´eho pole

Galloping (cval) je metoda pouˇz´ıvan´a pro rychlejˇs´ı zjiˇstˇen´ı d´elky seˇrazen´e posloupnosti menˇs´ı (resp. vˇetˇs´ı) neˇz dan´y prvek

cache je pamˇet’ na procesoru, slouˇz´ıc´ı k rychlejˇs´ımu pˇr´ıstupu k dat˚um, se kter´ymi procesor pracuje

1.3 Pouˇ zit´ e technologie

1.3.1 OpenMP

Pro naivn´ı paralelizaci algoritmu jsem vyuˇzil technologii OpenMP.

Je to soustava direktiv pro pˇrekladaˇc a knihovn´ıch procedur pro paraleln´ı programov´an´ı. Jedn´a se o standard pro programov´an´ı poˇc´ıtaˇc˚u se sd´ılenou pamˇet´ı. OpenMP usnadˇnuje vytv´aˇren´ı v´ıcevl´aknov´ych program˚u v programo- vac´ıch jazyc´ıch Fortran, C a C++. [5]

D˚uvodem ke zvolen´ı t´eto technologie byl fakt, ˇze pˇri pouˇzit´ı t´eto techno- logie program´atorovi staˇc´ı oznaˇcit blok k´odu, kter´y se m´a prov´adˇet paralelnˇe a pˇrekladaˇc to tak naimplementuje. [6]

1.3.2 C++ Thread support library

V komplikovanˇejˇs´ı druh´e verzi paraleln´ıho algoritmu bych si s technologi´ı OpenMP nevystaˇcil a musel jsem paralelizovat manu´alnˇe. Vyuˇz´ıv´am k tomu C++ Thread support library. Tato knihovna obsahuje mimo jin´e tˇr´ıdy a funkce pro spr´avu vl´aken (vytvoˇren´ı a zruˇsen´ı), synchronizaci mezi nimi (uzamyk´an´ı kritick´ych sekc´ı) a jejich pl´anov´an´ı a spouˇstˇen´ı. [7]

4

(19)

Kapitola 2

Algoritmus Timsort

V t´eto pr´aci vych´az´ım z algoritmu tak jak byl posp´an v p˚uvodn´ım Peter- sovˇe n´avrhu. D´ale jsem ˇcerpal z text˚u Merge Strategies: from Merge Sort to TimSort a Understanding timsort, Part 1: Adaptive Mergesort. [8], [9], [10]

Timsort je ve sv´e podstatˇe modifikovan´y Merge sort. Algoritmus hled´a sekvence jiˇz seˇrazen´ych dat (tˇemto se ˇr´ık´a runy) a pr˚ubˇeˇznˇe je podle jist´ych pravidel sluˇcuje.

Dalˇs´ı modifikace algoritmu oproti mergesortu spoˇc´ıv´a v minim´aln´ı velikosti tˇechto run˚u, tato velikost (minrun) se spoˇc´ıt´a na z´akladˇe velikosti cel´eho tˇr´ıdˇen´eho pole pomoc´ı jednoduch´e formule. Pokud je run menˇs´ı neˇz je velikost minrun, pak se umˇele zvˇetˇs´ı o n´asleduj´ıc´ı prvky v poli pomoc´ı insertion sortu.

Ve vlastn´ım sluˇcov´an´ı je implementov´ano nˇekolik dalˇs´ıch heuristik, kter´e zmenˇsuj´ı velikost sluˇcovan´ych pol´ı (nalezen´ı prvk˚u, kter´e by se pˇri sluˇcov´an´ı nepohly) a sniˇzuj´ı poˇcet porovn´av´an´ı u ˇc´asteˇcnˇe seˇrazen´ych pol´ı.

2.1 Hled´ an´ı run˚ u

Nejprve algoritmus najde v poli postupn´ym proch´azen´ım podpousloupnosti, kter´e jsou bud’ neklesaj´ıc´ı

(a0<=a1<=a2<=...) nebo ostˇre klesaj´ıc´ı

(a0> a1> a2> ...)

Ostˇre klesaj´ıc´ı podposloupnost n´aslednˇe otoˇc´ıme, postupn´ym prohazov´a- n´ım prvk˚u na zaˇc´atku a konci jeˇstˇe nesetˇr´ıdˇen´e podposloupnosti. Tato posloup- nost mus´ı b´yt ostˇre klesaj´ıc´ı, aby se zabr´anilo pˇr´ıpadn´e destabilizaci algoritmu.

Pˇri pr´aci s n´ahodn´ymi daty je velmi nepravdˇepodobn´e, ˇze naraz´ıme na dlouh´e runy. Pokud algoritmus naraz´ı na run kratˇs´ı neˇz je dan´a hodnota minrun dopln´ı tento run do poˇzadovan´e d´elky pomoc´ı insertion sortu.

(20)

2. Algoritmus Timsort

M inrun vol´ıme z intervalu (32,64) takov´e, aby N/minrun bylo pokud moˇzno rovn´e 2i, kde i∈N.N je zde celkov´y poˇcet prvk˚u v poli. Pokud toto nen´ı moˇzn´e, chceme aby se N/minrunbl´ıˇzilo nˇekter´e mocninˇe dvou zezdola.

Tohoto dos´ahneme snadno pomoc´ı n´asleduj´ıc´ıho algoritmu. Vezmˇeme prvn´ıch 6 bit˚u zN a pokud nejsou vˇsechny zb´yvaj´ıc´ı bity rovny nule pˇriˇctˇeme jedniˇcku.

Tento v´ybˇer pokr´yv´a vˇsechny pˇr´ıpady vˇcetnˇe mal´ychN.

V k´odu 2.1 vid´ıme jak algoritmus pracuje. Promˇenn´arznaˇc´ı zda je nˇekter´y z bit˚u po prvn´ıch 6 bitechN nastaven´y na 1. Konstantamax mergeje rovn´a 64 a slouˇz´ı k zajiˇstˇen´ı pr´avˇe 6 prvn´ıch bit˚u ˇc´ıslaN.

Uk´azka k´odu 2.1: Poˇc´ıt´an´ı hodnoty minrun i n t CountMinRun (i n t N) {

i n t r = 0 ;

while (N>= max merge ) { r |= (N & 1 ) ;

N >>= 1 ; }

return N + r ; }

2.2 Strategie sluˇ cov´ an´ı

Z d˚uvodu vyuˇz´ıv´an´ı ˇc´asteˇcnˇe setˇr´ıdˇen´ych dat m˚uˇzeme z´ıskat runy r˚uzn´ych d´elek. S ohledem na stabilitu m˚uˇzeme sluˇcovat pouze soused´ıc´ı runy.

Kdyˇz nalezneme run, vloˇz´ıme jeho poˇc´atek a d´elku na z´asobn´ık. Pot´e se kontroluje stav, a rozhoduje se zda budeme runy sluˇcovat, ˇci nikoliv. Sluˇcov´an´ı nechceme pˇr´ıliˇs oddalovat, abychom nemˇeli pˇr´ıliˇs velk´y z´asobn´ık a abychom vyuˇzili faktu, ˇze pr´avˇe pˇridan´e runy jsou na vyˇsˇs´ı pozici v pamˇet’ov´e hiear- chii. Na druhou stranu chceme ale sluˇcovat co nejefektivnˇeji a tedy formovat strategii na zakl´adˇe informac´ı z´ıskan´ych z v´ıce run˚u.

Merge prob´ıh´a rychleji na podobnˇe dlouh´ych pol´ıch. Abychom doc´ılili po- stupn´eho vyrovn´av´an´ı d´elek snaˇz´ıme se na z´asobn´ıku dodrˇzovat dvˇe nerovnice:

1. A > B+C 2. B > C

Kde A, B, C jsou velikosti posledn´ıch tˇr´ı run˚u vloˇzen´ych, v tomto poˇrad´ı, na z´asobn´ık. Druh´a nerovnice zajiˇst’uje, ˇze na z´asobn´ıku m´ame klesaj´ıc´ı po- sloupnost d´elek run˚u a prvn´ı zajiˇst’uje rychlost r˚ustu d´elek, poˇc´ınaje od posled- n´ıho prvku z´asobn´ıku, je minim´alnˇe takov´a, jako rychlost r˚ustu Fibonacciho posloupnosti, a tedy zajiˇstˇen´ı maxim´aln´ı velikosti z´asobn´ıku rovnou logφN, kdeφ≈1.618 je zlat´y ˇrez.

6

(21)

2.3. Algoritmy sluˇcov´an´ı

Pokud jsou tyto nerovnice poruˇseny je B slouˇceno z kratˇs´ım z run˚uAaC.

Pokud jsou runy A i C stejnˇe dlouh´e, sluˇcujeme B s C, z d˚uvodu ˇcerstvosti v pamˇeti a tedy vyuˇz´ıv´an´ım cache. Na z´asobn´ıku slouˇcen´e runy nahrad´ıme jejich v´ysledn´ym a znovu zkontrolujeme nerovnice.

2.3 Algoritmy sluˇ cov´ an´ı

Sluˇcujeme-li dva runy o d´elk´ach Aa B chceme uˇsetˇrit pomocnou pamˇet’ kte- rou vyuˇz´ıv´ame. Jeden z krok˚u, kter´y proto podnik´ame je oˇr´ıznut´ı tˇechto pol´ı o prvky, se kter´ymi jiˇz nebudeme h´ybat. Pomoc´ı bin´arn´ıho vyhled´av´an´ı nalez- neme poziciB[0] vA aA[max] vB. Prvky vA, pˇred pozic´ıB[0], resp. prvky vB za pozic´ıA[max] jsou jiˇz setˇr´ıdˇen´e a tedy m˚uˇzeme pracovat s poli o tyto prvky zkr´acen´ymi.

Porovn´ame d´elky zkr´acen´ych pol´ıA1 aB1 a vytvoˇr´ıme pomocnou pamˇet’ o d´elce kratˇs´ıho z nich, do kter´e pot´e kratˇs´ı pole nahrajeme a zah´aj´ıme sluˇcov´an´ı.

Podle toho, kter´e pole jsme nahr´ali do pomocn´e pamˇeti budeme postupovat od nejmenˇs´ıho nebo nejvˇetˇs´ıho prvku a tedy sluˇcovat pole zleva respektive zprava. Obˇe tyto verze jsou v podstatˇe analogick´e, jen zrcadlovˇe obr´acen´e.

Uk´azka k´odu 2.2: Merge void Merge ( Run ∗a , Run ∗b ) {

// H l e d e j a [ l a s t ] v b // H l e d e j b [ 0 ] v a // o r e z s l u c o v a n a p o l e i f ( l e n g t h A <= l e n g t h B ) {

MergeLo ( s t a r t A , s t a r t B , lengthA , l e n g t h B ) ; } e l s e {

MergeHi ( s t a r t A , s t a r t B , lengthA , l e n g t h B ) ; }

// S p o j runy na z a s o b n i k u }

(22)

2. Algoritmus Timsort

Uk´azka k´odu 2.3: MergeLo void MergeLo ( ) {

NahrajADoTmpArray ( ) ; while ( 1 ) {

i f ( g a l l o p > 0 ) { // p r o v e d g a l l o p i n g

// z k o n t r o l u j z d a s e g a l l o p i n g v y p l a t i l } e l s e {

// p r o v e d l i n a r n i p r i d a v a n i i f ( p r e k r o c e n m i n g a l l o p )

// p r e j d i do g a l l o p i n g u }

i f ( d o s a h l jsem konce j e d n o h o p o l e ) { // v y p i s z b y t e k d r u h e h o p o l e

break; }

} }

2.4 Galloping

Klasick´e sluˇcov´an´ı pouˇz´ıv´a mezi A a A+B porovn´av´an´ı. Pokud jsou ovˇsem data ˇc´asteˇcnˇe setˇr´ıdˇen´a, m˚uˇzeme pˇredpokl´adat ˇze budeme z obou pol´ı vyb´ırat vˇetˇs´ı celky najednou. Zde m˚uˇzeme uˇsetˇrit operace porovn´av´an´ı hled´an´ım jak dlouhou sekvenci z jednoho pole budeme vyb´ırat. K tomu pouˇzijeme metodu tzv. cvalu (angl. galloping) neboli exponenci´aln´ıho vyhled´av´an´ı.

Pˇri hled´an´ı poziceA[0] vB, porovn´av´ameA[0] postupnˇe sB[0],B[1],B[3], . . . ,B[2i−1], . . . dokud nenaleznemek takov´e, ˇze

B[2k−1−1]< A[0]B[2k−1]

Pot´e ve vyhledan´em ´useku nalezneme pozici A[0] pomoc´ı bin´arn´ıho vy- hled´av´an´ı.

Probl´em s t´ımto vyhled´av´an´ım je ten, ˇze pro k ≤ 6 prov´ad´ı line´arn´ı vy- hled´av´an´ı stejnˇe, nebo dokonce m´enˇe porovn´an´ı. Z tohoto d˚uvodu nechceme prov´adˇet exponenc´ı´aln´ı vyhled´av´an´ı pokud bychom nemˇeli alespoˇn urˇcit´e n´a- znaky, ˇze se n´am vyplat´ı. Do m´odu cvalu se tedy bude algoritmus pˇrep´ınat pouze tehdy, bude-li br´at M IN GALLOP poˇcet prvk˚u z jednoho pole za sebou.

8

(23)

2.4. Galloping

Uk´azka k´odu 2.4: Galloping i n t GallopLeftInTmp ( ) {

// n a j d i k t a k o v e , z e :

//B[ 2 ˆ{k−1}−1] < A [ 0 ] <= B[ 2 ˆ k−1]

// pomoci b i n a r n i h o h l e d a n i n a j d i // v danem u s e k u m

// t a k o v e , z e B [m−1]<A[0]<=B [m]

return m;

}

Promˇenn´a M IN GALLOP bude m´ıt v´ychoz´ı hodnotu rovnou 7, tedy k takov´e, pro kter´e cval v´ıtˇez´ı nad line´arn´ım vyhled´av´an´ım. Tuto promˇennou zv´yˇs´ıme kdykoli se n´am pˇrepnut´ı na cval nevyplatilo (abychom pˇredeˇsli n´a- hodn´ym pˇrepnut´ım v pol´ıch, kde se zjevnˇe nevyplat´ı) a naopak sn´ıˇz´ı pokud se n´am vyplat´ı, abychom se do m´odu mohli snadnˇeji vr´atit, pokud bychom z nˇej vypadli v poli, kde se n´am celkovˇe vypl´ac´ı.

(24)
(25)

Kapitola 3

Anal´ yza a n´ avrh

Pˇri n´avrhu jsem se snaˇzil o to, aby timsort nab´ızel stejn´e vyuˇzit´ı jako std ::

sort. Pracoval jsem ve dvou f´az´ıch.

3.1 Moˇ znosti optimalizace sekvenˇ cn´ı verze

Timsort je ve sv´e podstatˇe velice dobˇre softwarovˇe optimalizovan´y pro sek- venˇcn´ı bˇeh programu. Zde se tedy nab´ız´ı pouze vyuˇzit´ı pˇrekladaˇcov´ych opti- malazic´ı.

Z v´yhod sekvenˇcn´ı verze Timsortu zm´ın´ım efektivn´ı pr´aci s cache na pro- cesoru (pracuje se prim´arnˇe na datech kter´a byla v ned´avn´e dobˇe zkoum´ana a tedy je velk´a pravdˇepodobnost, ˇze se st´ale v cache nach´az´ı) a efektivn´ı volen´ı sluˇcov´an´ı run˚u stejn´e d´elky.

3.2 Moˇ znosti paralelizace

Moˇznost´ı paralelizace se nab´ız´ı nˇekolik:

3.2.1 Naivn´ı verze

Zjevn´y a na prvn´ı pohled nejsp´ıˇse i nej´uspˇeˇsnˇejˇs´ı postup je u velk´eho pole (u mal´ych by paralelizace naopak sp´ıˇs zdrˇzovala) rozdˇelen´ı na X zhruba stejnˇe velk´ych ˇc´ast´ı (X je poˇcet CPU kter´e m´ame k dispozici) a n´asledn´em spuˇstˇen´ı algoritmu paralelnˇe na kaˇzd´e ˇc´asti zvl´aˇst’, tyto ˇc´asti nakonec pˇrid´am jako runy do klasick´eho Timsortu kde dojde k jejich, ted’ uˇz sekvenˇcn´ımu, slouˇcen´ı.

3.2.2 Pokroˇcil´a verze

Druhou moˇznost´ı je zavrhnout pravidla pro postupn´e sluˇcov´an´ı a sluˇcovat runy najednou, jak navrhuje Saurabh Sood [11] Zde sice m˚uˇze nastat situ-

(26)

3. Anal´yza a n´avrh

ace neefektivn´ıho sluˇcov´an´ı (dlouh´y run s kr´atk´ym), nicm´enˇe zisk obdrˇzen´y paralelizac´ı by toto mˇel v´ıce neˇz vykompenzovat.

Pro kaˇzd´y run vytvoˇr´ıme samostatn´e vl´akno, kter´emu pˇridˇel´ım poˇradov´e ˇc´ıslo i. Toto vl´akno spust´ı metodu Check, kter´e pˇred´a i a ukazatel na run, a po jej´ım proveden´ı uvoln´ı run ke zpracov´an´ı ostatn´ımi vl´akny a ukonˇc´ı se.

MetodaCheckpro lich´aineprovede nic a ukonˇc´ı se. Pro sud´aivl´akno slouˇc´ım s runem pˇredchoz´ım (runy jsou ukl´ad´any ve spojov´em seznamu) a rekurzivnˇe opˇet zavol´am metodu Checktentokr´at s parametrem i/2. n

3.2.3 Dalˇs´ı moˇznosti

Zvaˇzoval jsem i moˇznost paralelizace algoritmu Timsort tak jak je, tedy nechat bˇeˇzet hled´an´ı run˚u na jednom vl´aknˇe nicm´enˇe bˇehem anal´yzy jsem dospˇel k tomu, ˇze pˇri ˇr´ızen´ı se postupn´ym sluˇcov´an´ım run˚u bych paralelizaci poˇr´adnˇe nevyuˇzil. Mohl bych ji vyuˇz´ıt k prohled´av´an´ı pole z´aroveˇn se sluˇcov´an´ım prvn´ıch nalezen´ych run˚u, nicm´enˇe u t´eto varianty by mi bˇeˇzeli maxim´alnˇe dvˇe vl´akna najednou a bˇeh vl´akna hledaj´ıc´ıho runy je mnohon´asobnˇe kratˇs´ı, neˇz bˇeh vl´akna kter´e by nalezen´e runy sluˇcovalo a tak jsem tuto variantu zavrhl.

12

(27)

Kapitola 4

Realizace

Implementoval jsem tˇri verze algoritmu:

• Sekvenˇcn´ı verze

• Paraleln´ı verze s OpenMP

• Paraleln´ı verze s C++ Thread

Tyto jsem porovn´aval s verz´ı Timsortu podle gfx [12] a funkc´ı sort z knihov- ny std. [13]

4.1 Kompilace

Pro dodateˇcn´e kompil´atorov´e optimalizace a vyuˇzit´ı moˇznost´ı procesor˚u v testovan´em prostˇred´ı jsem vˇsechny verze kompiloval s pˇrep´ınaˇci -std=c++11 -O3 -march=corei7-avx.

D´ale jsem z d˚uvod˚u vyuˇzit´ı technologie OpenMP pˇri kompilaci naivn´ı pa- raleln´ı verze pˇridal pˇrep´ınaˇc -fopenmp.

U pokroˇcil´e paraleln´ı verze jsem pouˇzil pˇrep´ınaˇc -pthreads.

4.2 Sekvenˇ cn´ı verze

Sekvenˇcn´ı verzi jsem implementoval pˇresnˇe podle algoritmu popsan´eho ve tˇret´ı kapitole. Pro algoritmus implementuji tˇr´ıdu TimSort, kter´a implementuje funkce slouˇz´ıc´ı k hled´an´ı run˚u, tˇr´ıdu StackTimSort, kter´e implementuje funkce sluˇcov´an´ı a udrˇzuje z´asobn´ık s runy, a tˇr´ıdu RunTimSort, kter´a reprezentuje jednotliv´e runy a udrˇzuje informaci o nich.

Pro dodateˇcn´e kompil´atorov´e optimalizace a vyuˇzit´ı moˇznost´ı procesor˚u v testovan´em prostˇred´ı jsem tuto verzi kompiloval s pˇrep´ınaˇci -std=c++11 -O3 -march=corei7-avx.

(28)

4. Realizace

4.2.1 Tˇr´ıda TimSort

Tˇr´ıda TimSort m´a na starosti hled´an´ı run˚u a jejich pˇrid´av´an´ı na z´asobn´ık, implementuje tyto metody:

Sort Hlavn´ı metoda, kde se spouˇst´ı hled´an´ı run˚u a d´ale se, po projet´ı cel´eho seznamu, slouˇc´ı jeˇstˇe neslouˇcen´e runy

SearchForRuns Metoda, kter´a vyhled´av´a runy a pˇrid´av´a je na z´asobn´ık implementovan´y tˇr´ıdou StackTimSort

CountMinRun Pomocn´a metoda, kter´a vypoˇc´ıt´a velikost minrun pro da- nou d´elku pole

InsertUntilMinRun Metoda, kter´a pomoc´ı insertion sort prodluˇzuje nale- zen´y run na d´elkuminrun

BinarySearch Pomocn´a metoda, pouˇzit´a v metodˇe InsertUntilMinrun, vy- hled´av´a pozici pˇrid´av´an´eho prvku v jiˇz seˇrazen´e ˇc´asti runu

Reverse Pokud je nalezen´y run sestupn´y, tato metoda ho obr´at´ı

RunLength Hled´a sekvenci jiˇz seˇrazen´ych prvk˚u, vrac´ı d´elku sekvence a in- formaci o tom, zda je sekvence klesaj´ıc´ı, ˇci neklesaj´ıc´ı

a uchov´av´a tyto promˇenn´e:

array ukazatel na zaˇc´atek tˇr´ıdˇen´eho pole length d´elka tˇr´ıdˇen´eho pole

stack ukazatel na tˇr´ıdu reprezentuj´ıc´ı z´asobn´ık 4.2.2 Tˇr´ıda StackTimSort

Tˇr´ıda StackTimSort reprezentuje z´asobn´ık nalezen´ych run˚u a m´a na starosti kontrolov´an´ı pravidel na vrcholu z´asobn´ıku a sluˇcov´an´ı run˚u. Implementuje tyto metody:

AddRun Metoda, kter´a pˇrid´a na z´asobn´ık nalezen´y run s dan´ymi parametry a pot´e zavol´a metoduCheck

Check Meto, kter´a kontroluje dodrˇzov´an´ı pravidel na vrcholu z´asobn´ıku (a t´ım omezuje jeho maxim´aln´ı velikost), pokud jsou pravidla poruˇsena, zavol´a metoduM erge

Merge Metoda, kter´a provede pˇr´ıpravn´e operace pˇred vlastn´ım sluˇcov´an´ım, kter´e prov´ad´ı metody M ergeHi a M ergeLo, a n´aslednˇe spoj´ı runy do toho novˇejˇs´ıho a starˇs´ı vymaˇze.

14

(29)

4.3. Paraleln´ı verze 1

MergeHi + MergeLo Metody, kter´e prov´ad´ı samotn´e sluˇcov´an´ı, liˇs´ı se v tom zda postupuj´ı zleva ˇci zprava.

ExponentialSearchLeft + ExponentialSearchRight Metody tzv. cvalu, pro nalezen´ı pozice prvku v poli

GallopLeftInTmp + GallopRightInTmp Metody tzv. cvalu, pro nale- zen´ı pozice prvku v poli, na rozd´ıl od ExponentialSearchhled´a ve vy- tvoˇren´em pomocn´em poli

D´ale uchov´av´a tyto promˇenn´e:

array ukazatel na zaˇc´atek tˇr´ıdˇen´eho pole length d´elka tˇr´ıdˇen´eho pole

last ukazatel na posledn´ı run na z´asobn´ıku count poˇcet run˚u na z´asobn´ıku

min gallop ud´av´a po kolika pˇrid´an´ı ze stejn´eho pole se pˇreskoˇc´ı na m´od cvalu 4.2.3 Tˇr´ıda RunTimSort

Tˇr´ıda RunTimSort udrˇzuje informace o jednotliv´ych runech a skl´ad´a se z tˇechto promˇenn´ych:

start pozice zaˇc´atku setˇr´ıdˇen´eho run v poli length d´elka setˇr´ıdˇen´eho runu

previous ukazatel na pˇredchoz´ı run na z´asobn´ıku next ukazatel na n´asleduj´ıc´ı run (defaultnˇe nullptr)

4.3 Paraleln´ı verze 1

V t´eto verzi jsem vyuˇzil technologii OpenMP. Vlastn´ı pole jsem pˇri pˇrekroˇcen´ı P ARALLEL M IN prvk˚u, rozdˇelil naN U M T HREADS ˇc´ast´ı.

P ARALLEL M IN aN U M T HREADSjsou konstanty, kter´e je potˇreba volit podle hardwaru na kter´em m´a algoritmus bˇeˇzet.

Kaˇzd´a ˇc´ast pracuje se sv´ym vlastn´ım z´asobn´ıkem. Tyto seˇrazen´e ˇc´asti jsou pak pˇrid´av´any na hlavn´ı z´asobn´ık, kter´y je postupnˇe sluˇcuje podle pravidel Timsortu. N´aslednˇe se slouˇc´ı jeˇstˇe neslouˇcen´e ˇc´asti. Vzhledem k tomu, ˇze poˇcet ˇ

c´ast´ı je stejn´y jako poˇcet vl´aken, a tedy bude kaˇzd´e vl´akno zpracov´avat pr´avˇe jednu iteraci for cyklu, nemus´ım ˇreˇsit zp˚usob pˇridˇelov´an´ı pr´ace vl´akn˚um.

Vnitˇrek algoritmu funguje obdobnˇe jako sekvenˇcn´ı verze.

(30)

4. Realizace

Uk´azka k´odu 4.1: Parallel Sort

#pragma omp p a r a l l e l f o r n u m t h re a d s (NUM THREADS) f o r (i n t i =0; i < NUM THREADS ; i ++) {

1 . v y t v o r e n i z a s o b n i k u pro t e n t o beh Timsortu 2 . p r o v e d e n i Timsortu na danem useku

3 . smazani z a s o b i k u }

4.4 Paraleln´ı verze 2

V druh´e paraleln´ı verzi vl´akna implementuji manu´alnˇe pomoc´ı C++ Thread support library. Vyuˇz´ıv´am knihovny thread, mutexacondition variable. Vy- uˇzil jsem tak´e tˇr´ıdu Semaphore podle StackOverflow. [14] K implementaci mi pˇribyla tˇr´ıda TimSortTask, kter´a uchov´av´a informace o zadan´e pr´aci pro jednotliv´a vl´akna. Tato informace je ve tˇr´ıdˇe uloˇzena ve formˇe ukazatele na run, kter´y bude pro operace sluˇcov´an´ı v´ychoz´ı a ˇc´ısla num, kter´e v sobˇe m´a uloˇzenou informaci o zda a kolikr´at se m´a run slouˇcit s pˇredchoz´ım runem, jak bude vysvˇetleno pozdˇeji. Jedn´a se v podstatˇe o implementaci probl´emu producenta a konzumenta. [2]

Uk´azka k´odu 4.2: TimSortTask c l a s s TimSortTask {

public:

RunTimSort ∗ run ; i n t num ;

};

MetodaSortnejprve vygenerujeN U M T HREADS−1 vl´aken na kter´ych bˇeˇz´ı metoda T hreadRun. N´aslednˇe se na hlavn´ım vl´aknˇe, stejnˇe jako v sek- venˇcn´ı verzi, zavol´a metoda SearchF orRuns, kter´a nalezen´e runy pˇrid´a na z´asobn´ık a z´aroveˇn pˇrid´a do fronty ´ukol˚u ukazatel na tento run, spoleˇcnˇe s ˇc´ıslemnum, kter´e v tuto chv´ıli nen´ı nic jin´eho neˇz poˇradov´e ˇc´ıslo nalezen´eho runu. Tedynum≥1.

Pot´e co dobˇehne metoda SearchF orRuns se i na hlavn´ım vl´aknˇe spust´ı metoda T hreadRun. T´ımto zp˚usobem mohu m´ıt neust´ale zamˇestnan´ych aˇz N U M T HREADSvl´aken. Ke konci bˇehu algoritmu ovˇsem uˇz nen´ı pro vl´akna tolik ´ukol˚u a nemus´ı bˇeˇzet vˇsechna.

V´yznam ˇc´ısla numje n´asleduj´ıc´ı. Pro poˇrad´ı sluˇcov´an´ı run˚u nem´am nyn´ı ˇz´adn´a pravidla, a mohl bych tedy sluˇcovat runy postupnˇe jak pˇrich´azej´ı, tento postup ale neumoˇzˇnuje paralelizaci. Nicm´enˇe pokud zde napodob´ım mer- gesort, a budu runy sluˇcovat po p´arech, paralelizace je nejen moˇzn´a, ale je dokonce i vhodn´a. Abych tohoto doc´ılil pˇred´av´am ´ukolu pr´avˇe i poˇradov´e ˇc´ıslo 16

(31)

4.5. Druh´a f´aze testov´an´ı

dan´eho runu. Pokud je toto ˇc´ıslo lich´e, v´ım, ˇze tento run s jemu pˇredch´azej´ıc´ım runem nem´am sluˇcovat, jelikoˇz sluˇcuji pr´avˇe kaˇzd´y druh´y run s runem pˇred- choz´ım. Nav´ıc, po slouˇcen´ı - a tedy zmˇenˇe pˇredchoz´ıho runu - toto ˇc´ıslo vydˇel´ım dvˇemi a opˇet zkoum´am jeho sudost. Nach´az´ı se totiˇz o jednu hladinu bl´ıˇze vrcholu pomysln´eho bin´arn´ıho stromu, kter´ym se toto sluˇcov´an´ı d´a reprezen- tovat.

Na n´asleduj´ıc´ım pˇr´ıkladu vid´ıme jak do sebe struktury uchov´avaj´ıc´ı runy se sud´ym ˇc´ıslem bˇehem sluˇcov´an´ı pojmou pˇredch´azej´ıc´ı runy.

run1(num= 1)→run2(num= 2) run3(num= 3)→run4(num= 4)

& .

run2(num= 1)→run4(num= 2)

run4(num= 1)

Toto s sebou pˇri paralelizaci nese riziko, ˇze se run bude snaˇzit slouˇcit s runem, kter´y jeˇstˇe nedobˇehl svou sekvenci sluˇcov´an´ı. Tento probl´em ˇreˇs´ım pomoc´ı semaforu, kter´y se odemkne aˇz ve chv´ıli, kdy je tento run oznaˇcen´y za uzavˇren´y. T´ım upozorn´ı vl´akno, kter´e na nˇej pˇr´ıpadnˇe ˇcek´a, ˇze je jiˇz k dispozici a sluˇcov´an´ı m˚uˇze zaˇc´ıt.

4.5 Druh´ a f´ aze testov´ an´ı

Pˇred druhou f´azi testov´an´ı jsem algoritmy pˇrebudouval na form´atstd::sort, tedy aby pro tˇr´ıdˇen´ıˇsli pouˇz´ıt r˚uzn´e kontejnery, aby algoritmus pˇrij´ımal srovn´av´ac´ı funkce apod. Hlavn´ı ˇc´asti algoritm˚u jsem ovˇsem ponechal v p˚uvodn´ı podobˇe.

(32)
(33)

Kapitola 5

Metody mˇ ren´ı

5.1 server STAR

Server na kter´em mˇeˇr´ım rychlosti jednotliv´ych verz´ı m´a dva ˇsestij´adrov´e proce- sory IntelR XeonR Processor E5-2620 v2. [15] [16] Celkovˇe tedy m˚uˇze souˇcasnˇe bˇeˇzet aˇz 12 vl´aken, odtud se odv´ıj´ı mnou zvolen´e konstanty pro poˇcet vl´aken.

Velikost RAM je 32 GB a tedy se na n´ı s velkou rezervou vejdou vˇsechna data, kter´a jsem pro mˇeˇren´ı v´ykon˚u pouˇzil.

5.2 Typy dat

Pro testov´an´ı jsem si vytvoˇril data nˇekolika typ˚u:

Seˇrazen´a data Data jsou seˇrazena vzestupnˇe N´ahodn´a data Data jsou generov´ana n´ahodnˇe

C´ˇasteˇcnˇe seˇrazen´a data Data jsou rozdˇelena do nˇekolika blok˚u, kter´e jsou seˇrazen´e vzestupnˇe

M´alo r˚uzn´ych hodnot Data jsou generov´ana n´ahodnˇe z mal´eho poˇctu r˚uzn´ych hodnot

Seˇrazen´a data s v´yjimkami Data jsou ˇrazena vzestupnˇe s 1% pravdˇepo- dobnost´ı n´ahodn´eho ˇc´ısla na kaˇzd´e pozici

Vˇsechna data stejn´a Vˇsechna data jsou maj´ı stejnou hodnotu

Data jsem ukl´adal v bin´arn´ıch souborech, kv˚uli ´uspoˇre m´ısta na disku (i tak jsem pracoval s nˇekolika GB dat). Na jejich vytvoˇren´ı jsem si pˇripravil programdata creator. Tento program vygeneruje zadan´e mnoˇzstv´ı dat dan´eho typu.

(34)

5. Metody mˇeˇren´ı

5.3 Metodika

K mˇeˇren´ıˇcasu jsem vyuˇzil knihovnychrono, ratioaotime. ˇR´ıd´ım se n´avodem z pˇredmˇetu BI-EIA. [17]

Testoval jsem ve dvou f´az´ıch.

5.3.1 Prvn´ı f´aze

V prvn´ı f´azi jsem testoval nezobecnˇen´e algoritmy na poli integer˚u s oper´atorem

<. Toto mˇeˇren´ı bylo d˚uleˇzit´e pro z´akladn´ı odhad efektivnosti jednotliv´ych verz´ı a porovn´aval jsem ho s ciz´ı implementac´ı sekvenˇcn´ı verze timsortu a std::sortem.

Pro testy jsem si vygeneroval data velikost´ı 1 000 000, 5 000 000, 10 000 000, 50 000 000, 100 000 000 a 500 000 000 prvk˚u.

Nad tˇemito daty jsem provedl tˇr´ıdˇen´ı kaˇzdou metodou 5× pro z´ısk´an´ı pˇresnˇejˇs´ıch v´ysledk˚u. Tyto v´ysledn´e hodnoty jsem n´aslednˇe porovnal s v´ysledky tˇr´ıdˇen´ı pomoc´ı std :: sort a vytvoˇril grafy pomˇeru rychlosti jednotliv´ych verz´ı pr´avˇe v˚uˇci std :: sort. Tento zp˚usob zobrazov´an´ı v´ysledk˚u je v grafu pˇrehlednˇejˇs´ı, neˇz pouh´e ˇcasy, nebot’ ˇcas tˇr´ıdˇen´ı je velmi odliˇsn´y pro jednotliv´e velikosti dat i verze algoritmu.

5.3.2 Druh´a f´aze

V druh´e f´azi jsem mˇeˇril na stejn´ych typech dat, nicm´enˇe jsem je pro ´uˇcely mˇeˇren´ı reprezentoval jinak. Vˇsechny verze jsem jiˇz mˇel zobecnˇen´e pro stejn´e uˇzit´ı jako std :: sort. Srovn´aval jsem vector tˇr´ıdy MyClass, kter´a reprezen- tovala data pomoc´ı pole 32 boolean˚u. Pouˇzit´y kompar´ator nejprve poskl´adal z pole boolean˚u p˚uvodn´ı integer zpˇet a aˇz pot´e provedl samotn´e porovn´an´ı.

Tento postup mˇel simulovat ˇrazen´ı sloˇzitˇejˇs´ıch objekt˚u.

Pro testy jsem si vygeneroval data velikost´ı 1 000 000, 5 000 000, 10 000 000 a 50 000 000 prvk˚u. S v´ıce prvky jsem jiˇz netestoval, jelikoˇz tˇr´ıdit velk´a pole s velice pomalou srovn´avac´ı funkc´ı by trvalo pˇr´ıliˇs dlouho.

Opˇet jsem provedl mˇeˇren´ı nad tˇemito daty 5× a v´ysledn´e hodnoty zanesl do grafu jako pomˇer v˚uˇcistd::sort.

20

(35)

Kapitola 6

ysledky mˇ ren´ı

6.1 Prvn´ı f´ aze

6.1.1 N´ahodn´a data

Pˇri pohledu na graf n´ahodn´ych dat 6.1 si m˚uˇzeme vˇsimnout, ˇzestd::sort je kromˇe naivn´ı paraleln´ı verze nejrychlejˇs´ı. Toto pozorov´an´ı odpov´ıd´a v´ysled- k˚um, kter´e namˇeˇril Tim Peters. [18]

Obr´azek 6.1: N´ahodn´a data

6.1.2 M´alo r˚uzn´ych hodnot

Na grafu mˇeˇren´ı dat s m´alo r˚uzn´ymi hodnotami 6.2 opˇet vid´ıme, ˇzestd::sort je rychlejˇs´ı. Opˇet m˚uˇzeme stejn´y trend pozorovat i u Petersov´ych v´ysledk˚u.

(36)

6. V´ysledky mˇeˇren´ı

[18]

Obr´azek 6.2: M´alo ruzn´ych hodnot

6.1.3 Seˇrazen´a data s v´yjimkami

Na grafu mˇeˇren´ı dat s vyj´ımkami 6.3 je naivn´ı paralelizace suver´enˇe nejrych- lejˇs´ı, pokroˇcil´a paralelizace je zde podobnˇe rychl´a jako std :: sort a tedy nˇekolikan´asobnˇe pomalejˇs´ı, neˇz sekvenˇcn´ı verze.

6.1.4 Seˇrazen´a a stejn´a data

Za povˇsimnut´ı stoj´ı t´emˇeˇr stejn´y graf pro seˇrazen´a data 6.5 a graf stejn´ych hodnot 6.4. Pro timsort jsou tato data prakticky totoˇzn´a, pole stejn´ych hodnot je totiˇz tak´e jiˇz seˇrazen´e a timsort tedy cel´e pole projde jen jednou. Zrychlen´ı oprotistd::sort je t´emˇeˇr desetin´asobn´e u vˇsech variant.

6.1.5 C´ˇasteˇcnˇe seˇrazen´a

To sam´e se d´a ˇr´ıct i o mˇeˇren´ı na ˇc´asteˇcnˇe seˇrazen´ych datech 6.3 s t´ım rozd´ılem, ˇze na tˇechto datech je pokroˇcil´a paralelizace rychlejˇs´ı, neˇz ta naivn´ı. Tento jev bude zp˚usoben´y t´ım, ˇze pˇri naivn´ı paralelizaci dˇel´ıme pole na v´ıce ˇc´ast´ı, neˇz kolik m´ame v datech vnoˇren´ych seˇrazen´ych podposloupnost´ı. Z tohoto d˚uvodu prov´ad´ı naivn´ı paralelizace v´ıce sluˇcov´an´ı. Nicm´enˇe, jak je vidˇet, zrychlen´ı v˚uˇci sekvenˇcn´ı verzi nen´ıpˇr´ıliˇs znateln´e.

22

(37)

6.1. Prvn´ı f´aze

Obr´azek 6.3: Seˇrazen´a data s v´yjimkami

Obr´azek 6.4: Vˇsechna data stejn´a

6.1.6 Shrnut´ı prvn´ı f´aze

Z namˇeˇren´ych dat mi vyplynula jako nejlepˇs´ı ˇreˇsen´ı naivn´ı paralelizace. Po- kroˇcil´a verze se uk´azala jako dosti nevhodn´a. Naivn´ı paralelizace ji pˇredˇcila na vˇsech typech dat, kromˇe ˇc´asteˇcnˇe seˇrazen´ych, a nav´ıc se u n´ahodn´ych dat, seˇrazen´ych s nˇekolika v´yjimkami a na datech s mal´ym poˇctem r˚uzn´ych hodnot uk´azala jako naprosto neefektivn´ı.

(38)

6. V´ysledky mˇeˇren´ı

Obr´azek 6.5: Seˇrazen´a data

Obr´azek 6.6: ˇC´asteˇcnˇe seˇrazen´a data

Toto m˚uˇze b´yt d˚usledek spojov´an´ı r˚uznˇe velk´ych podposloupnost´ı a tak´e pln´ym nevyuˇzit´ım vˇsech vl´aken u nˇekolika posledn´ıch, a tedy i nejn´aroˇcnˇejˇs´ıch, sluˇcov´an´ı.

Vl´akna nejsou plnˇe vyuˇzita z d˚uvodu, ˇze pˇri sluˇcov´an´ı nˇekolika posledn´ıch run˚u m´ame m´enˇe ˇc´ast´ı, neˇz vl´aken a tedy pro vl´akna nem´ame pr´aci. Pr´ace nad stejnou frontou ´ukol˚u tak´e m˚uˇze algoritmus zdrˇzovat, jelikoˇz mus´ıme zabr´anit 24

(39)

6.2. Druh´a f´aze

pˇr´ıstupu k frontˇe v´ıce vl´akn˚um najednou a tedy roste ˇcas kdy vl´akna ˇcekaj´ı a nepracuj´ı. Ztr´aty zp˚usoben´e sluˇcov´an´ım run˚u, kter´e nemus´ı b´yt v cache a kter´e nemus´ı b´yt podobnˇe dlouh´e algoritmus tak´e zdrˇzuj´ı. Zaj´ımav´a byla neefektivita tohoto zp˚usobu algoritmu u seˇrazen´ych dat s vyj´ımkami, zde jsem oˇcek´aval od pokroˇcil´e paralelizace mnohem lepˇs´ı vlastnosti. Zd´a se ale, ˇze procento n´ahodn´ych dat pˇrebije mnoˇzstv´ı ˇc´asteˇcnˇe seˇrazen´ych posloupnost´ı.

6.2 Druh´ a f´ aze

Ve druh´e f´azi testov´an´ı byly v´ysledky mnohem uspokojivˇejˇs´ı. Naivn´ı para- leln´ı verze se opˇet uk´azala jako lepˇs´ı, nicm´enˇe i pokroˇcil´a verze paraleln´ıho algoritmu pˇredvedla sv´e kvality.

6.2.1 N´ahodn´a data

Na n´ahodn´ych datech se opakuje pozorov´an´ı z prvn´ı f´aze a totiˇz, ˇze ˇcistˇe n´ahodn´a data nejsou pro timsort to prav´e. Obˇe dvˇe sekvenˇcn´ı verze por´aˇz´ı std::sort.

Oproti prvn´ı f´azi ale vid´ıme znateln´e zlepˇsen´ı ve v´ykonu 2. paraleln´ı verze.

Vysvˇetluji si to t´ım, ˇze na jednoduch´e porovn´avac´ı operace byla n´aroˇcnost na reˇzii pˇr´ıliˇs vysok´a. Zde trv´a srovn´an´ı o nˇeco d´ele a tedy vl´akno str´av´ı vˇetˇs´ı ˇ

c´ast sv´eho ˇcasu aktivn´ı prac´ı, nam´ısto ˇcek´an´ım.

Obr´azek 6.7: N´ahodn´a data - F´aze 2

(40)

6. V´ysledky mˇeˇren´ı

6.2.2 M´alo r˚uzn´ych hodnot

Opˇet zde vid´ıme v´yrazn´e zlepˇsen´ı druh´e verze paralelizace, skuteˇcnˇe se pro- jevuje vˇetˇs´ı pomˇer aktivn´ıho ˇcasu. Za zm´ınku stoj´ı v´yrazn´e zlepˇsen´ı obou sekvenˇcn´ıch verz´ı - projevuje se zde ´uspornost Timsortu na porovn´avac´ıch operac´ıch.

Obr´azek 6.8: M´alo r˚uzn´ych hodnot - F´aze 2

6.2.3 Seˇrazen´a data s v´yjimkami

Naivn´ı verze je pro tyto data aˇz 100× rychlejˇs´ı, neˇz std::sort. Oproti prvn´ı f´azi se zde jako velmi rychl´a verze uk´azala i druh´a paraleln´ı.

6.2.4 Vˇsechna data stejn´a a Seˇrazen´a data

Podobn´y efekt pozorujeme i u dalˇs´ıch dvou typ˚u dat. Rozdˇelen´ı pole na stejn´e ˇc´asti, kter´e jsou n´aslednˇe zpracov´av´any timsortem se jednoznaˇcnˇe vypl´ac´ı.

Zaj´ımav´e je ovˇsem pozorov´an´ı, ˇze zat´ımcogf x::timsortm´a na obou typech dat zhruba stejn´e ˇcasy, moje implementace je na seˇrazen´ych datech o 1/4 rychlejˇs´ı neˇz na datech navz´ajem rovn´ych. Zat´ımco tedy na seˇrazen´ych datech je moje sekvenˇcn´ı verze rychlejˇs´ı neˇz gf x :: timsort, na rovn´ych datech je tomu obr´acenˇe.

6.2.5 C´ˇasteˇcnˇe seˇrazen´a

U ˇc´asteˇcnˇe seˇrazen´ych dat opˇet pozorujeme ty sam´e tendence jako u dat seˇrazen´ych plnˇe, s t´ım rozd´ılem, ˇze pokroˇcil´a paraleln´ı verze je zde rychlejˇs´ı.

26

(41)

6.2. Druh´a f´aze

Obr´azek 6.9: Seˇrazen´a data s v´yjimkami - F´aze 2

Obr´azek 6.10: Vˇschna data stejn´a - F´aze 2

Je to t´ım, ˇze na seˇrazen´ych datech pracuje celou dobu vlastnˇe pouze jedno vl´akno, zde se dostane ke slovu vl´aken v´ıce.

(42)

6. V´ysledky mˇeˇren´ı

Obr´azek 6.11: Seˇrazen´a data - F´aze 2

Obr´azek 6.12: ˇC´asteˇcnˇe seˇrazen´a data - F´aze 2

6.2.6 Shrnut´ı druh´e f´aze

Druh´a f´aze potvrdila pozorov´an´ı z prvn´ı a tedy, ˇze naivn´ı verze je funkˇcn´ı a efektivn´ı. Tak´e pokroˇcil´a verze se na sloˇzit´ych porovn´avac´ıch funkc´ıch uk´azala jako efektivn´ı.

28

(43)

avˇ er

Bˇehem n´avrhu paraleln´ı verze jsem narazil na ˇradu slep´ych uliˇcek, ve v´ysledku jsem tedy musel pˇristoupit k paraleln´ı verzi algoritmu, kter´a nˇekter´e principy Timsortu pop´ır´a. Bohuˇzel ani ta se nejprve neuk´azala jako pˇr´ıliˇs efektivn´ı. Pro nˇekter´e typy dat byla dokonce i pomalejˇs´ı, neˇz verze sekvenˇcn´ı. Ve druh´e f´azi testov´an´ı, totiˇz na datech s drahou porovn´avac´ı funkc´ı se ale pokroˇcil´a verze algoritmu o nˇeco l´epe a jej´ı v´yvoj tak nebyl ´uplnou ztr´atou ˇcasu.

Z d˚uvodu pˇr´ıliˇsn´eho lpˇen´ı na dodrˇzen´ı vˇsech pravidel Timsortu bˇehem poˇc´atku n´avrhu a celkov´eho vˇetˇs´ıho zamˇeˇren´ı na algoritmickou str´anku pro- bl´emu, oproti str´ance implementaˇcn´ı mi nezbylo pˇr´ıliˇs ˇcasu na podrobn´e pro- zkoum´an´ı moˇznost´ı implementace pomoc´ı r˚uzn´ych technologi´ı.

Za ´uspˇech ale naopak povaˇzuji namˇeˇren´ı vysok´e efektivity naivn´ı paraleln´ı verze, kter´a si na vˇsech typech dat, s jedinou v´yjimkou, poˇc´ınala nejl´epe.

Nav´azat na tuto pr´aci se d´a tedy ve dvou smˇerech: zdokonalit a zobec- nit naivn´ı verzi pro bˇeˇzn´e pouˇz´ıv´an´ı nebo prozkoumat ´uskal´ı verze pokroˇcil´e, nejsp´ıˇse pˇr´ıliˇs drahou reˇzii pˇri obsluze jednotliv´ych vl´aken.

(44)
(45)

Literatura

[1] Trdliˇcka, J.: Procesy a vl´akna. [online], [cit. 2018-05-10]. Dostupn´e z: https://edux.fit.cvut.cz/courses/BI-OSY/_media/lectures/02/

bi-osy-p02-threads.pdf

[2] Trdliˇcka, J.: Synchronizace proces˚u/vl´aken. [online], [cit. 2018-05- 10]. Dostupn´e z: https://edux.fit.cvut.cz/courses/BI-OSY/_media/

lectures/03/bi-osy-p03-ipc-1.pdf

[3] std::mutex. [online], [cit. 2018-05-10]. Dostupn´e z: http:

//en.cppreference.com/w/cpp/thread/mutex

[4] std::condition variable. [online], [cit. 2018-05-10]. Dostupn´e z: http://

en.cppreference.com/w/cpp/thread/condition_variable

[5] OpenMP. [online], [cit. 2018-05-14]. Dostupn´e z: https:

//cs.wikipedia.org/wiki/OpenMP

[6] ˇSimeˇcek, I.:Modern´ı poˇc´ıtaˇcov´e architektury a optimalizace implementace algoritm˚u. Praha: ˇCesk´a Technika - nakladatelstv´ı ˇCVUT, prvn´ı vyd´an´ı, 2015, ISBN 978-80-01-05658-5.

[7] Thread Support Library. [online], [cit. 2018-05-10]. Dostupn´e z: http:

//en.cppreference.com/w/cpp/thread

[8] Peters, T.: TimSort. [online], [cit. 2018-04-25]. Dostupn´e z: https://

bugs.python.org/file4451/timsort.txt

[9] Auger, N.; Nicaud, C.; Pivoteau, C.: Merge Strategies: from Merge Sort to TimSort. 2015, [cit. 2018-04-25]. Dostupn´e z: https://hal-upec- upem.archives-ouvertes.fr/hal-01212839v2/document

[10] MacIver, D. R.: Understanding timsort, Part 1: Adaptive Mergesort.

[cit. 2018-04-25]. Dostupn´e z: https://www.drmaciver.com/2010/01/

understanding-timsort-1adaptive-mergesort/

(46)

Literatura

[11] Sood, S.: Parallelizing Timsort. Saurabh Sood’s Blog, [cit. 2015-10- 31]. Dostupn´e z: https://saurabhsoodweb.wordpress.com/2017/04/

18/parallelizing-timsort/

[12] gfx::Timsort. [online], [cit. 2018-04-25]. Dostupn´e z: https:

//github.com/gfx/cpp-TimSort

[13] std::sort. [online], [cit. 2018-04-25]. Dostupn´e z: https://

en.cppreference.com/w/cpp/algorithm/sort

[14] Semaphore. [online], [cit. 2018-05-06]. Dostupn´e z: https:

//stackoverflow.com/questions/4792449/c0x-has-no-semaphores- how-to-synchronize-threads

[15] IntelR XeonR Processor E5-2620 v2. [online], [cit. 2018-05-10]. Dostupn´e z: https://ark.intel.com/products/75789/Intel-Xeon-Processor- E5-2620-v2-15M-Cache-2_10-GHz

[16] ˇSimeˇcek, I.: V´ypoˇcetn´ı prostˇredky. [online], [cit. 2018-05-10]. Dostupn´e z: https://edux.fit.cvut.cz/courses/MI-PAP/labs/vypocetni_

prostredky

[17] ˇSimeˇcek, I.: Mˇeˇren´ı ˇcasu. Dostupn´e z: https://edux.fit.cvut.cz/

courses/BI-EIA/tutorials/cas

[18] [Python-Dev] Sorting. [online], [cit. 2018-05-11]. Dostupn´e z: https://

mail.python.org/pipermail/python-dev/2002-July/026837.html

32

(47)

Pˇ r´ ıloha A

Obsah pˇ riloˇ zen´ eho CD

contents.txt ...struˇcn´y popis obsahu CD readme.txt ...n´avod ke kompilaci a spuˇstˇen´ı aplikace Makefile...makefile ke kompilaci a spuˇstˇen´ı aplikace exe ...adres´aˇr se spustitelnou formou implementace src

impl...zdrojov´e k´ody implementace Phase1...zdrojov´e k´ody testov´an´ı prvn´ı f´aze Phase2 ...zdrojov´e k´ody testov´an´ı druh´e f´aze thesis ...zdrojov´a forma pr´ace ve form´atu LATEX text ...text pr´ace thesis.pdf ...text pr´ace ve form´atu PDF zadani.pdf...zad´an´ı pr´ace ve form´atu PDF results ...v´ysledky mˇeˇren´ı Phase1...v prvn´ı f´azi Phase2 ...ve druh´e f´azi

Odkazy

Související dokumenty

Na z´akladˇe anal´yzy implementuje v druh´e ˇc´asti pr´ace ˇreˇsen´ı detekce a sledov´an´ı vozidel pomoc´ı modelu DETR, kter´y je absolutn´ı novinka mezi modely pro

Na konzultace doch´ azel o nˇ eco m´ enˇ e ˇ casto, neˇ z bych povaˇ zoval za optim´ aln´ı, na rychlost postupu pr´ ace to nicm´ enˇ e negativn´ı dopad nemˇ elo, stu-

Teˇ ziˇstˇ em bakal´ aˇrsk´ e pr´ ace je implementace origin´ aln´ı aplikace pro tvorbu animac´ı, jej´ıˇ z hlavn´ı konkurenˇ cn´ı v´ yhodou je podpora pro automatick´

Pˇredloˇ zen´ a bakal´ aˇrsk´ a pr´ ace se zab´ yv´ a odhadov´ an´ım geometrie dvou kamer z korespondenc´ı, za situac´ı kdy se vyskytuje v´ yznamn´ e mnoˇ zstv´ı

Pˇredmˇ etem t´ eto bakal´ aˇrsk´ e pr´ ace je odvozen´ı diferenci´ aln´ıch rovnic obecn´ e teorie relativity vhodn´ ych pro jejich numerick´ e ˇreˇsen´ı.

Pˇ restoˇ ze jsem mˇ el v praxi moˇ znost otestovat pouze druhou komponentu, mus´ım konstatovat, ˇ ze zad´ an´ı bakal´ aˇ rsk´ e pr´ ace se podaˇ rilo splnit a v´ ysledn´

Nicm´ enˇ e k tomu, aby v´ ysledek pr´ ace mohl b´ yt zaˇ clenˇ en do v´ yvojov´ e verze PyWPS chyb´ı vyˇ reˇ sit nˇ ekolik probl´ em˚ u. V dobˇ e odevzd´ an´ı pr´

D´ ale vzhledem k moˇ znostem Ozobota je potˇ reba navrhnout framework, kter´ y bude bˇ eˇ zet na Ozobotech a pomoc´ı kter´ eho Ozoboti budou vyplˇ novat v´ ysledn´ y pl´ an