GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Hasonló dokumentumok
sallang avagy Fordítótervezés dióhéjban Sallai Gyula

C# gyorstalpaló. Készítette: Major Péter

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

Autóipari beágyazott rendszerek. Komponens és rendszer integráció

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Fordítóprogramok. Aszalós László szeptember 7.

Számítógépek felépítése

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

9.fejezet: Függvények és külső eljárások

Programozási nyelvek (ADA)

C++ programozási nyelv

4. Programozási nyelvek osztályozása. Amatőr és professzionális

Programozás 3. Dr. Iványi Péter

Java II. I A Java programozási nyelv alapelemei

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

Clang Static Analyzer belülről

Magas szintű optimalizálás

Algoritmusok Tervezése. 1. Előadás MATLAB 1. Dr. Bécsi Tamás

Programozas 1. Strukturak, mutatok

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Láncolt lista. az itt adott nevet csak a struct deklaráción belül használjuk

Programozási nyelvek (ADA)

Párhuzamos programozási platformok

egy szisztolikus példa

Programozási nyelvek a közoktatásban alapfogalmak I. előadás

Kifejezések. Kozsik Tamás. December 11, 2016

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Haladó Fordítóprogramok

Podoski Péter és Zabb László

Párhuzamos programozási platformok

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java II. I A Java programozási nyelv alapelemei

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI

Aritmetikai kifejezések lengyelformára hozása

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Objektumorientált Programozás III.

Modellező eszközök, kódgenerálás

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Programozási nyelvek 6. előadás

1. Alapok. Programozás II

Mintavételes szabályozás mikrovezérlő segítségével

OOP. Alapelvek Elek Tibor

A C programozási nyelv I. Bevezetés

MATLAB OKTATÁS 1. ELŐADÁS ALAPOK. Dr. Bécsi Tamás Hegedüs Ferenc

Algoritmizálás, adatmodellezés tanítása 6. előadás

A C programozási nyelv I. Bevezetés

I. A DIGITÁLIS ÁRAMKÖRÖK ELMÉLETI ALAPJAI

Pénzügyi algoritmusok

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

A szürke háttérrel jelölt fejezet/alfejezet szövege a CD-mellékleten található. A CD-melléklet használata. 1. Elméleti áttekintés 1

Programozás alapjai. 10. előadás

GPU Lab. 3. fejezet. Az X86 Utasításkészlet. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Fordító Optimalizálás

Labor 2 Mikrovezérlők

A Feldspar fordító, illetve Feldspar programok tesztelése

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Az AVR programozás alapjai. Előadja: Both Tamás

Határozatlan integrál, primitív függvény

1. Egyszerű (primitív) típusok. 2. Referencia típusok

1. Gyakorlat. Rövid elméleti összefoglaló. <tárolási osztály>típus <típus > változónév <= kezdőérték><, >;

Programozási nyelvek JAVA EA+GY 1. gyakolat

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozási alapismeretek 4.

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

KOMPUTER-ALGEBRA RENDSZEREK VERIFIKÁCIÓJA

A kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...

Oracle GoldenGate Studio Nagyon rövid bemutató. Quick Talk. Gollnhofer Gábor

C++ programozási nyelv Konstruktorok Gyakorlat

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

ISA szimulátor objektum-orientált modell (C++)

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

S z á m í t ó g é p e s a l a p i s m e r e t e k

2018, Diszkrét matematika

Programozási nyelvek Java

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

Vezérlésfolyam gráf és X86 utasításkészlet

A 32 bites x86-os architektúra regiszterei

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

1. Bevezetés A C++ nem objektumorientált újdonságai 3

FEGYVERNEKI SÁNDOR, Valószínűség-sZÁMÍTÁs És MATEMATIKAI

HÁZI FELADAT PROGRAMOZÁS I. évf. Fizikus BSc. 2009/2010. I. félév

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

BASH script programozás II. Vezérlési szerkezetek

Adatelérés és memóriakezelés

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Optimalizáció ESX-től View-ig. Pintér Kornél ügyfélszolgála3 mérnök

Programozás C++ -ban

3. Osztályok II. Programozás II

Átírás:

4. fejezet Fordítók felépítése Grafikus Processzorok Tudományos Célú Programozása

Fordítók Kézzel assembly kódot írni nem érdemes, mert: Egyszerűen nem skálázik nagy problémákhoz arányosan sok kódot kell megírni, kevés absztrakció van Nem biztonságos, nehezen olvasható, nehezen érthető, nehezen karbantartható Nem hordozható másik hardverre (pl. mikrokontroller, ARM alapú telefon) újra kell írni 2

Fordítók Inkább: Magasabb szintű nyelveket használunk, amelyekhez tartozó fordítók képesek a magas szintről előállítani a gépi kódot. 3

Fordítók A fordítók viszonylag bonyolult programok. Ahhoz, hogy jól ki tudjuk használni a képességeiket főleg optimalizációk terén, célszerű ismerni a felépítésüket Forrás kód Lexikális elemző Szintaktikus elemző Szemantikus elemző Átmenetikódgenerátor Optimalizátor Célkódgenerátor 4

Fordítók Egy fordítót megírni bonyolult. Mégis, szinte minden nap létrejön egy új programozási nyelv... Hogyan? A válasz: modularitás! 5

