Mélyvíz: párhuzamosítás és optimalizálás az Intel jövőképében

Hirdetés

Programfejlesztés, vektoriális modell

A klasszikus szoftverfejlesztési modell három lépcsőből áll:

  • Tervezés: a legjobb algoritmusok és adatstruktúrák kiválasztása;
  • Implementálás: megvalósítás a futtató architektúra és a rendelkezésre álló eszközök figyelembevételével;
  • Analízis: teljesítmény ellenőrzése és javítása.

Az eddigi megközelítésben két „vázból” állt a modell: először megírták a kódot az adott programnyelv sajátosságainak figyelembevételével, majd jöhetett az optimalizálás (scalar framework). Amikor már elégedettek voltak a program teljesítményével, akkor jöhetett az adott processzor utasításkészletének legjobb kihasználása, ezzel további sebességnövekedéshez jutva (vector framework).

Lee úr ezt a két vázat kiegészítette egy harmadikkal, a párhuzamosítással, tehát az egy szálon kielégítően futó programunkat megpróbáljuk több szálon is hatékonyan futtatni. Nyilván létezhetnek olyan esetek, amikor már sokkal korábban kell gondolnunk a többszálú futtatásra, de általános iránymutatásnak nagyon jó és egyszerű ez a megközelítés. További érdekesség még, hogy a programunk által használt erőforrások függvényében az analízis és az optimalizálás az egyes szinteken más-más nagyságú gyorsulást hoz.

A skaláris modell

Az algoritmusok megválasztásánál két tényezőt írt le: a komplexitást és az intenzitást. A komplexitás gyakorlatilag az adott adaton elvégzendő számítás mennyiségét és bonyolultságát, míg az intenzitás a memóriából beolvasandó és kiírandó adatmennyiséget jellemzi. Nyilván processzorunk akkor optimálisan kihasznált, ha nem kell a memóriára túl sokat várni, de nem is töltünk el olyan dolgok kiszámításával értékes ciklusokat, amelyek közben olcsón elérhetőek lennének a memóriából is. Az adatstruktúrák esetében azok szerkezetét és méretét célszerű okosan eldönteni, például érdemes a cache-line méretét figyelembe venni, és a leggyakrabban használt adatokat tenni előre. Általában drága a 16 bájt határon átnyúló adatok használata, illetve a bitmezőkkel is érdemes spórolni, ha csak egy-két bitet akarunk használni, hiszen bejön/bejöhet velük plusz léptetés. Lehetőség szerint inkább használjunk egy folyamban, de legalábbis nagyobb egységekben olvasható adatokat, és kerüljük a véletlenszerűséget.

“A fordító a barátod”, szól a mondás, és ebben van igazság! Az Intelnél (is) rengeteg időt szentelnek a fordítók okosítására. Egyrészt jobban kihasználják a hardver képességeit automatikusan, másrészt egyre több lehetőséget nyújtanak a testreszabásban. Ugyanakkor a fordító nem a Szent Grál, nem old meg minden problémát, és nem javítja ki a hanyagul megírt kódot. Szükség van jól optimalizálható kódra (pragmák, vektorizálható kód stb). Használjuk ki az architektúra képességeit! Egyik kedvenc a streaming store, amikor úgy tudunk inicializálni egy teljes cache-line-nyi adatot, hogy azt nem kell előtte beolvasni, hiszen tudjuk, hogy a teljes 64 bájtot felülírjuk. Érdemes továbbá használni a hardveres támogatást élvező utasításokat, hiszen sokkal nagyobb teljesítményt lehet velük elérni (pl. egyszeres pontosságú RECIP és RSQRT a Xeon Phín 1 órajelciklust vesz igénybe).

Az analízis történhet analitikus vagy dinamikus módon. Az analitikus mód nagyon fontos lenne már a kódolás korai szakaszában, hiszen ha tudjuk, hogy az adott C kód milyen gépi kóddá fordul, akkor lehet sejtésünk maximális teljesítményéről. Ha tehát már az analitikus elemzés idején kiderül, hogy a megcélzott teljesítmény közelében sem vagyunk, akkor még időben lehet más megoldást keresni. A dinamikus analízisre szerencsére több eszköz is létezik, fizetősök és ingyenesek egyaránt. Az Intel processzoraiban (is) van meglehetősen sok belső számláló, amit teljesítményelemzéshez lehet felhasználni. Ilyen program például a gprof, az oprofile, a Valgrind az ingyenesek közül, vagy az Intel VTune a fizetős csapatból, természetesen a teljesség igénye nélkül. Ezeknek az eszközöknek a használatához már érdemes kicsit elmélyedni a processzorok működésében. Az Intel VTune jól használható grafikus kezelőfelülettel rendelkezik, de természetesen futtatható parancssorból is, ami sokszor megkönnyíti az életet. Van pár előre beállított elemzésmódja, azok nagy segítséget jelentenek a kezdeti analíziseknél.

A cikk még nem ért véget, kérlek, lapozz!

  • Kapcsolódó cégek:
  • Intel

Azóta történt

Előzmények