• Nebyly nalezeny žádné výsledky

Bc.JaroslavRyba Efektivn´ın´asoben´ıˇr´ıdk´ychmatic Diplomov´apr´ace

N/A
N/A
Protected

Academic year: 2022

Podíl "Bc.JaroslavRyba Efektivn´ın´asoben´ıˇr´ıdk´ychmatic Diplomov´apr´ace"

Copied!
73
0
0

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

Fulltext

(1)
(2)
(3)

Diplomov´ a pr´ ace

Efektivn´ı n´ asoben´ı ˇ r´ıdk´ ych matic

Bc. Jaroslav Ryba

Katedra softwarov´eho inˇzen´yrstv´ı

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

7. kvˇetna 2019

(4)
(5)

Podˇ ekov´ an´ı

Chtˇel bych podˇekovat sv´emu vedouc´ımu diplomov´e pr´ace doc. Ing. Ivanu Simeˇˇ ckovi, Ph.D., za odborn´e veden´ı, za pomoc a rady pˇri zpracov´an´ı t´eto pr´ace. Dˇekuji tak´e Mgr. Drahoslavˇe Rybov´e za pomoc pˇri gramatick´e kontrole pr´ace.

(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 7. kvˇetna 2019 . . . .

(8)

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

c 2019 Jaroslav Ryba. 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

Ryba, Jaroslav. Efektivn´ı n´asoben´ı ˇr´ıdk´ych matic. Diplomov´a pr´ace. Praha:

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

(9)

Abstrakt

Tato diplomov´a pr´ace se zab´yv´a implementac´ı z´akladu knihovny pro pr´aci s ˇr´ıdk´ymi maticemi. D´ale je obsaˇzena implementace a optimalizace masivnˇe paralelizovan´eho n´asoben´ı matic na GPU za vyuˇzit´ı technologie CUDA.

Pr´ace tak´e slouˇz´ı k poskytnut´ı vhledu do problematiky n´asoben´ı matic, ˇr´ıdk´ych matic a efektivn´ı implementace algoritm˚u v technologii CUDA obecnˇe.

Kl´ıˇcov´a slova N´asoben´ı matic, ˇr´ıdk´e matice, CUDA, optimalizace, knihov- na, GPU, C++.

Abstract

This master’s thesis deals with implementation of the basis of sparse mat- rix library. It also contains implementation and optimalisations of massively parallel matrix multiplication on GPU in the CUDA technology.

This work is also intended to give basic level understanding of the mat- rix multiplication, sparse matrices and efficient implementation of algorithms under the limitations of the CUDA technology.

Keywords Matrix multiplication, sparse matrices, CUDA, optimization, library, GPU, C++.

(10)
(11)

Obsah

Uvod´ 1

1 Anal´yza 3

1.1 Z´akladn´ı pojmy . . . 3

1.2 Form´aty ˇr´ıdk´ych matic . . . 5

1.3 Algoritmy n´asoben´ı hust´ych matic . . . 11

1.4 Reˇserˇse existuj´ıc´ıch knihoven . . . 13

2 N´avrh 19 2.1 Interface . . . 19

2.2 Form´aty matic . . . 19

2.3 Sekvenˇcn´ı algoritmy . . . 20

2.4 Z´akladn´ı struktura paraleln´ıch algoritm˚u . . . 26

2.5 Pˇrechod mezi high level a low level funkcemi . . . 27

2.6 N´avrh tˇr´ıd . . . 29

3 Implementace 31 3.1 Implementace z´akladn´ı funkcionality . . . 31

3.2 Uˇzivatelsk´y interface . . . 31

3.3 Implementace CUDA . . . 32

3.4 Vyuˇzit´ı prostˇredk˚u CUDA . . . 33

3.5 Optimalizace . . . 33

4 Testov´an´ı 39 4.1 Testovac´ı hardware . . . 39

4.2 Nastaven´ı kompilace . . . 39

4.3 Unit testy . . . 40

4.4 Vˇecn´a spr´avnost implementace . . . 40

4.5 Testovac´ı data . . . 41

4.6 Vstupn´ı form´at matic . . . 41

(12)

4.7 Sekvenˇcn´ı verze . . . 41

4.8 Efektivita optimalizac´ı RC verze . . . 46

4.9 Efektivita optimalizac´ı CR verze . . . 48

4.10 Porovn´an´ı s cuSPARSE . . . 49

Z´avˇer 51

Literatura 53

5 Seznam pouˇzit´ych zkratek 55

6 Obsah pˇriloˇzen´eho CD 57

(13)

Seznam obr´ azk˚ u

1.1 Diagon´aln´ı form´at, pˇrevzato z [1] . . . 8

1.2 Vzorov´a matice z tabulky 1.1 ve form´atu ELL . . . 9

1.3 Vzorov´a matice z tabulky 1.1 v hybridn´ım form´atu . . . 10

2.1 Vysoko´urovˇnov´a funkce n´asoben´ı matic . . . 28

2.2 Z´akladn´ı n´avrh tˇr´ıd pro matice . . . 30

4.1 Graf z´avislosti doby bˇehu na velikosti matice s hustotou 10 % . . . 42

4.2 Graf z´avislosti doby bˇehu na hustotˇe matice o velikosti 1000×1000 42 4.3 Graf z´avislosti doby bˇehu na hustotˇe matice form´atu CRS . . . 44

4.4 Graf z´avislosti doby bˇehu na hustotˇe matice form´atu ELL . . . 44

4.5 Graf z´avislosti doby bˇehu na hustotˇe matice form´atu BCRS . . . . 45

4.6 Graf z´avislosti doby bˇehu na hustotˇe matice form´atu DIA . . . 46

4.7 Graf efektivity optimalizac´ı RC verze . . . 47

4.8 Graf efektivity optimalizac´ı RC verze na BCRS . . . 47

4.9 Graf efektivity optimalizac´ı CR verze . . . 48

4.10 Porovn´an´ı efektivity optimalizovan´ych algoritm˚u s cuSPARSE . . . 49

(14)
(15)

Seznam tabulek

1.1 Vzorov´a hust´a matice . . . 5

1.2 Vzorov´a matice z tabulky 1.1 ve form´atu COO . . . 6

1.3 Vzorov´a matice z tabulky 1.1 ve form´atu CRS . . . 7

1.4 Vzorov´a matice z tabulky 1.1 ve form´atu CCS . . . 7

1.5 Vzorov´a matice z tabulky 1.1 ve form´atu BCRS . . . 7

4.1 Porovn´an´ı doby bˇehu v´ypoˇctu v ms . . . 49

(16)
(17)

Uvod ´

Jedn´ım ze z´akladn´ıch algebraick´ych probl´em˚u je n´asoben´ı matic. Tato ope- race je z´akladn´ım stavebn´ım kamenem mnoha v praxi v´yznamn´ych algo- ritm˚u, napˇr´ıklad fyzik´aln´ıch simulac´ı, hled´an´ı nejkratˇs´ı cesty. ˇCasto se tak´e vyuˇz´ıv´a v poˇc´ıtaˇcov´e grafice.

Reˇˇ sen´ı tohoto probl´emu se vˇenovalo jiˇz znaˇcn´e ´usil´ı a za posledn´ı stolet´ı se podaˇrilo sn´ıˇzit teoretickou ˇcasovou sloˇzitost vyn´asoben´ı dvou matic z na- ivn´ıho kubick´eho algoritmu (O(n3)) aˇz na ´uroveˇn Coppersmith-Winogradova algoritmu (O(n2.372)) a dos´ahnout i znaˇcn´ych zlepˇsen´ı efektivity implementac´ı tˇechto algoritm˚u.

Mnoho probl´em˚u vˇsak vede na n´asoben´ı ˇr´ıdk´ych matic, tedy matic s vel- k´ym mnoˇzstv´ım nulov´ych prvk˚u. Klasick´e algoritmy n´asoben´ı matic nejsou schopn´e vyuˇz´ıt t´eto vlastnosti matic a jejich ˇcasov´a sloˇzitost je nez´avisl´a na mnoˇzstv´ı nenulov´ych prvk˚u. Pˇri vyuˇzit´ı t´eto vlastnosti je vˇsak moˇzn´e uˇsetˇrit znaˇcnou ˇc´ast v´ypoˇcetn´ıch prostˇredk˚u a dos´ahnout tak mnohem vyˇsˇs´ı rychlosti v´ypoˇct˚u.

Vzhledem k neust´al´emu zvyˇsov´an´ı v´ykonu grafick´ych karet (GPU) a po- mal´emu r˚ustu v´ykonu CPU se v posledn´ıch letech st´ale ˇcastˇeji v´ypoˇcty pˇresou- vaj´ı na GPU a masivnˇe paralelizuj´ı. Spr´avnˇe implementovan´y a optimalizo- van´y algoritmus tak m˚uˇze teoreticky z´ıskat pˇr´ıstup k ˇr´adovˇe sto i tis´ıcin´asob- n´ym v´ypoˇcetn´ım prostˇredk˚um. Tento trend je takt´eˇz pos´ılen relativn´ı jedno- duchost´ı implementace k´od˚u za pomoc specializovan´ych technologi´ı (CUDA, openCV).

Tato pr´ace se zamˇeˇruje na v´yˇse zm´ınˇen´y probl´em n´asoben´ı ˇr´ıdk´ych matic a vyuˇzit´ı v´ypoˇct˚u na grafick´e kartˇe pro jeho ˇreˇsen´ı. C´ılem pr´ace je poskytnout ˇ

cten´aˇri vhled do z´akladn´ı problematiky n´asoben´ı matic, problematiky ˇr´ıdk´ych matic a operac´ı s nimi a souˇcasn´eho stavu existuj´ıc´ıch knihoven pro pr´aci s ˇr´ıdk´ymi maticemi.

D´ale je souˇc´ast´ı pr´ace navrˇzen´ı a implementace kostry knihovny pro pr´aci s ˇr´ıdk´ymi maticemi, kter´a m˚uˇze v budoucnu slouˇzit jako z´aklad pro testov´an´ı

(18)

Uvod´

algoritm˚u a pˇr´ıpadnˇe i jako z´aklad vˇetˇs´ıch projekt˚u. V neposledn´ı ˇradˇe je tak´e souˇc´ast´ı pr´ace implementace a optimalizace nˇekolika implementac´ı n´asoben´ı ˇr´ıdk´ych matic v technologii CUDA (a integrace do vytvoˇren´e kostry knihovny).

V posledn´ı ˇc´asti pr´ace jsou vytvoˇren´e k´ody testov´any, vyhodnoceny a po- rovn´any s efektivitou souˇcasn´e verze

”konkurenˇcn´ı“ knihovny pro n´asoben´ı ˇr´ıdk´ych matic na GPU.

Tato pr´ace m˚uˇze slouˇzit jako studijn´ı materi´al pro z´ajemce o problematiku ˇr´ıdk´ych matic, praktick´a ˇc´ast pak m˚uˇze b´yt vyuˇzita jako z´aklad pro vytvoˇren´ı v praxi pouˇziteln´e implementace efektivn´ı knihovny pro pr´aci s ˇr´ıdk´ymi ma- ticemi.

C´ılem prvn´ı kapitoly (Anal´yza) je sezn´amit ˇcten´aˇre se z´akladn´ı problema- tikou n´asoben´ı matic a algoritmy pouˇz´ıvan´ymi pro n´asoben´ı matic v hust´ych form´atech. D´ale se v t´eto kapitole tak´e ˇcten´aˇr doˇcte o form´atech ukl´ad´an´ı ˇr´ıdk´ych matic, jejich specifik´ach a siln´ych str´ank´ach. V neposledn´ı ˇradˇe se zde tak´e nach´az´ı reˇserˇse souˇcasn´ych knihoven pro pr´aci s ˇr´ıdk´ymi maticemi a in- formace o tom, jak´e algoritmy a jak´y interface tyto knihovny pouˇz´ıvaj´ı. Tyto informace budou v dalˇs´ıch ˇc´astech vyuˇzity k n´avrhu nov´e knihovny.

Ve druh´e kapitole (N´avrh) je nejdˇr´ıve zd˚uvodnˇen v´ybˇer form´at˚u ˇr´ıdk´ych matic pro implementaci, d´ale jsem navrˇzeny a pops´any sekvenˇcn´ı algoritmy a datov´e struktury pro pr´aci s vybran´ymi form´aty a navrˇzeny dva zp˚usoby paralelizace algoritm˚u n´asoben´ı matic. Je zde tak´e pops´an z´aklad tˇr´ıdn´ı struk- tury navrˇzen´e knihovny a integrace paraleln´ıch algoritm˚u s knihovnou.

Ve tˇret´ı kapitole (Implementace) je pops´an pr˚ubˇeh implementace knihovny a paralelizovan´eho n´asoben´ı. Je zde pops´ana ˇsk´ala vyuˇzit´ych postup˚u pro op- timalizaci CUDA (paralelizovan´ych) k´od˚u a racionalizace tˇechto technik. Jsou zde zm´ınˇena i nˇekter´a omezen´ı t´eto technologie a jak se s nimi vypoˇr´adat.

V posledn´ı kapitole (Testov´an´ı) je pops´an zp˚usob testov´an´ı spr´avnosti a efektivity implementac´ı, vˇcetnˇe vyuˇzit´eho hardwaru a parametr˚u kompilace.

D´ale se zde nach´az´ı v´ysledky testov´an´ı efektivity hlavn´ıch optimalizaˇcn´ıch technik a verz´ı paralelizovan´ych algoritm˚u. V neposledn´ı ˇradˇe se zde takt´eˇz nach´az´ı srovn´an´ı efektivity s knihovnou cuSPARSE.

(19)

Kapitola 1

Anal´ yza

C´ılem t´eto kapitoly je sezn´amen´ı s problematikou, kterou se tato pr´ace d´ale zab´yv´a (n´asoben´ı matic, ˇr´ıdk´e matice), a s pˇr´ıstupem

”konkurenˇcn´ıch“ aplikac´ı k ˇreˇsen´ı t´eto problematiky.

1.1 akladn´ı pojmy

V t´eto sekci jsou definov´any nˇekter´e v´yznamn´e term´ıny vyuˇz´ıvan´e d´ale v pr´aci.

Nen´ı-li uvedeno jinak, je matematick´y z´aklad ˇcerp´an z [2], definice jsou vˇsak parafr´azov´any, upraveny a zjednoduˇseny pro ´uˇcely t´eto pr´ace.

Definice 1.1. Necht’ m, n ∈ N. Uspoˇr´adan´y soubor n·m ˇc´ısel zapsan´y do tabulky o n ˇr´adc´ıch a m sloupc´ıch naz´yv´ame matice typu n×m. Matici obvykle znaˇc´ıme takto:

A=

a11 a12 . . . a1m

a21 a22 . . . a2m

... ... . .. ... an1 an2 . . . anm

,

kde aij jsou prvky matice. ˇC´ıslu i ˇr´ık´ame ˇr´adkov´y a ˇc´ıslu j sloupcov´y index. [2]

Definice 1.2. Necht’m, n, i∈N. MaticiA typun×1 budeme naz´yvatslup- cov´y vektoro d´elcen. Matici typu 1×mbudeme naz´yvatˇr´adkov´y vektor o d´elce m, zkr´acenˇe pak vektor o d´elce m, a jeho prvky a1j;jm m˚uˇzeme zkr´acenˇe ps´ataj

Definice 1.3. Necht’ n∈N aA, B jsou vektory o d´elce n. Skal´arn´ı souˇcin vektor˚u c=A·B definujeme takto:c=Pnk=1ak·bk.

(20)

1. Anal´yza

Definice 1.4. Necht’ m, n ∈ N, α ∈ R a A je matice typu n×m. Souˇcin matice A s re´aln´ym ˇc´ıslem α, znaˇc´ıme C =α·A, je matice typu n×m, pro kterou plat´ı

∀i, j∈N, in, jm:cij =αaij.

Definice 1.5. Necht’m, n∈NaA, Bjsou matice typun×m.Souˇcet matic C = A+B je matice typu n×m, pro kterou plat´ı∀i, j ∈ N, in, jm : cij =aij +bij.

Definice 1.6. Necht’m, n∈NaAje matice typun×m.Transpozic´ı matice A, znaˇc´ımeAT, naz´yv´ame matici typum×n, pro niˇz plat´ı

∀i, j ∈N, i≤m, jn:aTij =aji.

Definice 1.7. Necht’ m, l, n∈N,A je matice typu n×l a B je matice typu l×m. Maticov´ym souˇcinem C = A·B naz´yv´ame takovou matici typu n×m, pro kterou plat´ı

∀i, j∈N, in, jm:Cij =

l

X

k=1

aik·bkj.

Definice 1.8. Necht’ m, n, l ∈ N a A je matice typu n×m. Diagon´alou matice Anazveme takov´y vektorD d´elkyl, pro kter´y ∃c∈Ztak, ˇze plat´ı

(∀i∈N, il:di =ai,i+c, c≥0∧c+l=m)∨

(∀i∈N, il:di=ai−c,i, c≤0∧c+l=n) . Hodnotucpak naz´yv´ameoffsetem diagon´aly.

Definice 1.9. Rekneme, ˇˇ ze matice A = (ai,j) je p´asovou matic´ı, pokud existuj´ı nez´aporn´e konstanty p, q(naz´yvan´e lev´y a prav´y polo-p´as) takov´e, ˇze ai,j 6= 0 pouze pokud ipji+q.[3]

Definice 1.10. Necht’m, n∈N,Aje matice typun×m.Hustotou matice Anazveme c∈R, pro nˇeˇz plat´ı

c= |{aij;i, j∈N∧injmaij 6= 0}|

m·n .

Neexistuje ofici´aln´ı definice ˇr´ıdk´e matice. Pro naˇse ´uˇcely vˇsak postaˇc´ı tato pragmatick´a definice od J. H. Wilkinsona:

Definice 1.11. Necht’m, n∈N, o maticiAtypun×mˇrekneme, ˇze jeˇr´ıdk´a, pokud m˚uˇzeme vyuˇz´ıt faktu, ˇze ˇc´ast jej´ıch hodnot je nulov´a.

Definice 1.12. Necht’ f, g jsou funkce na pˇrirozen´ych ˇc´ıslech. ˇRekneme, ˇzeg jeasymptotickou horn´ı mez´ı f, znaˇc´ımef =O(g) pr´avˇe tehdy, kdyˇz:

∃c, n0;c∈R+, n0 ∈N:∀n∈N, nn0 :f(n)c·g(n).

(21)

1.2. Form´aty ˇr´ıdk´ych matic Definice 1.13. Necht’ f, g jsou funkce na pˇrirozen´ych ˇc´ıslech a x ∈ N. V´y- poˇcetn´ı sloˇzitost´ı implementace algoritmu I nazveme takovou funkcif(x), pro niˇz plat´ıg =O(f) a g(x) je funkc´ı z´avislosti poˇctu proveden´ych operac´ı na velikosti vstupu.

Definice 1.14. Necht’f, gjsou funkce na pˇrirozen´ych ˇc´ıslech ax∈N.Pamˇe- t’ovou n´aroˇcnost´ı implementace algoritmu I nazveme takovou funkci f(x) pro niˇz plat´ıg=O(f) ag(x) je funkc´ı z´avislosti mnoˇzstv´ı vyuˇzit´e pamˇeti na velikosti vstupu.

Definice 1.15. ˇCasovou efektivitouE implementace algoritmu I (t´eˇz zkr´acenˇe efektivitou algoritmu, nebo v´ykonem algoritmu) na hardwaru H se vstupem V rozum´ıme mnoˇzstv´ı operac´ı typu T, kter´e pˇri spuˇstˇen´ıI na H pr˚umˇernˇe probˇehne za jednotku ˇcasu.

Pro ´uˇcely t´eto pr´ace (n´asoben´ı ˇr´ıdk´ych matic) pak budouT z 1.15 operace s re´aln´ymi ˇc´ısly (plovouc´ıˇr´adovou ˇc´arkou), konkr´etnˇe jejich sˇc´ıt´an´ı a n´asoben´ı.

Tuto hodnotu z´ısk´ame jako pod´ıl proveden´ych operac´ı a ˇcasu spotˇrebovan´eho na proveden´ı v´ypoˇctu. Pro tuto veliˇcinu budeme pouˇz´ıvat jednotku FLOPS (poˇcet operac´ı s ˇr´adovou ˇc´arkou za sekundu).

1.2 Form´ aty ˇ r´ıdk´ ych matic

V t´eto kapitole pop´ıˇsi nˇekter´e z´akladn´ı zp˚usoby ukl´ad´an´ı ˇr´ıdk´ych matic. Pro ilustraci ukl´ad´an´ı bude vyuˇzita jednoduch´a matice 4x4, kterou m˚uˇzete vidˇet v tabulce 1.1.

Za desetilet´ı v´yvoje vzniklo nespoˇcet r˚uzn´ych form´at˚u ukl´ad´an´ı matic.

C´ılem t´eto ˇc´asti tedy nen´ı popis vˇsech, ale nˇekolika vybran´ych. Form´aty byly vyb´ır´any dle jejich v´yznamnosti (rozˇs´ıˇren´ı) a relevantnosti k dalˇs´ımu obsahu t´eto pr´ace.

Z´akladn´ı ukl´ad´an´ı matice v hust´em form´atu je zˇrejm´e a nebude v t´eto pr´aci d´ale rozeb´ır´ano.

Tabulka 1.1: Vzorov´a hust´a matice

0 1.1 0 2.0

2.3 0 0 2.4

0 0 1.0 0

0 0 0 0.4

1.2.1 COO

Informace v t´eto kapitole vych´az´ı z [4].

(22)

1. Anal´yza

Nejintuitivnˇejˇs´ım zp˚usobem ukl´ad´an´ıˇr´ıdk´ych matic je pomoc´ı pozic a hod- not nenulov´ych prvk˚u (ˇr´adek, sloupec, hodnota). Tento form´at se obvykle oznaˇcuje jako COO (coordinate format - souˇradnicov´y form´at). Pro lepˇs´ı pr´aci s pamˇet´ı (cache) je vhodn´e ukl´adat tyto hodnoty pomoc´ı tˇr´ı pol´ı. Dle zp˚usobu vyuˇzit´ı se tak´e m˚uˇze hodit hodnoty seˇradit dle pozice.

Dˇr´ıve zm´ınˇen´a vzorov´a matice (1.1) se d´a t´ımto zp˚usobem zapsat tak, jak je vidˇet v tabulce 1.2.

Tabulka 1.2: Vzorov´a matice z tabulky 1.1 ve form´atu COO

ˇr´adek 0 0 1 1 2 3

sloupec 1 3 0 3 2 3

hodnota 1.1 2.0 2.3 2.4 1.0 0.4

Lze snadno nahl´ednout, ˇze pro maticin×ms nnz nenulov´ymi hodnotami k uspoˇren´ı m´ısta dojde, je-li

nnz·(valueSize+ 2·indexSize)< n·m·valueSize,

kde valueSize je poˇcet bit˚u k uloˇzen´ı hodnoty a indexSize je poˇcet bit˚u na uloˇzen´ı indexu. Pokud d´ale pˇredpokl´ad´amevalueSize=indexSize(napˇr´ıklad obˇe hodnoty 32, coˇz je standardn´ı velikost), dos´ahneme ´uspory, je-li nnzn·m < 13. 1.2.2 CRS

Definice v t´eto kapitole ˇc´asteˇcnˇe pˇrevzata z [5] a rozˇs´ıˇrena o doplˇnuj´ıc´ı infor- mace z [6] a [4].

Compressed row storage (CRS) lze oznaˇcit za inkrement´aln´ı vylepˇsen´ı COO. Hodnoty prvk˚u i sloupcov´e indexy jsou ukl´ad´any stejn´ym zp˚usobem (2 vektory), zde je vˇsak jiˇz pˇr´ımo vyˇzadov´ano jejich seˇrazen´ı (dle ˇr´adk˚u a sloupc˚u v tomto poˇrad´ı d˚uleˇzitosti). ˇR´adkov´y vektor pak obsahuje informaci o poˇctu prvk˚u v jednotliv´ych ˇr´adc´ıch. Pro urychlen´ı pˇr´ıstupu k prvk˚um (aby nemusel b´yt tento vektor proch´azen od zaˇc´atku pˇri ˇcten´ı prvku) je pak tato infor- mace uloˇzena ve formˇe prefixov´eho souˇctu poˇct˚u prvk˚u (tedy kolik´at´y prvek je prvn´ı v tomto ˇr´adku, poˇc´ıt´ano od nuly), tyto hodnoty budou d´ale naz´yv´any offset ˇr´adku. Je standardem (pro zjednoduˇsen´ı algoritm˚u) rozˇs´ıˇrit vektor off- set˚u ˇr´adk˚u o jeden prvek, kter´ym je poˇcet nenulov´ych prvk˚u v matici, tedy offset n+1. (neexistuj´ıc´ıho) ˇr´adku.

Dˇr´ıve zm´ınˇen´a vzorov´a matice (1.1) se d´a t´ımto zp˚usobem zapsat tak, jak je vidˇet v tabulce 1.3.

Pamˇet’ov´a n´aroˇcnost tohoto form´atu (se stejn´ym znaˇcen´ım a pˇredpoklady jako u COO) je 2nnz +n+ 1, coˇz je u matice bez pr´azdn´ych ˇr´adk˚u hod- nota menˇs´ı nebo rovna pamˇet’ov´e n´aroˇcnosti COO (pokud bereme v ´uvahu, ˇze i u COO je nezbytn´e uloˇzit poˇcet nenulov´ych prvk˚u). ˇC´ım hustˇs´ı je matice, t´ım vˇetˇs´ı v´yhody CRS pˇrin´aˇs´ı, k rovnosti dojde u matice s pˇresnˇe jedn´ım prvkem na ˇr´adek.

(23)

1.2. Form´aty ˇr´ıdk´ych matic Tabulka 1.3: Vzorov´a matice z tabulky 1.1 ve form´atu CRS

ofset ˇr´adku 0 2 4 5 6

sloupec 1 3 0 3 2 3

hodnota 1.1 2.0 2.3 2.4 1.0 0.4 1.2.3 CCS

Z´akladn´ı popis pˇrebr´an z [6].

Compressed column storage (CCS), tak´e naz´yvan´y Harwell-Boeing˚uv for- m´at ˇr´ıdk´ych matic, je analogick´y form´at k CRS, kde m´ısto po ˇr´adc´ıch je vektor proch´azen po sloupc´ıch a jsou zaznamen´av´any ˇr´adkov´e indexy hodnot. Tento form´at se d´a tak´e ch´apat jako CRS transponovan´e matice.

Jak lze z v´yˇse uveden´eho popisu pochopit, vlastnosti tohoto form´atu jsou stejn´e jako u CRS a tento form´at m˚uˇze b´yt vhodn´y pro n´asoben´ı s matic´ı v CRS form´atu.

Tabulka 1.4: Vzorov´a matice z tabulky 1.1 ve form´atu CCS ofset sloupce 0 1 2 3 6

ˇr´adek 1 0 2 0 1 3

hodnota 2.3 1.1 1.0 2.0 2.4 0.4

Dˇr´ıve zm´ınˇen´a vzorov´a matice (1.1) se d´a t´ımto zp˚usobem zapsat tak, jak je vidˇet v tabulce 1.4.

1.2.4 BCRS

Definice vyuˇz´ıv´a informace z [5] s rozˇs´ıˇren´ım o [6] a [4].

Block compressed row storage (BCRS, nˇekdy tak´e BSR), je nadstavba nad CRS, kter´a vyuˇz´ıv´a vlastnosti matic maj´ıc´ıch nenulov´e hodnoty shlukovan´e (prostorovˇe) bl´ızko u sebe.

P˚uvodn´ı matice je nejdˇr´ıve rozloˇzena na podmatice (bloky) ˇr´adovˇe menˇs´ı velikosti (napˇr´ıklad 2x2) a n´aslednˇe je tato matice blok˚u uloˇzena pomoc´ı CRS, pˇriˇcemˇz blok s pouze nulov´ymi hodnotami je br´an jako nulov´y element. Pˇri ukl´ad´an´ı hodnot je po ˇr´adc´ıch zaps´an cel´y blok, nikoliv jen jeho nenulov´e elementy.

Pro velikost bloku 2x2 n´am tedy pro naˇsi vzorovou matici (1.1) vznikne z´apis v tabulce 1.5.

Tabulka 1.5: Vzorov´a matice z tabulky 1.1 ve form´atu BCRS ofset ˇr´adku 0 2 3

sloupec 0 1 1

hodnota 0 1.1 2.3 0 0 2.0 0 2.4 1.0 0 0 0.4

(24)

1. Anal´yza

Adresovat je pak nutn´e dvouf´azovˇe (vyhledat adresu bloku a n´asledovnˇe pˇriˇc´ıst pozici v bloku), coˇz ovˇsem na modern´ım hardwaru nepˇrid´av´a prakticky ˇz´adnou v´ypoˇcetn´ı sloˇzitost. Pˇr´ınosy ukl´ad´an´ı matic v tomto form´atu jsou velmi z´avisl´e na struktuˇre matice a vhodnˇe zvolen´e velikosti bloku. ˇC´ım v´ıce je matice tvoˇren´a shluky hodnot, t´ım lepˇs´ıch v´ysledk˚u lze dos´ahnout.

Aˇckoliv tato metoda ukl´ad´an´ı m˚uˇze (kv˚uli ukl´ad´an´ı i nulov´ych element˚u) v´est k nav´yˇsen´ı pamˇet’ov´ych n´arok˚u oproti CRS, je v praxi ˇcasto vyuˇz´ıv´ana pro lepˇs´ı vyuˇzit´ı cache a obecnˇe lepˇs´ı v´ykonnost nˇekter´ych algoritm˚u.

1.2.5 DIA

Definice parafr´azov´ana z [1].

Diagonal format (DIA), tak´e zn´am´y jako compressed diagonal storage (CDS), je vhodn´y, pokud jsou nenulov´e hodnoty soustˇredˇeny do mal´eho mnoˇz- stv´ı diagon´al. Matice je uloˇzena za pomoci dvou pol´ı: pole hodnot a fset˚u diagon´al od hlavn´ı diagon´aly. Diagon´aly nad a pod hlavn´ı diagon´alou maj´ı negativn´ı respektivˇe pozitivn´ı offsety. Do pole hodnot jsou hodnoty ukl´ad´any postupnˇe od diagon´aly s nejniˇzˇs´ım offsetem k nejvyˇsˇs´ımu a v r´amci diagon´al dle sloupcov´eho indexu. Ukl´ad´any jsou jsou i nulov´e hodnoty a diagon´aly jsou doplnˇeny jako by zaˇc´ınaly na prvn´ım a konˇcily na posledn´ım ˇr´adku.

Uk´azku tohoto form´atu m˚uˇzete vidˇet na obr´azku 1.1. Neexistuj´ıc´ı prvky (*) mohou b´yt nahrazeny napˇr´ıklad 0.

Obr´azek 1.1: Diagon´aln´ı form´at, pˇrevzato z [1]

A=

1 7 0 0 0 2 8 0 5 0 3 9 0 6 0 4

DIA

hodnoty * * 5 6 1 2 3 4 7 8 9 *

offsety diagon´al -2 0 1

V´yhodou tohoto form´atu je vysok´a ´uspornost pro specifick´e typy matic a efektivn´ı paralelizace nˇekter´ych maticov´ych algoritm˚u (napˇr. n´asoben´ı ma- tice vektorem). Nev´yhodou je vysok´y n´ar˚ust n´aroˇcnosti (pamˇet’ov´e i v´ypoˇcet- n´ı) pro matice nemaj´ıc´ı vhodnou strukturu a s t´ım spojen´a omezen´a kategorie matic, na nˇeˇz lze form´at efektivnˇe aplikovat.

1.2.6 ELL

Definice parafr´azov´ana z [1].

(25)

1.2. Form´aty ˇr´ıdk´ych matic ELLPACK (ELL) je dalˇs´ı specializovan´y form´at. Podm´ınka tohoto form´atu je vˇsak volnˇejˇs´ı neˇz u DIA. M´ısto n´ızk´eho poˇctu diagon´al zde poˇzadujeme, aby byly prvky rozloˇzeny mezi ˇr´adky co nejrovnomˇernˇeji. Pˇresnˇeji chceme, aby ˇr´adek s nejv´ıce nenulov´ymi elementy byl co nejkratˇs´ı.

Matice o n ˇr´adc´ıch s nejv´ıce m nenulov´ymi prvky na ˇr´adek je uloˇzena pomoc´ı dvou hust´ych n×m matic. V prvn´ı z tˇechto matic jsou ukl´ad´any nenulov´e hodnoty v poˇrad´ı dle index˚u sloupc˚u, tedy jako kdyby z p˚uvodn´ı matice byly vypuˇstˇeny nuly a ostat´ı hodnoty

”sraˇzeny“ doleva. Do druh´e ma- tice jsou ukl´ad´any p˚uvodn´ı sloupcov´e indexy tˇechto prvk˚u. Obˇe tyto matice jsou zprava doplnˇeny nulami (aby byla zachov´ana stejn´a d´elka vˇsech ˇr´adk˚u).

Obr´azek 1.2: Vzorov´a matice z tabulky 1.1 ve form´atu ELL

hodnoty=

1.1 2.0 2.3 2.4 1.0 0 0.4 0

indexy=

1 3 0 3 2 0 3 0

Dˇr´ıve zm´ınˇen´a vzorov´a matice (1.1) se d´a v ELL zapsat tak, jak je vidˇet na obr´azku 1.2. I v tomto pˇr´ıpadˇe mohou b´yt samozˇrejmˇe pro vyˇsˇs´ı efektivitu matice rozeps´any do dvou 1D pol´ı.

ELL se d´a povaˇzovat za rozˇs´ıˇren´ı DIA. Zat´ımco u DIA je pozice prvku implicitn´ı (dle pozice diagon´aly), u ELL je explicitnˇe urˇcen´a, coˇz umoˇzˇnuje jej vyuˇz´ıt pro mnohem ˇsirˇs´ı ˇsk´alu matic.

Tento form´at je tak´e velmi vhodn´y pro vektorov´e architektury a paraleli- zaci a efektivn´ı pr´aci s cache.

1.2.7 Hybridn´ı form´at Tato ˇc´ast ˇcerp´a z [1].

Hybridn´ı form´at (HYB) je kombinace ELL a COO. C´ılem vyuˇzit´ı tohoto form´atu je zv´yˇsit pouˇzitelnost ELL na obecnˇejˇs´ı pˇr´ıpady a z´aroveˇn zachovat (ˇc´asteˇcnˇe) jeho efektivitu.

Prvn´ıchN prvk˚u kaˇzd´eho ˇr´adku se uloˇz´ı pomoc´ı ELL, zb´yvaj´ıc´ı prvky se uloˇz´ı pomoc´ı COO. C´ılem je vytvoˇrit jak´esi

”j´adro“ matice, kter´e bude uloˇzen´e v ELL a bude obsahovat pouze mal´e mnoˇzstv´ı nulov´ych hodnot.

Sloˇzitˇejˇs´ım probl´emem je urˇcen´ı vhodn´eho N. Tato hodnota z´avis´ı na struktuˇre matice a v´ykonnosti algoritm˚u nad COO a ELL. V´ıme-li tento pomˇer v´ykonnost´ı, m˚uˇzeme tuto hodnotu jiˇz pˇresnˇe urˇcit v´ypoˇctem z histogramu poˇct˚u nenulov´ych element˚u na ˇr´adek.

Pˇr´ıklad (vzorov´e) matice uloˇzen´e v hybridn´ım formm´atu (s N = 1) si m˚uˇzete prohl´ednout na obr´azku 1.3.

(26)

1. Anal´yza

Obr´azek 1.3: Vzorov´a matice z tabulky 1.1 v hybridn´ım form´atu

hodnotyELL=

1.1 2.3 1.0 0.4

indexyELL=

1 0 2 3

ˇr´adek 0 1

sloupec 3 3

hodnota 2.0 2.4 1.2.8 Dynamick´e form´aty

Tato ˇc´ast ˇcerp´a z [7] a [8].

Vˇetˇsina form´at˚u ukl´ad´an´ı ˇr´ıdk´ych matic je velmi neefektivn´ı pro zmˇeny matice. Zvl´aˇstˇe neefektivn´ı jsou operace pˇrid´av´an´ı a odeb´ır´an´ı hodnot, kter´e u vˇetˇsiny form´at˚u ˇcasto vynut´ı pˇrepis cel´e matice (coˇz je operace se sloˇzitost´ı O(nnz)). Dynamick´e form´aty vych´az´ı ze z´akladn´ıch form´at˚u pro ukl´ad´an´ı ˇr´ıdk´ych matic (nejˇcastˇeji CRS, BCRS a COO) a snaˇz´ı se odstranit tento probl´em pˇri zachov´an´ı n´ızk´e pamˇet’ov´e n´aroˇcnosti.

Dynamick´e form´aty mohou b´yt realizov´any pomoc´ı:

• Spojov´ych seznam˚u (jednosmˇern´ych, obousmˇern´ych i cyklick´ych) - tento zp˚usob umoˇzˇnuje velmi rychl´e pˇrid´av´an´ı a odeb´ır´an´ı prvk˚u a je snadno implementovateln´y (ˇcasto pouˇz´ıv´an pro COO).

• Stromov´ych struktur (napˇr´ıklad trie) - tento zp˚usob je vhodn´y pro ˇcast´e ˇcten´ı hodnot matice s n´ahodn´ym pˇr´ıstupem, je vˇsak v´yznamnˇe kom- plikovanˇejˇs´ı na implementaci a zajiˇstˇen´ı efektivity algoritm˚u pracuj´ıc´ıch s celou matic´ı

• Pole pol´ı (pole pointer˚u) - pole hodnot (index˚u) je rozdˇeleno na ˇc´asti (obvykle samostatn´e ˇr´adky/sloupce), kter´e jsou ukl´ad´any do samostatnˇe alokovan´ych pol´ı a m´ısto offset˚u ˇr´adk˚u je uchov´av´an cel´y pointer, coˇz umoˇzˇnuje minimalizovat dopad pˇrid´an´ı prvk˚u pouze na jeden ˇr´adek (O(nnzm)) m´ısto cel´e matice (ˇcasto pouˇz´ıv´an pro CRS, BCRS).

• Rozvolnˇen´ı form´at˚u - mezi uloˇzen´e hodnoty jsou pˇrid´any v´yplˇnov´e prvky (nulov´e), kter´e jsou pˇreps´any v pˇr´ıpadˇe pˇrid´an´ı nov´ych prvk˚u a v pˇr´ıpadˇe odeb´ır´an´ı prvk˚u jsou prvky nahrazeny v´yplˇnov´ymi hodnotami.

Pˇr´ıpadnˇe mohou b´yt vyuˇzity kombinace nˇekolika z tˇechto technik (napˇr´ı- klad d´ale zm´ınˇen´y Eigen vyuˇz´ıv´a 3. a 4.).

V´yhodami tˇechto form´at˚u jsou flexibilita pro vkl´ad´an´ı a odeb´ır´an´ı prvk˚u, pˇr´ıpadnˇe rychlejˇs´ı pˇr´ıstup k nim. Nev´yhodami pak jsou obt´ıˇznost zachov´an´ı

(27)

1.3. Algoritmy n´asoben´ı hust´ych matic pamˇet’ov´e lokality (vyuˇzit´ı cache), obt´ıˇznost vektorizace/paralelizace, vyˇsˇs´ı pamˇet’ov´a n´aroˇcnost a obecnˇe niˇzˇs´ı efektivita pro algoritmy pracuj´ıc´ı systema- ticky po ˇr´adc´ıch/sloupc´ıch (mezi kter´e patˇr´ı i n´asoben´ı matic).

1.3 Algoritmy n´ asoben´ı hust´ ych matic

1.3.1 Klasick´y algoritmus

Z´akladn´ı (a pro mnoh´e pˇr´ıpady i nejlepˇs´ı) postup vypl´yv´a ze vzorce pro n´asoben´ı matic a m˚uˇzete jej vidˇet v algoritmu 1.

Algoritmus 1 Klasick´e n´asoben´ı matic

1: procedure NaiveMultiply(A, B) . Vyn´asob A*B

2: Czeroes(A.height, B.width) .Vytvoˇr 2D pole na ukl´ad´an´ı v´ysledk˚u a nastav jej na nuly

3: fori←0 to A.heightdo

4: for j←0 to B.width do

5: fork←0 to A.width do

6: C[i][j]C[i][j] +A[i][k]B[k][j]

7: return C . Matice s v´ysledky

Pro zv´yˇsen´ı efektivity je samozˇrejmˇe moˇzn´e vhodnˇe zmˇenit poˇrad´ı proch´a- zen´ı a pˇr´ıpadnˇe vyuˇzit transpozice.

V´yhodami tohoto algoritmu jsou jednoduchost jeho implementace, snad- nost paralelizace, vyuˇzitelnost pro specializovan´e form´aty ukl´ad´an´ı (ˇr´ıdk´e ma- tice) a vysok´a efektivita pro relativnˇe mal´e matice.

Jeho nev´yhodou je pak jeho asymptotick´a sloˇzitost, kter´a je Θ(n3), a z toho plynouc´ı pomalost (v˚uˇci d´ale zm´ınˇen´ym algoritm˚um) pˇri aplikaci na velk´e matice (ˇr´adovˇe 1000×1000 prvk˚u).

1.3.2 Strassen˚uv algoritmus

Strassen˚uv algoritmus [9] je zaloˇzen na principu rozdˇel a panuj (rekurzivn´ı pˇr´ıstup). Asymptotick´a sloˇzitost tohoto algoritmu je O(nlog27) ≈ O(n2.808).

D˚ukaz spr´avnosti algoritmu je po dosazen´ı do v´ysledn´eho vzorce zˇrejm´y, a pro- to nebude rozv´adˇen.

Chceme-li vypoˇc´ıtat maticov´y souˇcinC =A·B, rozdˇel´ıme nejdˇr´ıve kaˇzdou matici na 4 stejnˇe velk´e podmatice

C=

"

A11 A12

A21 A22

#

·

"

B11 B12

B21 B22

# .

(28)

1. Anal´yza

N´aslednˇe je nutn´e vypoˇc´ıtat hodnoty 7 meziv´ysledk˚u M1=(A11+A22)·(B11+B22), M2=(A21+A22B11,

M3=A11·(B12B22), M4=A22·(B21B11), M5=(A11+A12B22,

M6=(A21A11)·(B11+B12), M7=(A12A22)·(B21+B22).

Nakonec se za pouˇzit´ı tˇechto pomocn´ych matic vypoˇc´ıt´a v´ysledn´a matice C=

"

M1+M4M5+M7 M3+M5 M2+M4 M1M2+M3+M6

# .

Celkovˇe je tedy nezbytn´e pro jednu ´uroveˇn Strassenova algoritmu prov´est 18 souˇct˚u (Θ(n2)) a 7 n´asoben´ı (Θ(n3)). Pro dostateˇcnˇe velk´e matice je jedna

´

uroveˇn Strassenova algoritmu oproti klasick´e variantˇe rekurzivn´ıho n´asoben´ı matic, kter´a vyuˇz´ıv´a 4 souˇcty a 8 n´asoben´ı, tedy aˇz o 12.5 % efektivnˇejˇs´ı.

Nev´yhodou tohoto algoritmu je n´ızk´a efektivita na menˇs´ıch matic´ıch (kv˚uli vˇetˇs´ımu poˇctu sˇc´ıt´an´ı a celkov´e vˇetˇs´ı komplexnosti) a zv´yˇsen´a pamˇet’ov´a n´aroˇc- nost. I bez pˇrepisov´an´ı vstupn´ıch matic lze vˇsak algoritmus prov´est s pamˇe- t’ovou sloˇzitost´ıO(2n3 ) [10].

1.3.3 Winogradova varianta Strassenova algoritmu

Winogradova varianta Strassenova algoritmu [11] je algoritmus zaloˇzen´y na stejn´em principu jako p˚uvodn´ı Strassen˚uv algoritmus, kter´y vˇsak m´ısto 18 vyuˇz´ıv´a pouze 15 souˇct˚u. Aˇckoliv toto zlepˇsen´ı nem´a ˇz´adn´y vliv na asympto- tickou sloˇzitost, v praktick´e implementaci se projev´ı drobn´ym zlepˇsen´ı efekti- vity algortimu.

Cel´e sch´ema algoritmu je (znaˇcen´ıA, B, C pˇrevzato z vysvˇetlen´ı Strasse- nova algoritmu):

S1 =A21+A22, M1 =S2·S6, V1=M1+M2, S2 =S1A11, M2 =A11·B11, V2=V1+M4, S3 =A11A21, M3 =A12·B21, C11=M2+M3, S4 =A12S2, M4 =S3·S7, C12=V1+M5+M6, S5 =B12B11, M5 =S1·S5, C21=V2M7, S6 =B22S5, M6 =S4·B22, C22=V2+M5, S7 =B22B12, M7 =A22·S8,

S8 =S6B21.

Napˇr´ıklad vyuˇzit´ım 4 iterac´ı tohoto algoritmu (pro matice 16384×16384) lze prakticky dos´ahnout sn´ıˇzen´ı poˇctu aritmetick´ych operac´ı o 41.3 % oproti klasick´emu algoritmu [10].

(29)

1.4. Reˇserˇse existuj´ıc´ıch knihoven Pamˇet’ov´a n´aroˇcnost z˚ust´av´a stejn´a jako u p˚uvodn´ıho Strassenova algo- ritmu[11].

1.3.4 Dalˇs´ı algoritmy

V souˇcasn´e dobˇe existuje jiˇz ˇrada algoritm˚u s niˇzˇs´ı asymptotickou sloˇzitost´ı neˇz Strassen˚uv algoritmus (O(nw=2.808)). V roce 1978 vznikl Pan˚uv algorit- mus (w = 2.796), o rok pozdˇeji algoritmus od Bimi a spol. (w = 2.78).

N´asledovala ˇrada dalˇs´ıch algoritm˚u, kter´e pˇrekon´avaly do t´e doby nejlepˇs´ı dosaˇzen´e v´ysledky. Z dalˇs´ıch zn´am´ych algoritm˚u stoj´ı za zm´ınku napˇr´ıklad Coppersmith-Winograd˚uv algoritmus (w = 2.376) z roku 1989 (pozdˇeji sn´ı- ˇ

zeno naw= 2.372), kter´y je dodnes nejrychlejˇs´ım zn´am´ym algoritmem.[12]

Aˇckoliv tyto algoritmy jsou asymptoticky rychlejˇs´ı, matice, pro nˇeˇz jsou tyto algoritmy oproti klasick´emu (a tak´e Strassenovu) algoritmu v´yhodn´e, jsou natolik velk´e, ˇze nejsou zpracovateln´e na souˇcasn´em hardwaru. Zvl´aˇstˇe pak mnoh´e z novˇejˇs´ıch algoritm˚u jsou pouze teoretick´eho r´azu a v praxi (napˇr´ıklad kv˚uli nepˇresnostem pˇri v´ypoˇctech u ˇc´ısel s plovouc´ı desetinnou ˇc´arkou) ne- pouˇziteln´e.

1.3.5 Vyuˇzit´ı subkubick´ych algoritm˚u pro ˇr´ıdk´e matice

Pro implementaci Strassenova algoritmu (a jeho variant), coˇz je jedin´y v sou- ˇ

casnosti pouˇz´ıvan´y subkubick´y algoritmus, je nutn´e dok´azat matici horizon- t´alnˇe a vertik´alnˇe rozdˇelit. Tato operace je u hust´e matice jednoduch´a (nemus´ı probˇehnout ˇz´adn´e ˇcten´ı, staˇc´ı upravit zp˚usob indexov´an´ı do matice a meze), na druhou stranu u ˇr´ıdk´ych matic se jedn´a o operaci velmi sloˇzitou, s ˇcasovou n´aroˇcnost´ıO(nnz), tedy pˇreˇcten´ı cel´e matice a jej´ı znovuzaps´an´ı do nˇekolika nov´ych, coˇz znaˇcnˇe zmenˇsuje pˇr´ınos Strassenova algoritmu i u sekvenˇcn´ıch implementac´ı.

Efektivita n´asoben´ı matic na grafick´e kartˇe (masivnˇe paralelizovan´a) je ob- vykle mnohem v´ıce omezena vyuˇzit´ım pamˇeti, neˇz v´ykonem v´ypoˇcetn´ıch jed- notek. Pro masivn´ı paralelizaci je tedy tento algoritmus, kter´y znaˇcnˇe zvyˇsuje poˇcet pamˇet’ov´ych operac´ı a mnoˇzstv´ı vyuˇzit´e pamˇeti, naneˇstˇest´ı jeˇstˇe m´enˇe vhodn´y, neˇz pro sekvenˇcn´ı verzi a proto nebude jeho praktick´a implementace uvaˇzov´ana.

1.4 Reˇ serˇ se existuj´ıc´ıch knihoven

1.4.1 NIST Sparse BLAS

Informace v t´eto sekci vych´azej´ı z uˇzivatelsk´eho manu´alu [13] a zkoum´an´ı k´od˚u dostupn´ych z [14].

(30)

1. Anal´yza

Touto knihovnou se budu nejv´ıce zab´yvat nejen kv˚uli jej´ı rozˇs´ıˇrenosti, ale z´aroveˇn protoˇze jej´ı k´od je open-source, a lze ji proto snadno a d˚ukladnˇe analyzovat.

1.4.1.1 Interface

Celou funkcionalitu t´eto knihovny lze rozdˇelit do 4 kategori´ı:

• Level 1 - operace typuvektor×vektor

• Level 2 - operace typumatice×vektor

• Level 3 - operace typumatice×matice

• Ostatn´ı - inicializace, destrukce, getry, setry

Z v´yˇse uveden´ych kategori´ı je pro tuto pr´aci nejv´yznamnˇejˇs´ı Level 3, protoˇze pr´avˇe ten obsahuje n´asoben´ı matic. D´ale stoj´ı za zm´ınku tak´e ˇzivotn´ı cyklus matic.

Pr´ace s ˇr´ıdk´ymi maticemi sest´av´a z tˇechto tˇr´ı krok˚u:

• Vytvoˇren´ı matice a z´ısk´an´ı handleru k n´ı (int)

• Pouˇzit´ı handleru jako argumentu pˇri v´ypoˇctech s matic´ı

• Kdyˇz matice jiˇz nen´ı potˇrebn´a, je explicitnˇe (uˇzivatelem) zavol´ana ˇcistic´ı funkce, kter´a uvoln´ı vyuˇz´ıvan´e prostˇredky

Pro n´as nejv´yznamnˇejˇs´ı funkce n´asoben´ı matic m´a pak z´akladn´ı tvary:

Cα·A·B+C, Cα·AT ·B+C, a pro matice komplexn´ıch ˇc´ısel

Cα·AH ·B+C,

kde A je ˇr´ıdk´a matice, B, C jsou hust´e matice a αje re´aln´e ˇc´ıslo (float). Starˇs´ı verze podporovaly nav´ıc koeficientβ pro sˇc´ıt´an´ı sC. Tato funkce pak existuje ve 4 variant´ach pro r˚uzn´e typy prvk˚u matic (jednoduch´a, dvojit´a pˇresnost atd.).

N´asoben´ı dvou ˇr´ıdk´ych matic knihovna neumoˇzˇnuje. Pˇri vol´an´ı funkc´ı jsou ˇr´ıdk´e matice reprezentov´any handlerem, hust´e matice 1D polem (pointer), zp˚usobem, jak jsou uloˇzeny (po ˇr´adc´ıch, sloupc´ıch - enum), a velikost´ı jejich hlavn´ı dimenze (int). V´ybˇer varianty s transpozic´ı, ˇci konjungovanou transpo- zic´ı je reprezentov´an enumem.

(31)

1.4. Reˇserˇse existuj´ıc´ıch knihoven Tato knihovna vnitˇrnˇe (nedeklarov´ano v hlaviˇckov´ych souborech) repre- zentuje matice pomoc´ı form´atu BCRS, konkr´etn´ı parametry se nedaj´ı z vnˇej- ˇsku ovlivnit. D´ale tak´e umoˇzˇnuje specializovan´e algoritmy a ukl´ad´an´ı pro ma- tice s v´yznaˇcn´ymi vlastnostmi (symetrick´e, triangul´arn´ı).

Knihovna NIST Sparse BLAS vznikala p˚uvodnˇe v jazyce Fortran, coˇz je poznat i ze zp˚usobu pr´ace s maticemi a z interface funkc´ı. Jak bylo vˇsak jiˇz zm´ınˇeno v [15], tento inferface m´a pro vyuˇzit´ı v C++ mnoho probl´em˚u a pro

´

uˇcely t´eto pr´ace by jej bylo vhodn´e vylepˇsit. Zejm´ena se jedn´a o ˇzivotn´ı cyklus matic. Zde by bylo vhodn´e vyuˇz´ıt moˇznost´ı C++ pr´ace s objekty a drˇzet se obvyklejˇs´ıch standard˚u pro jejich vytv´aˇren´ı a niˇcen´ı (konstruktory, destruk- tory). D´ale pak veˇsker´e parametry t´ykaj´ıc´ı se jedn´e matice (poˇrad´ı prvk˚u, d´elka dimenze, data) by mˇely b´yt sjednoceny do jednoho objektu. Bude-li pod- porov´ano v´ıce typ˚u prvk˚u, mˇely by nav´ıc b´yt funkce pˇret´ıˇzeny (nebo vyuˇzity ˇsablony) m´ısto nˇekolika r˚uzn´ych jmen funkc´ı.

1.4.1.2 Algoritmy

Algoritmy t´eto knihovny vych´az´ı z pˇr´ım´e implementace klasick´eho algoritmu n´asoben´ı matic, samozˇrejmˇe s odliˇsn´ym zp˚usobem adresov´an´ı (ˇr´ıdk´e matice obvykle nemaj´ı pˇr´ım´y pˇr´ıstup k prvk˚um). Ve zdrojov´ych k´odech jsem nenalezl ˇ

z´adn´e specifick´e triky a techniky slouˇz´ıc´ı k zlepˇsen´ı efektivity kromˇe rozdˇelen´ı funkc´ı dle parametr˚u na mnoho jednoduˇzˇs´ıch funkc´ı, m´ısto vyuˇzit´ı vˇetven´ı uvnitˇr j´adra funkc´ı.

1.4.2 Eigen

Informace o t´eto knihovnˇe poch´az´ı z dokumentace dostupn´e na [16] a studia k´odu dostupn´eho z [17].

Eigen je open-source knihovna napsan´a v C++, zab´yvaj´ıc´ı se line´arn´ı al- gebrou. Pro n´as v´yznamnˇe se vˇenuje mimo jin´e i ˇr´ıdk´ym matic´ım a operac´ım s nimi.

1.4.2.1 Interface

Interface t´eto knihovny je mnohem bliˇzˇs´ı objektov´emu programov´an´ı (a mo- dern´ım standard˚um C++). S maticemi se tedy pracuje pro objekty obvykl´ym zp˚usobem (konstruktory, destruktory, metody).

Z operac´ı s ˇr´ıdk´ymi maticemi umoˇzˇnuje knihovna (mimo jin´e) sˇc´ıt´an´ı, n´asoben´ı skal´arem, transpozici (a z´ısk´an´ı hermiti´anu matice pro komplexn´ı ˇ

c´ısla, vice o hermitianu napˇr´ıklad [18]), n´asoben´ı dvou matic a operace apli- kovan´e po prvku (tedy v´ysledek z´ısk´an jako Ci,j =op(Ai,j, Bi,j)).

V´yznamnou zmˇenou oproti NIST Sparse BLAS je, ˇze v´ysledkem operace se dvˇema ˇr´ıdk´ymi maticemi je znovu ˇr´ıdk´a matice, nikoliv matice hust´a.

Pro ukl´ad´an´ıˇr´ıdk´ych matic je vyuˇz´ıv´an upraven´y form´at CRS/CCS. ´Upra- va spoˇc´ıv´a v ponech´av´an´ı voln´ych m´ıst pro pˇrid´av´an´ı prvk˚u. Nav´ıc v nˇekter´ych

(32)

1. Anal´yza

m´ıstech vyuˇz´ıv´a nekomprimovan´eho form´atu, ve kter´em jsou jednotliv´e ˇr´adky (pˇr´ıpadnˇe sloupce) ukl´ad´any do samostatn´ych pol´ı (ve form´atu odpov´ıdaj´ıc´ım jednomu ˇr´adku/sloupci CRS/CCS) a na nˇe jsou uloˇzen´e odkazy (coˇz umoˇzˇnuje jednoduˇzˇs´ı a rychlejˇs´ı pˇrid´av´an´ı prvk˚u do matice).

1.4.2.2 Algoritmy

I zde je vyuˇzit z´akladn´ı algoritmus n´asoben´ı matic. V´ysledn´a matice je vytv´a- ˇrena sekvenˇcnˇe po sloupc´ıch. Cel´y algoritmus je v´yznamnˇe komplikov´an t´ım, ˇze v´ysledn´a matice je tak´e v ˇr´ık´em form´atu. Napˇr´ıklad je nutn´e odhadovat mnoˇzstv´ı nenulov´ych prvk˚u ve v´ysledn´em sloupci (prov´adˇeno velmi jedno- duch´ym odhadem na z´akladˇe pˇredpokladu, ˇze max 1 index nenulov´eho prvku se liˇs´ı). Algoritmus vyˇzaduje mnoho dynamick´ych alokac´ı (a realokac´ı) a velmi sloˇzitˇe paralelizovateln´y.

1.4.3 cuSPARSE

Informace v t´eto sekci vych´az´ı z dokumentace dostupn´e na [19].

Knihovna cuSPARSE obsahuje sadu low-level funkc´ı pro pr´aci s ˇr´ıdk´ymi maticemi na GPU a je urˇcen´a pro jazyky C a C++.

Konkr´etn´ı algoritmy pouˇz´ıvan´e v cuSPARSE nebudou rozeb´ır´any, protoˇze k´ody knihovny nejsou veˇrejnˇe k dispozici. Tato knihovna se vˇsak (kv˚uli po- dobn´e problematice, kterou se zab´yv´a) d´a vyuˇz´ıt pro porovn´an´ı efektivity s k´ody implementovan´ymi bˇehem t´eto diplomov´e pr´ace.

1.4.3.1 Interface

Interface t´eto knihovny je znaˇcnˇe podobn´y s NIST Sparse BLAS. V cuSPARSE se nach´az´ı m´ırnˇe obecnˇejˇs´ı funkce typu

Cαop(A)·op(B) +β·C,

(cusparse<t>csrmm2) kde op() znaˇc´ı identitu, transpozici, nebo hermiti´an.

Kromˇe matice A (a op(A)), kter´a je v ˇr´ıdk´em form´atu, jsou vˇsechny ostatn´ı matice hust´e aα, β jsou re´aln´a ˇc´ısla.

Tato knihovna ovˇsem nav´ıc obsahuje i funkci n´asoben´ı dvou ˇr´ıdk´ych matic.

Konkr´etnˇe se jedn´a o funkce typu

C ← ·op(A)·op(B) (cusparse<t>csrgemm) a

Cα·op(A)·op(B) +β·D

(cusparse<t>csrgemm2). V tˇechto dvou pˇr´ıpadech jsou vˇsechny matice v CRS form´atu. Tyto funkce vˇsak nejsou zcela implementov´any, takˇzeop() m˚uˇze re- prezentovat pouze identitu (tedy bez transpozic) a nejsou podporov´ana ˇz´adn´a

(33)

1.4. Reˇserˇse existuj´ıc´ıch knihoven pokroˇcilejˇs´ı ukl´ad´an´ı matic, kter´e knihovna v jin´ych ˇc´astech umoˇzˇnuje (sy- metrick´e, troj´uheln´ıkov´e aj.). Pˇred vol´an´ım tˇechto funkc´ı je nav´ıc nutn´e volat dalˇs´ı funkce pro v´ypoˇcet spr´avn´e alokace maticeC a v druh´em pˇr´ıpadˇe i alo- kaci bufferu (jehoˇz ´uˇcel nen´ı pˇresnˇe specifikov´an). Tyto dvˇe funkce budou d´ale pouˇzity k porovn´an´ı efektivity s k´ody vznikl´ymi jako souˇc´ast t´eto pr´ace.

Matice jsou pˇred´av´any dle zp˚usobu obvykl´eho v jazyce C, tedy po jednot- liv´ych pol´ıch a promˇenn´ych. Toto vˇsak vede k znaˇcnˇe velk´emu mnoˇzstv´ı argu- ment˚u (napˇr´ıklad 27 pro csrgemm2), coˇz zvl´aˇstˇe v kombinaci s dˇr´ıve zm´ınˇen´ym v´ıcef´azov´ym vol´an´ım funkc´ı nen´ı pˇr´ıliˇs uˇzivatelsky pˇr´ıvˇetiv´e.

(34)
(35)

Kapitola 2

avrh

V prvn´ı f´azi n´avrhu je nezbytn´e urˇcit, s jak´ymi form´aty matic bude imple- mentace pracovat a jak´y interface budou m´ıt metody pro pr´aci s maticemi.

D´ale je nutn´e navrhnout z´akladn´ı sekvenˇcn´ı algoritmy pro pr´aci s jednotliv´ymi form´aty a urˇcit, jak tyto algoritmy paralelizovat. Nakonec je tak´e nezbytn´e vy- tvoˇrit z´akladn´ı n´avrh tˇr´ıd.

2.1 Interface

Z´aklad interface funkce n´asoben´ı (a sˇc´ıt´an´ı) jsem se rozhodl ˇcerpat z knihovny NIST Sparse BLASS, ovˇsem za vyuˇzit´ı nˇekter´ych prvk˚u pouˇz´ıvan´ych kni- hovnou Eigen (a obecnˇe objektov´ym programov´an´ım). Nav´ıc jsem se vzhle- dem k charakteru prototypu a mal´ym pˇr´ınos˚um opaku rozhodl podporovat pouze ukl´ad´an´ı hodnot ve formˇe ˇc´ısel s plovouc´ı ˇr´adovou ˇc´arkou s jednodu- chou pˇresnost´ı (tedy v C++ float).

Bude tedy prov´adˇena operace:

Cα·A·B+C, Cα·AT ·B+C.

Argumenty operace budou konstantn´ı pointery na maticeA,B, hodnotaα (float) a pointer na v´ystupn´ı hustou maticiC, jehoˇz nulovost znamen´a, ˇze m´a b´yt alokov´ana nov´a matice. D´ale bude vol´an´ı funkce obsahovat dvˇe v´ybˇerov´e hodnoty (enum), kter´e urˇcuj´ı proveden´ı transpozice maticeA pˇred v´ypoˇctem a zda m´a b´yt v´ypoˇcet proveden paralelnˇe.

2.2 Form´ aty matic

Z interface operace n´asoben´ı je zˇrejm´e, ˇze mus´ı b´yt pˇr´ıtomn´y form´at pro hust´e matice.

Z form´at˚u pro ukl´ad´an´ı ˇr´ıdk´ych matic byly d´ale vybr´any:

(36)

2. N´avrh

• CRS - nejˇcastˇeji pouˇz´ıvan´y, z´akladn´ı form´at ukl´ad´an´ı ˇr´ıdk´yc matic

• BCRS - zaloˇzen´y na CRS, vhodn´y pro blokov´e matice

• DIA - prakticky nejefektivnˇejˇs´ı form´at, m´a vˇsak velmi omezen´e pouˇzit´ı (pro matice s mal´ym mnoˇzstv´ım diagonn´al)

• ELL - nadstavba nad DIA (a CRS), obecnˇe povaˇzov´an za efektivn´ı a znaˇcnˇe obecn´y (pro matice s rovnomˇernˇe rozloˇzen´ymi prvky na ˇr´adky) Form´at CCS nebyl specificky pˇrid´an, protoˇze je prakticky shodn´y s CRS transponovan´e matice. Form´at COO je pro samotn´e n´asoben´ı nevhodn´y a pa- mˇet’ovˇe n´aroˇcn´y, proto byl tak´e z vnitˇrn´ı reprezentace vyˇrazen, aˇckoliv pˇrevody mezi n´ım a ostatn´ımi form´aty se uk´azaly b´yt nezbytn´e pro z´ısk´an´ı testovac´ıch matic (viz sekci testov´an´ı). Dynamick´e form´aty byly vynech´any z d˚uvodu n´ızk´e efektivity algoritm˚u n´asoben´ı (tedy opaku c´ıle t´eto pr´ace) a toho, ˇze tato pr´ace nec´ıl´ı na snadn´e dynamick´e mˇenˇen´ı matic. Hybridn´ı form´at nebyl pˇrid´an kv˚uli jeho sloˇzitosti a jeho pˇrid´an´ım by byl v´yznamnˇe pˇrekroˇcen zam´yˇslen´y rozsah pr´ace.

2.3 Sekvenˇ cn´ı algoritmy

C´ılem je implementovat (a paralelizovat) funkci α·A(T)·B +C, kde A, B jsou dvˇe ˇr´ıdk´e matice uloˇzen´e ve stejn´em form´atu aCje hust´a matice, slouˇz´ıc´ı z´aroveˇn k uloˇzen´ı v´ysledku. K implementaci t´eto funkce (a ovˇeˇren´ı funkˇcnosti) je zapotˇreb´ı 4 d´ılˇc´ıch funkc´ı. Tyto funkce jsou:

• Hust´a matice→ˇr´ıdk´a matice (vytvoˇren´ı)

• Transpozice

• N´asoben´ı (s akumulac´ı do v´ysledkov´e matice)

• R´ıdk´ˇ a matice→ hust´a matice (pro kontroln´ı v´ysledky a testov´an´ı) Z nich posledn´ı je obvykle velmi jednoduch´a (a zˇrejm´a), proto zde nebude specificky popisov´ana. Jedin´e n´asoben´ı pak m´a (asymptoticky) vyˇsˇs´ı v´ypoˇcetn´ı sloˇzitost neˇz sloˇzitost pamˇet’ovou, a proto je jej vhodn´e paralelizovat. Vˇsechny ostatn´ı funkce maj´ı stejnou pamˇet’ovou a v´ypoˇcetn´ı sloˇzitost (O(nnz)), a proto jejich paralelizace pomoc´ı GPU (kv˚uli pˇrenos˚um dat) nepˇrinese ˇz´adn´e zrych- len´ı.

Abych pˇredeˇsel exponenci´aln´ımu n´ar˚ustu poˇctu nutn´ych impelementac´ı n´asoben´ı, rozhodl jsem se implementovat pouze n´asoben´ı matic ve stejn´em form´atu (u BCRS nav´ıc se stejnou velikost´ı bloku).

(37)

2.3. Sekvenˇcn´ı algoritmy 2.3.1 CRS

2.3.1.1 Datov´a struktura

Z definice form´atu vypl´yv´a, ˇze pro uloˇzen´ı matice typun×msnnznenulov´ymi elementy budou potˇreba nejm´enˇe 3 pole. Pole offset˚u (int) o d´elce n+ 1 (na pozici nje uloˇzenonnz), pole index˚u sloupc˚u (int) o d´elcennz a pole hodnot (float) tak´e o d´elcennz. Aby bylo moˇzn´e reprodukovat p˚uvodn´ı matici, je d´ale nezbytn´e m´ıt uloˇzenou nejen hodnotu n, ale im.

2.3.1.2 Pˇrevod z hust´e matice

Jak m˚uˇzete vidˇet na algoritmu 2, pˇrevod je pomˇernˇe intuitivn´ı (algoritmus pˇresto pˇreps´an, protoˇze se bude hodit pˇri popisu dalˇs´ıch form´at˚u). Za zm´ınku stoj´ı pˇredevˇs´ım ˇr´adek 4. Tuto operaci lze odebrat a vyuˇz´ıt hodnoty count z hlavn´ıho for cyklu. Probl´em tohoto pˇr´ıstupu vˇsak je, ˇze bychom museli vyuˇz´ıvat dynamick´e alokace pol´ı (takt´eˇz O(n· m), ovˇsem pravdˇepodobnˇe s vyˇsˇs´ımi konstantami), takˇze v´ysledn´y k´od by byl pomalejˇs´ı a z´aroveˇn sloˇzi- tˇejˇs´ı.

Algoritmus 2 Hust´a matice →CRS

1: procedure CRS(M :DenseM atrix)

2: C:CRS .Tvoˇren´a matice

3: C.heightM.height;C.widthM.width

4: nnzcount nnz(M) . O(n·m)

5: C.offsetszeroes(C.height)

6: C.indexes, C.valueszeroes(nnz)

7: count←0

8: fori←0 to M.heightdo

9: C.offsets[i]←count

10: for j←0 to M.width do

11: if notEmpty(M[i][j])then

12: C.values[count]M[i][j]

13: C.indexes[count+ +]←j

14: C.offsets[M.height]←nnz

15: return C

2.3.1.3 Transpozice

Je zˇrejmˇe neˇz´adouc´ı prov´adˇet tuto transpozici pˇres hustou matici (O(n·m)).

Jako druh´a moˇznost se jev´ı pˇreˇrazen´ı prvk˚u. Obvykl´e ˇrad´ıc´ı algoritmy maj´ı sloˇzitotO(nnz∗lognnz), coˇz je v´yznamnˇe lepˇs´ı, avˇsak ne ide´aln´ı. M˚uˇzeme se vˇsak inspirovat z counting sortu. Je podstatn´e, ˇze hodnoty jsou jiˇz seˇrazen´e dle ˇr´adk˚u. Staˇc´ı tedy, abychom je counting sortem seˇradili podle sloupc˚u, a d´ıky

(38)

2. N´avrh

stabilnosti tohoto algoritmu z´ısk´ame poˇzadovan´e seˇrazen´ı, a tedy i transpono- vanou matici. Pole offset˚u z´ısk´ame pˇr´ımo pˇri prov´adˇen´ı counting sortu (pre- fixov´y souˇcet poˇct˚u jednotliv´ych hodnot), jen jej oproti standardn´ı variantˇe mus´ıme posunout o jedno pole doprava, tedy tak, aby

∀x∈N∪ {0}, x≤m:offsetx =

x−1

X

k=0

nnzk,

kdennzk je poˇcet nenulov´ych prvk˚u ve sloupci k.

Sloˇzitost cel´e transpozice je (ze sloˇzitosti counting sortu)O(nnz+m) a za pˇredpokladu, ˇze nnzm (tedy, ˇze v kaˇzd´em sloupci je pr˚umˇernˇe alespoˇn jeden prvek) je tato sloˇzitostO(nnz), coˇz je optim´aln´ı sloˇzitost, protoˇze celou matici mus´ıme pˇrepsat.

2.3.1.4 N´asoben´ı

Algoritmus n´asoben´ı vych´az´ı z klasick´eho postupu n´asoben´ı (viz algoritmus 1, d´ale indexy znaˇceny dle tohoto algoritmu). D˚uleˇzit´e vˇsak je, v jak´em poˇrad´ı budeme matice proch´azet. Form´at CRS je vhodn´y pouze k proch´azen´ı po ˇr´adc´ıch. M˚uˇzeme vˇsak vyuˇz´ıt vlastnosti, ˇze transpozic´ı uloˇzen´e matice z´ısk´ame stejnou matici uloˇzenou ve form´atu CCS (zˇrejm´e z definice CRS/CCS), kter´y naopak dobˇre pracuje po sloupc´ıch. D´ale budeme zp˚usob proch´azen´ı n´asoben´ı maticA·B znaˇcit dle uˇzit´eho form´atu, tedy napˇr´ıklad CRS·CCS.

Z definice maticov´eho souˇctu jsou zˇrejm´e tyto dva fakty:

• Mezi sebou n´asob´ıme vˇsechny prvkyai,k s prvkybk,j, tedy k-t´y sloupec z maticeA s k-t´ym ˇr´adkem z maticeB

• Hodnotu prvku cij matice C z´ısk´ame jako skal´arn´ı souˇcin i-t´eho ˇr´adku maticeA s j-t´ym sloupcem maticeB

Tyto dva pohledy n´as vedou na dva logick´e zp˚usoby n´asoben´ı, coˇz jsou CCS·CRS (d´ale tak´e CR) a CRS·CCS (d´ale tak´e RC). V´yhodou prvn´ıho je, ˇze nemus´ıme porovn´avat hodnoty index˚u a jedin´a prov´adˇen´a operace je tedy samotn´e n´asoben´ı. Tento zp˚usob se tud´ıˇz zˇrejmˇe hod´ı pro s´eriovou verzi a vyˇzaduje nejm´enˇe proveden´ych operac´ı. Druh´y zp˚usob vyˇzaduje porovn´av´an´ı index˚u a je v´yznamnˇe n´aroˇcnˇejˇs´ı na v´ypoˇcetn´ı prostˇredky, na druhou stranu vˇsak umoˇzˇnuje samostatn´y v´ypoˇcet hodnot jednotliv´ych prvk˚u matice. Tato vlastnost umoˇzˇnuje CRS ·CCS masivnˇe paralelizovat, aniˇz bychom museli vyuˇz´ıt n´akladnou synchronizaci z´apis˚u do v´ysledn´e matice (kter´a by pohltila t´emˇeˇr vˇsechny v´yhody paralelizace), nebo z´apis do v´ıce pomocn´ych matic a n´aslednou redukci.

(39)

2.3. Sekvenˇcn´ı algoritmy 2.3.2 BCRS

2.3.2.1 Datov´a struktura

Datov´a struktura BCRS je totoˇzn´a s CRS. Rozd´ılem je, ˇze jsou zde indexy blo- kov´ych sloupc˚u (nikoliv samotn´ych prvk˚u) a bude m´ıt tedy pouze d´elkunnzb, coˇz je poˇcet nenulov´ych blok˚u. Nav´ıc je tˇreba uloˇzit velikost bloku. Pro jedno- duchost (a mal´e v´yhody opaku) jsem se rozhodl podporovat pouze ˇctvercov´e bloky, takˇze tato velikost m˚uˇze b´yt uloˇzena za pomoc´ı jedin´e hodnoty bs.

2.3.2.2 Pˇrevod z hust´e matice

Algoritmus 3 Hust´a matice →BCRS

1: procedure CRS(M :DenseM atrix, bs:int)

2: C:BCRS .Tvoˇren´a matice

3: C.heightM.height;C.widthM.width;bs2bs·bs

4: max lenC.widthC.height/bs2

5: C.offsetszeroes(C.height)

6: C.indexeszeroes(max len);C.valueszeroes(maxlenbs2)

7: count←0

8: fori←0 to M.height/blokdo

9: C.offsets[i]←count

10: for j←0 to M.width do

11: if notEmpty(M[i∗bs: (i+ 1)∗bs][jbs: (j+ 1)∗bs])then

12: C.values[countbs2 : (count+ 1)∗bs2]

13: M[i∗bs: (i+ 1)∗bs][jbs: (j+ 1)∗bs]

14: C.indexes[count+ +]←j

15: C.offsets[M.height]←nnz

16: return C

Jak si m˚uˇzeme vˇsimnout na algoritmu 3, lze tento pˇrevod prov´est prakticky stejnˇe jako u CRS (viz algoritmus 2). Rozd´ıly jsou ve velikosti alokovan´ych pol´ı (po dokonˇcen´ı pˇrevodu mohou b´yt pole zmenˇsena), a d´ale pak na ˇr´adc´ıch 11, kde m´ısto testov´an´ı jednoho prvku testujeme cel´y blok a na ˇr´adku 12, kde kop´ırujeme cel´y blok hodnot.

2.3.2.3 Transpozice

I zde m˚uˇzeme vyuˇz´ıt jiˇz hotovou transpozici z CRS. Cel´y postup m˚uˇze pro- bˇehnout stejnˇe, m´ısto prvk˚u vˇsak pracujeme s cel´ymi bloky prvk˚u. Samotn´e bloky mus´ı b´yt tak´e transponov´any zp˚usobem obvykl´ym pro hust´e matice, coˇz lze prov´est napˇr´ıklad pˇri jejich pˇresunu v counting sortu.

(40)

2. N´avrh

2.3.2.4 N´asoben´ı

Vyn´asoben´ım dvou blok˚u vˇzdy vznikne nov´y blok hodnot (kter´y m˚uˇze b´yt pˇr´ımo ukl´ad´an do hust´e matice, pˇr´ıpadnˇe ukl´ad´an bˇehem v´ypoˇctu po hod- not´ach). I zde tedy lze n´asobit dvˇema zp˚usoby, tedy BCCS·BCRS (CR) aBCRS·BCCS(RC). Prvky uvnitˇr blok˚u vˇsak nem´a velk´y smysl n´asobit ji- nak, neˇz pomoc´ı nez´avisl´ych skal´arn´ıch souˇct˚u (ˇr´adek×sloupec) a postupn´eho ukl´ad´an´ı, protoˇze bloky samy o sobˇe jsou hust´e, a tedy nevznik´a dodateˇcn´a n´aroˇcnost s porovn´av´an´ım index˚u.

2.3.3 ELL

2.3.3.1 Datov´a struktura

Pro uloˇzen´ı matice (n×m) v ELL form´atu je nezbytn´e uchovat dvˇe ma- tice velikosti n×ell width, tedy matici hodnot a matici sloupcov´ych index˚u, kdeell widthje nejvˇetˇs´ı poˇcet nenulov´ych prvk˚u na ˇr´adek. Pˇrebyteˇcn´e m´ısto v ˇr´adc´ıch s m´enˇe nenulov´ymi prvky m˚uˇze b´yt pro jednoduchost pr´ace s matic´ı vyplnˇeno nulami. D´ale je samozˇrejmˇe nezbytn´e tak´e uloˇzit ell width a ˇs´ıˇrku a v´yˇsku p˚uvodn´ı matice.

2.3.3.2 Pˇrevod z hust´e matice

Algoritmus 4 Hust´a matice→ ELL

1: procedureCRS(M :DenseM atrix)

2: C :ELL . Tvoˇren´a matice

3: C.heightM.height;C.widthM.width

4: C.ell widthmax(count nnz(M.rows)) . O(n·m)

5: C.indexes, C.valueszeroes(C.ell widthC.height)

6: fori←0 to M.heightdo

7: row index←0

8: forj←0 to M.widthdo

9: if notEmpty(M[i][j]) then

10: C.values[iC.ell width+row index]M[i][j]

11: C.indexes[iC.ell width+row index]j;

12: row index+ +;

13: return C

Aˇckoliv je struktura tohoto form´atu znaˇcnˇe rozd´ıln´a od CRS, i zde lze pˇrevod prov´est podobn´ym zp˚usobem. Pseudok´od tohoto algoritmu si m˚uˇzete prohl´ednout na algoritmu 4.

Odkazy

Související dokumenty

C´ılem pˇ redloˇ zen´ e pr´ ace je n´ avrh a implementace vizualizaˇ cn´ı metody, kter´ a kombinuje obraz z barevn´ e a term´ aln´ı kamery.. Pˇ redpokl´ ad´ a se, ˇ

Celkov´ y pˇ r´ınos pr´ ace tedy hodnot´ım jako nadpr˚ umˇ ern´ y, kvalitu zpracov´ an´ı pr´ ace hodnot´ım jako podpr˚ umˇ ernou. Pˇ resto se domn´ıv´ am, ˇ ze

Po konzultaci s vedouc´ım pr´ ace bylo rozhodnuto, ˇ ze pro dalˇ s´ı v´ yvoj bude pouˇ zita varianta fixn´ı palubn´ı jednotky, jelikoˇ z ta nejv´ıce splˇ novala poˇ

V´ ystupem bude matice Q, jej´ıˇ z sloupce budou tvoˇ rit vlastn´ı vektory vstupn´ı matice a vektor d obsahuj´ıc´ı pˇ r´ısluˇ sn´ a vlastn´ı

D˚ usledek 1 Mnoˇzina vˇsech matic typu (m, n) tvoˇ r´ı se sˇ c´ıt´ an´ım matic a n´ asoben´ım matice re´ aln´ ym ˇ c´ıslem line´ arn´ı prostor.. Pˇrehozen´ı

Napˇ r´ ıklad je moˇ zn´e se zamyslet nad ot´azkou, kter´a ze vstupuj´ ıc´ ıch mˇ e ˇ ren´ ych veliˇ cin se pod´ ıl´ ı na v´ ysledn´e nejistot ˇ e nejv´ ıce.. To

Informaˇ cn´ı syst´ em je implementov´ an jako webov´ a aplikace a je pˇ ripraven na dalˇ s´ı implementaci, at’ uˇ z v podobˇ e implementov´ an´ı m´ enˇ e podstatn´

Bohuˇ zel, pr´ ace je pˇ r´ıliˇ s struˇ cn´ a, informace v n´ı jsou roztrouˇ seny, nen´ı celistv´ a, t.j.. chyb´ı v n´ı detaily, kter´ e jsou je pro