Fordítók A magas szintű nyelvek elvonatkoztatnak a hardver részleteitől Pl.: regiszterek száma és neve, utasításkészlet,... Másrészt a nyelv lényegében a szintaxis + szemantika Tehát alapvetően csak ezeket kell átírni egy új nyelvhez Forrás kód Lexikális elemző Szintaktikus elemző Szemantikus elemző Átmenetikódgenerátor Optimalizátor Célkódgenerátor 6

Fordítók A magas szintű nyelvek elvonatkoztatnak a hardver részleteitől Pl.: regiszterek száma és neve, utasításkészlet,... Másrészt a nyelv lényegében a szintaxis + szemantika Tehát alapvetően csak ezeket kell átírni egy új nyelvhez Ez architektúra specifikus Ez a fordító belső működése Forrás kód Lexikális elemző Szintaktikus elemző Szemantikus elemző Átmenetikódgenerátor Optimalizátor Célkódgenerátor 7

Fordítók Ebből az is következik, hogy az optimalizációk minősége (pl.: mennyire hatékony kódot generál, milyen jól vektorizál) csak a nyelvek kifejező képessége miatt térhet el! 8

Optimalizációk Néhány optimalizáció, amit a fordítók általában támogatnak: Ciklusokon: indukció elemzés, szétbontás, egyesítés, megfordítás, megcserélés, invariánsok kiemelése, egymásba ágyazások optimalizációja, kifejtés Kifejezéseken: közös alkifejezések kiemelése, konstansok műveleteinek kiértékelése, betöltés/kimentés átrendezése Algebrai és lebegőpontos formulákon: +, * asszociativitása, disztributivitása, kiemelés, osztás helyett reciprokkal szorzás, kommutativitás Utasítás szintű párhuzamosság: SSE/AVX automatikus generálása 9

Optimalizációk Általában nem kell tudni túl sok részletet, csak engedélyezni az optializációkat... Persze a fordító csak azokat az átalakításokat tudja megtenni, amiket ismer / felismer. 10

Optimalizációk Érdemes tudni, hogy: A fordítók átlátnak az osztályok, struktúrák létrehozásán, tagjainak a hozzáférésén, felszabadításán addig, amíg mindez a stack-en történik! Ez azt is jelenti, általában hogy nem kell feláldozni a kód olvashatóságát a sebességért! 11

Optimalizációk Érdemes tudni, hogy: a pointerek, new/delete/dinamikus allokációk, volatile változók, virtuális függvényhívások, beolvasás perifériákról, adatfolyamokból (fájlok, hálózat) megakadályozza, hogy a fordító érveljen, átlásson a konstrukciókon és optimalizálhasson. Habár a legtöbb téren, különösen a virtuális függvényhívások optimalizációján állandó fejlesztések történnek! 12

Optimalizációk Érdemes tudni, hogy: A fordító csak azt a kódot érti maximálisan, amiről tudja mit jelent! Intrinsic függvények! 13

Intrinsic függvények Intrinsicnek nevezünk egy olyan konstrukciót (általában függvényt), amelynek kezeléséről, tulajdonságairól a fordító extra információkkal rendelkezik. Pl.: SSE/AVX utasítások Speciális matematikai függvények Adatmozgatás és bitműveletek A speciális matematikai függvények általában jelentősen átfednek a nyelvek standard beépített függvényeivel. Mindig ellenőrizzük a fordító leírását! 14

Intrinsic függvények Mi a különbség egy intrinsic függvény és egy kézzel megírt változat között? A fordító pontosan tudja, milyen gépi kódot kell generálnia belőle A pontosság általában az utolsó jegyig garantált Valószínűleg tudja kezelni / ismeri a speciális értékeit Ismerhet algebrai átalakításokat hozzá Speciálisan hatékony implementációi lehetnek egyes adattípusokra int, float, double,... Egy kézzel írt esetben ezek egyike sem teljesül! 15

Intrinsic matematikai függvények Egy részleges lista az általában támogatott matematikai függvényekről: abs, acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod, ln, log10, memory {compare, copy, set}, pow, rot, sin, sinh, sqrt, string {concat, cmp, cpy, length}, tan, tanh 16

Statikus kódanalízis A statikus kódanalízis egy speciális fajta fordítás, amikor a fordító kifejezetten olyan algoritmusokat futtat, amik azokat a gyakori fejlesztői hibákat próbálják megtalálni, amiket a nyelv egyébként nem szűr ki. Számos fordító támogat valamilyen szintű statikus analízist. Általában segítenek megtalálni: Az inicializálatlan változókat, érvénytelen referenciákat Null- vagy érvénytelen pointereket Dupla felszabadítást delete-nél, delete utáni használatás, vagy fel nem szabadított dinamikus memóriákat 17

Kapcsolók... Egyszer az életben, szánjuk rá az időt, és olvassuk el a fordító kapcsolóit, beállításait: Hogyan kell engedélyezni az optimalizációkat? Hogyan kell bekapcsolni a vektorizációt és a kiterjesztett utasítás készletek használatát (SSE, AVX) Milyen intrinsic függvények vannak támogatva? Hogyan hatnak az optimalizációk a numerikus pontosságra? (fast vs. precise) Hogyan kapcsoljuk be a statikus analízist? 18