(GP)GPU kezdetek. Avagy hogyan lesz az algoritmusból implementáció. Lectures on Modern Scientific Programming Wigner RCP November 2015.
|
|
- Sára Oroszné
- 6 évvel ezelőtt
- Látták:
Átírás
1 (GP)GPU kezdetek Avagy hogyan lesz az algoritmusból implementáció Lectures on Modern Scientific Programming Wigner RCP November 2015
2 Tartalom Számítógépes grafika GPU hardver ismeretek GPGPU API történelem Miért OpenCL? OpenCL C API OpenCL C++ API Algoritmus könyvtárak
3 Számítógépes grafika Ha ismered az ellenséget és ismered önmagad, nem kell félned száz csatától sem. Ha magadat ismered, de az ellenségedet nem, minden egyes győzelem után egy vereség vár rád. Ha sem magadat, sem az ellenséget nem ismered, minden egyes csatát el fogsz veszíteni. - Sun Tzu: A háború művészete
4 Inkrementális kép szintézis Leginkább játékokban alkalmazott kép alkotási eljárás Célja: egy virtuális, 3 dimenziós színtér elemeit megjeleníteni a 2 dimenziós képernyőn A színtér elemeit háromszögekből (polygon) építjük fel A háromszögeket koordináta transzformációk sorozatával juttatjuk a képernyőre A transzformációk jellege közel azonos objektumról objektumra A háromszögeket transzformáció után textúrákkal kiszínezzük
5 Affin geometria A 3 dimenziós Euklideszi-teren ható lineáris transzformációk legtöbbje leírható 3 3-as mátrixokkal Affin transzformációnak hívjuk a párhuzamosságot megtartó trafók összességét A 3 dimenziós Euklideszitérhez tartozik egy 4 dimenziós homogén koordinátázott tér amiben minden számunkra lényeges trafó leírható 4 4-es mátrixokkal a 11 a 12 a 13 b 14 a 21 a 22 a 23 b 24 a 31 a 32 a 33 b x y z w = x y z w
6 Csúcspont transzformációk Modell koordináták Világ koordináták Kamera koordináták Képernyő koordináták Modell transzformáció Nézeti transzformáció Vetítés Minden egyes transzformációt egy 4x4-es mátrix ír le.
7 A raszterizálás menete Primitívek összeszerelése Raszterizálás Interpolálás, textúrázás, Minden egyes lépés fix funkciós elemekkel támogatott. színezés
8 Sugárvetés, sugárkövetés Animációs filmek kedvelt képalkotási eljárása A fénysugarak útját követi le a fényforrásoktól a képpontokig A hatékonyság miatt pont a fordítottja történik A képpontokból kiindulva keressük a fényforrásokat A sugarak felösszegzik a különböző felületkről származó színeket
9 Renderelési technikák Inkrementális kép szintézis Sugárkövetés A render egyetlen közelítő megoldása Valós időben rajzolható Fix funkciós támogatás Erre született A render egyenlet pontos megoldása Tipikusan offline rajzolható Általános számolásnak minősül GPU-n annyi sebből vérzik
10 GPU hardver ismeretek Born to RENDER!
11 Mi a különbség? CPU GPU Késleltetésre kondicionált hardver Általános végrehajtási egység Fix utasítás architektúra Áteresztésre kondicionált hardver Adatpárhuzamos végrehajtási egység Virtuális utasítás architektúra
12 Graphics Processing Unit (GPU) Rengeteg TOC Valamennyi fix funkciós egység Adatpárhuzamosság a cél AMD Tahiti (Radeon HD7970) áramköri fotó (kontrasztosítva)
13 Accelerated Processing Unit (APU) Kevés LOC Rengeteg TOC Valamennyi fix funkciós egység Egyre inkább ez a tendencia AMD Kaveri áramköri fotó (színezett)
14 Many Integrated Cores (MIC) Project Larrabee néven indult Felkiáltás: grafikát x86-tal Rengeteg LOC Egyszerre LOC és TOC Igazából se LOC, se TOC Intel Knight s Corner áramköri fotó
15 Mobile computing X86 helyett ARM magok CISC kontra RISC LOC kevesebb helyet foglal Több IGP vagy több fix funkciós A média tartalomtól terhes mobil világban ez a legkézenfekvőbb Nvidia Tegra K1 áramköri fotó (színezett)
16 Eyefinity Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár Crossfire composit Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár BUS BUS HUB UVD Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár Gyorsító tár VCE PCI-E 3.0 vezérlő AMD Graphics Core Next 1.0 Masszívan párhuzamos architektúra ACE Parancs processzor ACE Parancs processzor Parancs processzor Raszterizáló Raszterizáló Erősen redundáns, ellenálló a gyártási hibákkal szemben Hierarchikus felépítés (cache, ACE+GCN) Fix funkciós egységek, nem csak grafikára ACE: Asynchronous Compute Engine GDS: Global Data Share UVD: Universal Video Decode VCE: Video Coding Engine GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor Globális tárhely L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L1 L2 gyorsító tár GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor GCN motor Memória vezérlő Memória vezérlő Memória vezérlő Memória vezérlő Memória vezérlő Memória vezérlő AMD Tahiti (Radeon HD7970) sematikus ábra
17 Csak olvasható adat gyorsítótár (16kB / 4 GCN motor) Utasítás betöltő Utasítás irányító Írható/olvasható L1 gyorsítótár (64kB) Fix funkciós Utasítás gyorsítótár (32kB / 4 GCN motor) Utasítás betöltő Utasítás irányító Írható/olvasható L1 gyorsítótár (64kB) GCN Számoló Egység részletek Általános célokra optimalizált számítási egység 1 CU = 4 SIMD motor 1 SIMD = 16 regiszter 1 regiszter = 32 bit Regiszter késleltetés (!) Közös memória Kvintesszenciája a hatékony GPU használatnak Csatolt működés A SIMD egységek minden sávja egy külön szálat fog futtatni 1 SIMD motorhoz azonban 1 program számláló tartozik Nincs igazi elágazás Program és elágazás számláló Program és elágazás számláló Program és elágazás számláló Program és elágazás számláló Program és elágazás számláló Program és elágazás számláló Program és elágazás számláló Program és elágazás számláló Elágazás- és üzenet-küldő Export/GDS dekódoló Vektor memória dekódoló Skalár dekódoló Vektor dekódoló Gyorsítótár dekódoló 64kB közös memória Elágazás- és üzenet-küldő Export/GDS dekódoló Vektor memória dekódoló Skalár dekódoló Vektor dekódoló Gyorsítótár dekódoló 64kB közös memória Skalár egység 8kB REG INT ALU SIMD motor 64kB REG MP ALU SIMD motor 64kB REG MP ALU Skalár egység 8kB REG INT ALU SIMD motor 64kB REG MP ALU SIMD motor 64kB REG MP ALU GCN motor SIMD motor 64kB REG MP ALU SIMD motor 64kB REG MP ALU GCN motor SIMD motor 64kB REG MP ALU SIMD motor 64kB REG MP ALU AMD GCN 1.0 Compute Unit sematikus ábra
18 Rejtett késleltetés Előnyös Előnytelen
19 NVIDIA Maxwell architektúra NVIDIA Maxwell (GM204) sematikus ábra
20 NVIDIA Maxwell architektúra NVIDIA Maxwell SMM sematikus ábra
21 GPGPU API-k A teljesség igénye nélkül
22 Egy állatkertre való API csokor C++AMP
23 Compute Unified Device Architecture Az Nvidia Corporation válasza a fejlesztői presszióra, hogy kevesebb akadályt elgördítve lehessen grafikától független számolásokat végezni a GPU-n Első verziója 2007-ben jelent meg Két szintű hozzáférés C meghajtó API C++98 nyelvi kiterjesztés, amiben speciális operátorok és dekorátorok jelennek meg a gazda és eszköz oldali kód szétválasztására (CUDA 7.0-tól részleges C++11) Zárt technológia, a képességei a mindenkori Nvidia hardver képességeihez vannak igazítva
24 Open Computing Language Az Apple Incorporation kezdeményezése válaszul a CUDA sikerére, azonban a széleskörű érdeklődésre való tekintettel átengedték a fejlesztését a Khronos konzorciumnak Első verziója 2009-ben jelent meg Külön gazda és eszköz oldali nyelv C API a gazda oldali kód számára C-szerű nyelv az eszköz oldali kód számára (OpenCL 2.1-től statikus C++14) Nyílt technológia, bárki részt vehet a fejlesztésében és bárki implementálhatja
25 DirectX Compute Shader A Microsoft vezető 3-dimenziós grafikus API-jának GPGPU oldal ági kinövése 2009-ben jelent meg, A DirectX 11-ben debütált Triviális módon integrálódik a grafikus szerelőszalagba A gazda oldali C++ API megörökli a grafikai felhasználás jellegzetességeit Az eszköz oldali nyelve a HLSL (High-level Shading Language) DirectX 12?
26 Open Grahpics Library A Microsoft DirectX-ének nyílt változata, Khronos szabvány 2012-ben jelent meg, az OpenGL 4.3-ban debütált Triviális módon integrálódik a grafikus szerelőszalagba A gazda oldali C++ API megörökli a grafikai felhasználás jellegzetességeit Az eszköz oldali nyelve a GLSL (OpenGL Shading Language)
27 C++ Accelerated Massive Parallelism Tanulmány a masszív párhuzamosság szabványosítására, intrgrálására a C++ nyelvbe es Microsoft fejlesztés, nyíltan implementálható C++ nyelvi kiterjesztés, amely a concepts nyelvi elem segítségével szeparálja a gazda és eszköz oldali kódot Nem határozza meg az implementáció bináris reprezentációját
28 Open Multi-Processing Egy különálló konzorcium (OpenMP Architecture Review Board) fejleszti. Eredetileg CPU párhuzamosságot célzó technológia A 2013-as 4.0-ás verziójától kezdve támogatja a gyorsítókra történő feladat kiosztást Nyílt szabvány, nyíltan implementálható C, C++, Fortran nyelveket támogat preprocesszor direktívákon (#pragma) keresztül
29 Open Accelerators Nvidia kezdeményezés egy OpenMP-szerű direktívák által vezérelt C, C++, fortran párhuzamos API létrehozására Nyílt szabvány, nyíltan implementálható 2013-ban egy tanulmány keretében megalapozták egy OpenMP-vel kompatibilis verzió alapjait, amely egy jövőbeni OpenMP szabványban teheti tiszteletét A legújabb 2.0-ás változatát idéntől támogathatja a GCC 5-ös verziója
30 SYCL Az OpenCL-t ért kritikák nyomán fejlesztett C++ sablon könyvtár Béta állapotban van, első verziója idén várható A gazda és eszköz oldali kód tisztán a sablon könyvtáron keresztül szeparálódik el A fordítás módját nem, de a köztes reprezentációt meghatározza A motorháztető alatt az OpenCL által lefektetett technológiákra támaszkodik A nevét (mint sarló) az OpenCL köztes nyelve (SPIR, mint lándzsa) után kapta
31 Nyílt szabványok FTW
32 Nyílt szabványok FTW A hordozhatóság nem le becsülendő Teljesítmény tartalékok más platformokon Időtállóság Kompatibilis környezetek számossága A gyártók között felfedezett közös nevező Absztrakciója a hardvernek Tanuláshoz jó kiindulási pont Könyvtárak fejlesztéséhez sem előnytelen Az itt megszerzett tudás mindenhol használható lesz
33 OpenCL áttekintés Avagy absztrakció Khronos-módra.
34 Mi szükség OpenCL-re? A hagyományos CPU-s eszközök (API-k, fordítók, stb.) szinte kivétel nélkül feltételeznek egy globálisan írható/olvasható memória címteret. A GPU felépítésénél hamar nyilvánvalóvá válik, hogy ennek az uniform címtérnek a szegmentálása révén drámaian egyszerűsödik a hardver A felszabaduló erőforrások nagyobb teljesítményre fordíthatók Jobb energiahatékonyság is elérhető Egyes memória szeletek (címterek) csak bizonyos helyekről érhetők el. A hozzáférési szemantika egészen egzotikus is lehet. A modern hardverekben a GPU csak egy fajta célhardver CPU, GPU, FPGA, DSP, crypto, stb.
35 Mit csinál OpenCL Az OpenCL absztrakcióiban NEM a hardveren van a hangsúly A párhuzamos struktúrák kerülnek előtérbe Természetesen egy-az-egy megfeleltetés van a GPU részegységek és egyes absztrakciós elemek között A tény, hogy FPGA-kra is nagyon jól fekszik mutatja azonban, hogy ennél többről van itt szó Alacsony szintű C API, amely ilyen formán képes más API-kkal is beszélgetni
36 OpenCL platform modell Platform 0 Gazda Eszköz N Eszköz CU EszközCU PE EszközCU PE CU PE PE PE PE CU CU CU PE PE CU PE PE PE PE PE PE PE PE Egy platform, az egy implementációja az OpenCL szabványnak A futtató környezet áll egy gazda folyamatból és a platformok által enumerált eszközökből Egy eszköz valahány számoló egységből áll (CU, Compute Unit) Egy CU pedig valahány feldolgozó egységből áll (PE, Processing Element)
37 Mi egy OpenCL eszköz? Egy Compute Unit valahány végrehajtó egységből és egy írható/olvasható megosztott memóriából (Local Memory) áll. Egyedül képes futtatni egy teljes munkacsoportot (Workgroup) és annak tagjait kiszolgálni a lokális memóriával. A munkacsoport olyan program szálak együttese, amelyek képesek hatékonyan szinkronizálni egymással, valamint adatokat megosztani egymással egy gyors, lokális memórián keresztül. Egy munkacsoport garantáltan egy végrehajtó egységre fog leképeződni, ugyanakkor semmi sem garantálja, hogy csak egy munkacsoport fog majd egy végrehajtón futni egyidejűleg.
38 OpenCL memória modell Eszköz 1 CU 1 Eszköz L PE 1 CU 1 PE 1 privát privát lokális CU M PE N PE 1 CU M PE N PE 1 privát privát privát privát lokális lokális Globális/konstans gyorsító tár Globális/konstans gyorsító tár PE N privát lokális PE N privát Az eszköz 4 külön memória névtérrel rendelkezik Privát Lokális Globális/konstans A gazda folyamat hoz létre memória objektumokat, amik a gyorsító tárakba kerülnek Gazda folyamat Globális memória Konstans memória Gazda oldali memória
39 OpenCL C API Ássunk mélyre
40 Platform választás, context létrehozás cl_platform_id platform = NULL; auto status = clgetplatformids(1, &platform, NULL); cl_device_id device = NULL; status = clgetdeviceids(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL); cl_context_properties cps[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)platform, 0}; auto context = clcreatecontext(cps, 1, &device, 0, 0, &status); auto queue = clcreatecommandqueuewithproperties(context, device, nullptr, &status); Lekérjük az első platformot amit találunk Lekérjük az első GPU-t, amit a platform támogat Létrehozunk egy kulcs-érték párokból álló tömböt a kontextusunkhoz Létrehozzuk magát a kontextust az egy darab eszközzel Létrehozunk egy parancslistát arra az egy eszközre
41 Forrás fájl betöltése programba std::ifstream file(kernel_location); std::string source(std::istreambuf_iterator<char>(file), (std::istreambuf_iterator<char>())); size_t sourcesize = source.size(); const char* sourceptr = source.c_str(); auto program = clcreateprogramwithsource(context, 1, &sourceptr, &sourcesize, &status); Létrehozunk egy fájl adatfolyamot Iterátorokkal beolvassuk a fájl teljes tartalmát (futás-időben) Létrehozunk belőle egy programot A program tartalmazza majd a futtatható kerneleket Egy program több kernelt is tartalmazhat
42 Program fordítás, kernel létrehozás status = clbuildprogram(program, 1, &device, "", nullptr, nullptr); if (status!= CL_SUCCESS) { size_t len = 0; status = clgetprogrambuildinfo(program, device, CL_PROGRAM_BUILD_LOG, 0, nullptr, &len); std::unique_ptr<char[]> log = std::make_unique<char[]>(len); status = clgetprogrambuildinfo(program, device, CL_PROGRAM_BUILD_LOG, len, log.get(), nullptr); printf("%s\n", log.get()); } auto kernel = clcreatekernel(program, "squarer", &status); Lefordítjuk a programot a kiválasztott eszközre Ha nem sikerült lefordítani Létrehozzuk a lefordított programból a kernelt a választott belépési ponttal Lekérdezzük a fordítási napló méretét Memóriát allokálunk neki Feltöltjük a naplóval Kiírjuk konzolra
43 Adatok feltöltése, kernel paraméterezés std::array<float, 8> A{ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f }; std::array<float, 8> B{ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; auto buffer_in = clcreatebuffer(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR, A.size() * sizeof(float), A.data(), &status); auto buffer_out = clcreatebuffer(context, CL_MEM_WRITE_ONLY CL_MEM_COPY_HOST_PTR, B.size() * sizeof(float), B.data(), &status); status = clsetkernelarg(kernel, 0, sizeof(buffer_in), &buffer_in); status = clsetkernelarg(kernel, 1, sizeof(buffer_out), &buffer_out); Létrehozunk két tömböt Egy bemenetit és egy kimenetit (lehetne csak egyet is használni) Létrehozunk buffereket amelyek majd az eszközön tárolják az adatokat A bufferek lusta módon fognak kikerülni az eszközre (első használatkor) Nem feltétlen kell kiküldeni őket az eszközre (hozzáférési zászlókból következhet)
44 Adatok feltöltése, kernel paraméterezés std::array<float, 8> A{ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f }; std::array<float, 8> B{ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; auto buffer_in = clcreatebuffer(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR, A.size() * sizeof(float), A.data(), &status); auto buffer_out = clcreatebuffer(context, CL_MEM_WRITE_ONLY CL_MEM_COPY_HOST_PTR, B.size() * sizeof(float), B.data(), &status); status = clsetkernelarg(kernel, 0, sizeof(buffer_in), &buffer_in); status = clsetkernelarg(kernel, 1, sizeof(buffer_out), &buffer_out); Hozzárendeljük a létrehozott buffereket a kernel függvény argumentumaihoz Nincs típus ellenőrzés, memcpy történik a kettő között A sizeof operátor az argumentum méretére utal, nem a buffer tartalmának a méretére Egyedül a kernel és az indexedik argumentum létezése ellenőrződik
45 Végrehajtás size_t thread_count = A.size(); status = clenqueuendrangekernel(queue, kernel, 1, nullptr, &thread_count, nullptr, 0, nullptr, nullptr); status = clenqueuereadbuffer(queue, buffer_out, false, 0, B.size() * sizeof(float), B.data(), 0, nullptr, nullptr); status = clfinish(queue); std::for_each(b.begin(), B.end(), [](float x) { std::cout << x << "\n"; }); Elindítunk annyi work-itemet, ahány elemű a tömbünk Ezután visszakérjük az eredményt gazda oldali memóriába Megvárjuk, míg ezek a műveletek elkészülnek Alapértelmezetten a parancslistába rakott műveletek sorrend őrzők A listában szereplő műveletek azonban késleltetve hajtódnak végre (futószalag-szerű végrehajtás)
46 Mit tud és mit nem ez a program? Meg lehet rajta keresztül érteni az API elemek egymásra épülését Hibakezelést szinte teljesen nélkülözi Mi van, ha az első platform nem létezik? Mi van ha nincs rajta GPU? Mi van, ha a kernel forrás fájlt nem tudtuk betölteni? Mi van, ha bufferek nem férnek el memóriában? Mi van, ha rossz számú kernel példányt indítottunk el? Nem mellesleg minden API erőforrást elszivárogtat
47 OpenCL C++ API Citius, altius, fortius
48 Egy szebb és jobb világ Az OpenCL C++ nélkül olyan, mint a Dallas Bobby nélkül Lehet hassználni, de minek? Lásd itt Csomagoljuk be idiomatikus C++ba RAII-val garantáljuk az API erőforrások helyes felszabadítását Típus ellenőrizzük le, hogy helyesen paraméterezzük-e fel a kernelt A tömb műveletek ne fájjanak ( mennyi-foglal-feltölt minta) Hibakódokat ne kelljen minden sarkon ellenőrizni (kód felfújás) Ne legyen nagyon idegen (a lehetőségekhez mérten)
49 Madártávlati felépítés int main() { try // Any error results in program termination {... A programunk legnagyobb része itt lesz. Nézzük is meg! } catch (cl::builderror error) // If kernel failed to build {...} catch (cl::error error) // If any OpenCL error happes {...} catch (std::exception error) // If STL/CRT error occurs {...} } return EXIT_SUCCESS; C++ kivételek: beépített hibakezelési módszer
50 Platform választás std::vector<cl::platform> platforms; cl::platform::get(&platforms); for (const auto& platform : platforms) std::cout << "Found platform: " << platform.getinfo<cl_platform_vendor>() << std::endl; Dinamikus tömb létrehozása Malloc kivételt dobhat OpenCL Installable Client Driver lekérdezés: milyen platformok léteznek? API hívás ha hiba kóddal tér vissza, a wrapper kivételt dob Konzolra kiírjuk mindnek a nevét a felhasználó megelégedésére. Ha a platform rosszul működik (vagy rossz a varázs define): kivétel
51 Platform választás // Choose platform with most DP capable devices auto plat = std::max_element(platforms.cbegin(), platforms.cend(), [](const cl::platform& lhs, const cl::platform& rhs) { auto dp_counter = [](const cl::platform& platform) { std::vector<cl::device> devices; platform.getdevices(cl_device_type_all, &devices); }; return std::count_if(devices.cbegin(), devices.cend(), is_device_dp_capable); }); return dp_counter(lhs) < dp_counter(rhs); Szedjük darabjaira ezt a kód részletet!
52 Platform választás // Choose platform with most DP capable devices auto plat = std::max_element(platforms.cbegin(), platforms.cend(), [](const cl::platform& lhs, const cl::platform& rhs) { auto dp_counter = [](const cl::platform& platform) { std::vector<cl::device> devices; platform.getdevices(cl_device_type_all, &devices); }; return std::count_if(devices.cbegin(), devices.cend(), is_device_dp_capable); }); return dp_counter(lhs) < dp_counter(rhs); Keressük azt a platformot, ami a legtöbb vmilyen eszközt ismeri.
53 Platform választás // Choose platform with most DP capable devices auto plat = std::max_element(platforms.cbegin(), platforms.cend(), [](const cl::platform& lhs, const cl::platform& rhs) { auto dp_counter = [](const cl::platform& platform) { std::vector<cl::device> devices; platform.getdevices(cl_device_type_all, &devices); }; return std::count_if(devices.cbegin(), devices.cend(), is_device_dp_capable); }); return dp_counter(lhs) < dp_counter(rhs); A rendezési feltétel egy függvény eredménye alapján rendez.
54 Platform választás // Choose platform with most DP capable devices auto plat = std::max_element(platforms.cbegin(), platforms.cend(), [](const cl::platform& lhs, const cl::platform& rhs) { auto dp_counter = [](const cl::platform& platform) { std::vector<cl::device> devices; platform.getdevices(cl_device_type_all, &devices); }); }; return std::count_if(devices.cbegin(), devices.cend(), is_device_dp_capable); return dp_counter(lhs) < dp_counter(rhs); Najó, de ez hogyan néz ki? Egy platformon leszámolja a beszédes feltételnek eleget tevőket.
55 Platform választás // Checks weather device is DP calable or not bool is_device_dp_capable(const cl::device& device) { return device.getinfo<cl_device_extensions>().find("cl_khr_fp64")!= std::string::npos; } Hát ennél sokkal egyszerűbb nemigen lehet. Keressük az összes támogatott kiterjesztések stringjében azt az egy szabványos kiterjesztést, amire kíváncsiak vagyunk. Ha a stringben a helye nem egyenlő a nem létező pozícióval (no pos), akkor megtaláltuk valahol, tehát támogatott.
56 Platform választás // Choose platform with most DP capable devices auto plat = std::max_element(platforms.cbegin(), platforms.cend(), [](const cl::platform& lhs, const cl::platform& rhs) { auto dp_counter = [](const cl::platform& platform) { std::vector<cl::device> devices; platform.getdevices(cl_device_type_all, &devices); }; return std::count_if(devices.cbegin(), devices.cend(), is_device_dp_capable); }); return dp_counter(lhs) < dp_counter(rhs); Most már reméljük tiszta, mi történik itt.
57 Platform választás if (plat!= platforms.cend()) std::cout << "Selected platform: " << plat->getinfo<cl_platform_vendor>() << std::endl; else throw std::runtime_error{ "No double-precision capable device found." }; Biztos ami biztos, a felhasználót értesítsük, hogy melyik platformot választottuk ki végül. Ha nincs egy ilyen eszköz sem, akkor egy kivétellel eltűnünk a süllyesztőben.
58 Eszköz választás // Obtain DP capable devices std::vector<cl::device> devices; plat->getdevices(cl_device_type_all, &devices); std::remove_if(devices.begin(), devices.end(), [](const cl::device& dev) { return!is_device_dp_capable(dev); }); cl::device device = devices.at(0); std::cout << "Selected device: " << device.getinfo<cl_device_name>() << std::endl; Az adott platform összes eszközét lekérjük és most nem számolunk, hanem szűrünk. Eztán kivesszük a nulladik elemet Ha kozmikus véletlen folytán nem volna nulladik elem: kivétel
59 Context és parancslista létrehozás // Create context and queue std::vector<cl_context_properties> props{ CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>((*plat)()), 0 }; cl::context context{ devices, props.data() }; cl::commandqueue queue{ context, device, cl::queueproperties::profiling }; Context létrehozáshoz tulajdonság tömb kell (kulcs-érték pár) Minimálisan azt az egyet mondjuk meg, melyik platformhoz tartozik cl_platform_id (pointer típus) castolunk egy másik pointer típusra Más API-kkal lehet itt beszélgetni (OpenGL interop, lásd később) Kb. az egyetlen valid használata a reinterpret_castnak Parancslista létrehozásánál nincs ilyen voodoo
60 Kernel kód betöltés és fordítás // Load program source std::ifstream source_file{ kernel_location }; if (!source_file.is_open()) throw std::runtime_error{ std::string{"cannot open source: "} + location }; // Create program and kernel cl::program prog{ context, std::string{ std::istreambuf_iterator<char>{ source_file }, std::istreambuf_iterator<char>{} } }; prog.build({ device }, "-cl-std=cl1.0"); // Simplest kernel syntax auto vecadd = cl::kernelfunctor<cl_double, cl::buffer, cl::buffer>(prog, "vecadd"); Futásidőben betöltjük a forrásfájlt és lefordítjuk a kiválasztott eszközre. Típusbiztos függvény objektumot hozunk létre (funktor).
61 Gazda oldali memória allokáció // Init computation const std::size_t chainlength = std::size_t(std::pow(2u, 20u)); // 1M, cast denotes floating-to-integral conversion, // promises no data is lost, silences compiler warning std::valarray<cl_double> vec_x( chainlength ), vec_y( chainlength ); cl_double a = 2.0; Foglaljunk le két 1 millió elemű tömböt (vélhetően memória szemét kezdeti értékekkel) A típus sejteti, hogy ezekkel valami huncutságot fogunk csinláni Saxpy nagyvektor műveletet y = a x + b Jegyezzük meg, hogy API-specifikus típust használunk Ha egy adott API-val dolgozunk, tanácsos annak a típusait használni
62 Gazda oldali memória inicializálása // Fill arrays with random values between 0 and 100 auto prng = [engine = std::default_random_engine{}, dist = std::uniform_real_distribution<cl_double>{-100.0, }]() mutable { return dist(engine); }; std::generate_n(std::begin(vec_x), chainlength, prng); std::generate_n(std::begin(vec_y), chainlength, prng); Az STL véletlen generátorait használjuk: Kell egy eloszlás, amiből véletlen mintát szeretnénk Kell egy véletlen bit sorozatot előállító forrás (engine) Az egyiket odaadjuk a másiknak és kész! Ha egy lambda módosíthatja a saját állapotát, azt jelezni kell Véletlen számokkal tömböt feltölteni? Algoritmusok!
63 Eszköz oldali memória allokáció/init cl::buffer buf_x{ context, std::begin(vec_x), std::end(vec_x), true }, buf_y{ context, std::begin(vec_x), std::end(vec_x), false }; // Explicit (blocking) dispatch of data before launch cl::copy(queue, std::cbegin(vec_x), std::cend(vec_x), buf_x); cl::copy(queue, std::cbegin(vec_x), std::cend(vec_x), buf_y); OpenCL bufferek létrehozása az adatmozgatás leírásához A buffer NEM egy adott eszközön lefoglalt folytonos memóriát jelent Eszközről eszközre (és gazda oldalra költözhet) Az API leköveti hol írták utoljára, kinek van meg a legutóbbi verziója Lusta adatmozgatás, de lehet expliciten is (ahogy azt tesszük itt) Context és forrás adat meghatározás, mozgatás
64 Eszköz oldali számolás // Launch kernels cl::event kernel_event{ vecadd(cl::enqueueargs{ queue, cl::ndrange{ chainlength } }, a, buf_x, buf_y) }; kernel_event.wait(); std::cout << "Device (kernel) execution took: << util::get_duration<cl_profiling_command_start, CL_PROFILING_COMMAND_END, std::chrono::microseconds>(kernel_event).count() << " us." << std::endl; Berakunk chainlength darab számú vecadd invokációt az adott parancslistába adott paraméterekkel Típus ellenőrzés történik, hogy helyesen paraméterezünk-e Megvárjuk, míg a számolás befejeződik
65 Időméréshez kis segítség template <cl_int From, cl_int To, typename Dur = std::chrono::nanoseconds> auto get_duration(cl::event& ev) { return std::chrono::duration_cast<dur>(std::chrono::nanoseconds{ ev.getprofilinginfo<to>() - ev.getprofilinginfo<from>() }); } Egy bejövő OpenCL esemény két adott állapota között eltelt időt adja vissza STL kompatibilis formában Visszatérési érték függ a bemenettől, inkább elhagyjuk Az OpenCL API alapból nanoszekundumokban mér, így ezt választjuk alapértelmezett idő mértéknek.
66 Referencia számolás // Compute validation set on host auto start = std::chrono::high_resolution_clock::now(); std::valarray<cl_double> ref = a * vec_x + vec_y; auto finish = std::chrono::high_resolution_clock::now(); std::cout << "Host (validation) execution took: " << std::chrono::duration_cast<std::chrono::microseconds>(finish - start).count() << " us." << std::endl; Referencia számolás egy sor Időmérés STL időzítőkkel történik
67 Validáció // (Blocking) fetch of results cl::copy(queue, buf_y, std::begin(vec_y), std::end(vec_y)); // Validate (compute saxpy on host and match results) auto markers = std::mismatch(std::cbegin(vec_y), std::cend(vec_y), std::cbegin(ref), std::cend(ref)); if (markers.first!= std::cend(vec_y) markers.second!= std::cend(ref)) throw std::runtime_error{ "Validation failed." }; Visszakérjük az eredményt az eszközről gazda oldali memóriába Megkeressük páronként az első olyan helyet, ahol az eredmény tömb eltér a referencia tömbtől Ha ezek a helyek külön-külön nem esnek egybe a tömbök utolsó utáni elemével (STL konvenció a nem talált -ra): kivétel.
68 Algoritmus könyvtárak Magasabb rendű függvények, mint építőkockák
69 Alacsonyan fekvő gyümölcsök A legtöbb GPGPU API-ba vagy be vannak építve a leggyakrabban használt algoritmus primitívek, vagy készül hozzájuk könyvtár Ezek mind valamelyik API-ra támaszkodnak a végrehajtás szintjén Megöröklik az alatta lévő API összes korlátozását (OS, HW, stb.) A nagyon egyszerű feladatok pillanatok alatt megoldhatók A bonyolultabbak sajnos szinte lehetetlenek (nem törvényszerű!)
70 Thrust CUDA sablon algoritmus könyvtár Kényelmesen interfészelhető az STL-lel magával Mivel a CUDA-ra támaszkodik, ezért Csak Nvidia hardverrel használható Csak nvcc fordítóval fordítható Legstabilabb, flexibilis környezet
71 Thrust const float a = 2.0f; thrust::device_array<float> x(size); thrust::device_array<float> y(size); thrust::sequence(x.begin(), x.end()); thrust::sequence(y.begin(), y.end()); thrust::transform(x.begin(), x.end(), y.begin(), y.begin(), host device [=]( const float& x, const float& y ) { return a * x + y; } );
72 C++AMP Algorithms Library C++AMP sablon algoritmus könyvtár Kényelmesen interfészelhető az STL-lel magával Mivel az AMP-ra támaszkodik, ezért Csak AMP-kompatibilis fordítóval fordítható Cserébe bárhol, bármin futtatható Béta verzió, cserébe open-source
73 C++AMP Algorithms Library const float a = 2.0f; concurrency::array<float> x(size); concurrency::array<float> y(size); array_view<float> x_av(x); array_view<float> y_av(y); amp_stl_algorithms::iota(begin(x_av), end(x_av), 1.0f); amp_stl_algorithms::iota(begin(y_av), end(y_av), 1.0f); amp_stl_algorithms::transform(begin(x_av), end(x_av), begin(y_av), begin(y_av), [=]( const float& x, const float& y ) restrict(amp,cpu) { return a * x + y; } );
74 Bolt Template Library C++ sablon algoritmus könyvtár Kényelmesen interfészelhető az STL-lel magával Több implementációra támaszkodik egyszerre Intel Thread Building Blocks közönséges CPU-ra OpenCL CPU/GPU-ra egyaránt Az interfésze magán hordozza az implementációk közös nevezőjét Open-source
75 Bolt Template Library BOLT_FUNCTOR(saxpy_functor, struct saxpy_functor { const float a; saxpy_functor(float _a) : a(_a) {} }; ); float operator()(const float& x, const float& y) const { return a * x + y; }
76 Bolt Template Library const float a = 2.0f; bolt::cl::device_vector<float> x(size); bolt::cl::device_vector<float> y(size); std::iota(x.begin(), x.end(), 1.0f); std::iota(y.begin(), y.end(), 1.0f); bolt::cl::transform(x.begin(), x.end(), y.begin(), y.begin(), saxpy_functor(a));
OpenCL - The open standard for parallel programming of heterogeneous systems
OpenCL - The open standard for parallel programming of heterogeneous systems GPU-k általános számításokhoz GPU Graphics Processing Unit Képalkotás: sok, általában egyszerű és független művelet < 2006:
Grafikus csővezeték 1 / 44
Grafikus csővezeték 1 / 44 Grafikus csővezeték Vertex feldolgozás A vertexek egyenként a képernyő térbe vannak transzformálva Primitív feldolgozás A vertexek primitívekbe vannak szervezve Raszterizálás
Adat- és feladat párhuzamos modell Az ISO C99 szabvány részhalmaza
Adat- és feladat párhuzamos modell Az ISO C99 szabvány részhalmaza párhuzamos kiegészítésekkel Numerikus műveletek az IEEE754 alapján Beágyazott és mobil eszközök támogatása OpenGL, OpenGL ES adatcsere
Google Summer of Code OpenCL image support for the r600g driver
Google Summer of Code 2015 OpenCL image support for the r600g driver Képek: http://www.google-melange.com a Min szeretnék dolgozni? Kapcsolatfelvétel a mentorral Project proposal Célok Miért jó ez? Milestone-ok
OpenCL alapú eszközök verifikációja és validációja a gyakorlatban
OpenCL alapú eszközök verifikációja és validációja a gyakorlatban Fekete Tamás 2015. December 3. Szoftver verifikáció és validáció tantárgy Áttekintés Miért és mennyire fontos a megfelelő validáció és
GPGPU programozás lehetőségei. Nagy Máté Ferenc Budapest ALICE ELTE TTK Fizika MSc 2011 e-science Café
GPGPU programozás lehetőségei Nagy Máté Ferenc Budapest ALICE ELTE TTK Fizika MSc 2011 e-science Café Vázlat Egy, (kettő,) sok. Bevezetés a sokszálas univerzumba. A párhuzamosok a végtelenben találkoznak,
GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási
GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási GPGPU-k és programozásuk írta Dezső, Sima és Sándor, Szénási Szerzői jog 2013 Typotex Kivonat A processzor technika alkalmazásának fejlődése terén napjaink
A CUDA előnyei: - Elszórt memória olvasás (az adatok a memória bármely területéről olvashatóak) PC-Vilag.hu CUDA, a jövő technológiája?!
A CUDA (Compute Unified Device Architecture) egy párhuzamos számításokat használó architektúra, amelyet az NVIDIA fejlesztett ki. A CUDA valójában egy számoló egység az NVIDIA GPU-n (Graphic Processing
Számítógépek felépítése
Számítógépek felépítése Emil Vatai 2014-2015 Emil Vatai Számítógépek felépítése 2014-2015 1 / 14 Outline 1 Alap fogalmak Bit, Byte, Word 2 Számítógép részei A processzor részei Processzor architektúrák
GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai
GPGPU alapok GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai Szenasi.sandor@nik.uni-obuda.hu GPGPU alapok GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai Szenasi.sandor@nik.uni-obuda.hu
GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc
14. fejezet OpenCL textúra használat Grafikus Processzorok Tudományos Célú Programozása Textúrák A textúrák 1, 2, vagy 3D-s tömbök kifejezetten szín információk tárolására Főbb különbségek a bufferekhez
Készítette: Trosztel Mátyás Konzulens: Hajós Gergely
Készítette: Trosztel Mátyás Konzulens: Hajós Gergely Monte Carlo Markov Chain MCMC során egy megfelelően konstruált Markov-lánc segítségével mintákat generálunk. Ezek eloszlása követi a céleloszlást. A
GPGPU. GPU-k felépítése. Valasek Gábor
GPGPU GPU-k felépítése Valasek Gábor Tartalom A mai órán áttekintjük a GPU-k architekturális felépítését A cél elsősorban egy olyan absztrakt hardvermodell bemutatása, ami segít megérteni a GPU-k hardveres
Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:
Hasznos weboldalak Videókártya - CUDA kompatibilitás: https://developer.nvidia.com/cuda-gpus CUDA weboldal: https://developer.nvidia.com/cuda-zone Példaterületek: http://www.nvidia.com/object/imaging_comp
Diplomamunka. Miskolci Egyetem. GPGPU technológia kriptográfiai alkalmazása. Készítette: Csikó Richárd VIJFZK mérnök informatikus
Diplomamunka Miskolci Egyetem GPGPU technológia kriptográfiai alkalmazása Készítette: Csikó Richárd VIJFZK mérnök informatikus Témavezető: Dr. Kovács László Miskolc, 2014 Köszönetnyilvánítás Ezúton szeretnék
Párhuzamos és Grid rendszerek
Párhuzamos és Grid rendszerek (10. ea) GPGPU Szeberényi Imre BME IIT Az ábrák egy része az NVIDIA oktató anyagaiból és dokumentációiból származik. Párhuzamos és Grid rendszerek BME-IIT
Szoftvertechnológia alapjai Java előadások
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz e-mail: fandrew@mit.bme.hu tárgy honlap: http://home.mit.bme.hu/~fandrew/szofttech_hu.html A mai előadás tartalma: Miért pont Java?
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
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
OpenCL modul 2. óra: Első rész
OpenCL modul 2. óra: Első rész OpenCL API fontos eljárások 3 Példaprojekt Üres Lekérdezések OpenGL / OpenCL együttműködés Hasznos linkek http://www.khronos.org/registry/cl/sdk/1.1/docs/man/ xhtml/ Webes
C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.
Programozási Nyelvek és Fordítóprogramok Tanszék Programozási Nyelvek I. Témák 1 Bevezetés 2 A C++ alapfilozófiája 3 Névterek/namespace-ek 4 Függvények 5 Referenciák C++-ban Motiváció A C és a C++ nyelv
Eichhardt Iván GPGPU óra anyagai
OpenCL modul 1. óra Eichhardt Iván iffan@caesar.elte.hu GPGPU óra anyagai http://cg.inf.elte.hu/~gpgpu/ OpenCL API és alkalmazása Gyakorlati példák (C/C++) Pl.: Képfeldolgozás Párhuzamos tervezési minták
GPU alkalmazása az ALICE eseménygenerátorában
GPU alkalmazása az ALICE eseménygenerátorában Nagy Máté Ferenc MTA KFKI RMKI ALICE csoport ELTE TTK Fizika MSc Témavezető: Dr. Barnaföldi Gergely Gábor MTA KFKI RMKI ALICE csoport Elméleti Fizikai Főosztály
Mintavételes szabályozás mikrovezérlő segítségével
Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés
Eichhardt Iván GPGPU óra anyagai
OpenCL modul 1. óra Eichhardt Iván iffan@caesar.elte.hu GPGPU óra anyagai http://cg.inf.elte.hu/~gpgpu/ OpenCL API és alkalmazása Gyakorlati példák (C/C++) Pl.: Képfeldolgozás Párhuzamos programozás elméleti
C++ Standard Template Library (STL)
Programozási Nyelvek és Fordítóprogramok Tanszék Programozási Nyelvek I. Témák 1 STL alapok 2 STL fogalmak 3 Konténerek 4 Iterátorok 5 Funktorok C++ STL Ne fedezzük fel újra spanyolviaszt! Sok adatszerkezet/algoritmus
Autóipari beágyazott rendszerek. Komponens és rendszer integráció
Autóipari beágyazott rendszerek és rendszer integráció 1 Magas szintű fejlesztési folyamat SW architektúra modellezés Modell (VFB) Magas szintű modellezés komponensek portok interfészek adattípusok meghatározása
Kivételek, kivételkezelés a C++ nyelvben
2009. Kivételek, kivételkezelés a C++ nyelvben Haladó C++ programozás Kurucz Attila ELTE - IK 2009.06.09. Tartalomjegyzék Tartalomjegyzék... 2 Mi a kivételkezelés?... 3 Alapfogalmak... 3 Kivétel... 3 Try
4. Funkcionális primitívek GPUn
4. Funkcionális primitívek GPUn GPU API emlékeztető Jelenleg a következő eszközök állnak rendelkezésre GPUs kódok futtatására: DirectX vagy OpenGL vagy Vulkan Compute Shader Ez grafikai célokra van kitalálva,
Magas szintű optimalizálás
Magas szintű optimalizálás Soros kód párhuzamosítása Mennyi a várható teljesítmény növekedés? Erős skálázódás (Amdahl törvény) Mennyire lineáris a skálázódás a párhuzamosítás növelésével? S 1 P 1 P N GPGPU
Programozás II. 2. Dr. Iványi Péter
Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c
Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT
BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT Eddig Tetszőleges
Felhasználó által definiált adattípus
Felhasználó által definiált adattípus C++ Izsó Tamás 2017. február 24. Izsó Tamás Felhasználó által definiált adattípus/ 1 Irodalom Izsó Tamás Felhasználó által definiált adattípus/ 2 Programtervezési
AliROOT szimulációk GPU alapokon
AliROOT szimulációk GPU alapokon Nagy Máté Ferenc & Barnaföldi Gergely Gábor Wigner FK ALICE Bp csoport OTKA: PD73596 és NK77816 TARTALOM 1. Az ALICE csoport és a GRID hálózat 2. Szimulációk és az AliROOT
Digitális technika VIMIAA01 9. hét
BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT Eddig Tetszőleges
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Tömbök (3. rész) Konstansok Kivételkezelés Tömbök 3. Többdimenziós tömbök Többdimenziós tömbök int a; Többdimenziós tömbök int a[5]; Többdimenziós tömbök
Az MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI
Az MTA Cloud a tudományos alkalmazások támogatására Kacsuk Péter MTA SZTAKI Kacsuk.Peter@sztaki.mta.hu Tudományos alkalmazások és skálázhatóság Kétféle skálázhatóság: o Vertikális: dinamikusan változik
Haladó Grafika EA. Inkrementális képszintézis GPU-n
Haladó Grafika EA Inkrementális képszintézis GPU-n Pipeline Az elvégzendő feladatot részfeladatokra bontjuk Mindegyik részfeladatot más-más egység dolgozza fel (ideális esetben) Minden egység inputja,
C++ programok fordítása
C++, 1/ 33 C++ programok fordítása Pataki Norbert 2012. február 24. C++, 2/ 33 Információk Pataki Norbert, patakino@elte.hu http://patakino.web.elte.hu/levelezo Jegy: gyakorlat, Szűgyi Zalán C++, 3/ 33
Grafikus csővezeték 2 / 77
Bevezetés 1 / 77 Grafikus csővezeték 2 / 77 Grafikus csővezeték Vertex feldolgozás A vertexek egyenként a képernyő térbe vannak transzformálva Primitív feldolgozás A vertexek primitívekbe vannak szervezve
Párhuzamos programozási platformok
Párhuzamos programozási platformok Parallel számítógép részei Hardver Több processzor Több memória Kapcsolatot biztosító hálózat Rendszer szoftver Párhuzamos operációs rendszer Konkurenciát biztosító programozási
1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon
1. Template (sablon) 1.1. Függvénysablon Maximum függvény megvalósítása függvénynév túlterheléssel. i n l i n e f l o a t Max ( f l o a t a, f l o a t b ) { return a>b? a : b ; i n l i n e double Max (
1. Alapok. Programozás II
1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph
Párhuzamos programozási platformok
Párhuzamos programozási platformok Parallel számítógép részei Hardver Több processzor Több memória Kapcsolatot biztosító hálózat Rendszer szoftver Párhuzamos operációs rendszer Konkurenciát biztosító programozási
Programozási nyelvek (ADA)
Programozási nyelvek (ADA) Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 1. előadás Hasznos weboldal http://kto.web.elte.hu Program felépítése Programegységek (program unit) eljárások (procedure)
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Folyamok kezelése Fájlok írása/olvasása Folyamok kezelése Szabvány folyamok Eddig Kiírás a szöveges konzolra:
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?
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? 3. Ismertesse a névtér fogalmát! 4. Mit értünk a "változó hatóköre"
Programozási nyelvek JAVA EA+GY 1. gyakolat
Programozási nyelvek JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2018/2019. tavaszi félév Tartalom 1 A Java alapjai 2 Java program
Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok
Bevezetés a programozásba II 8. Előadás: Osztályok, objektumok, osztályszintű metódusok vektor.h #ifndef VEKTOR_H #define VEKTOR_H class Vektor { int meret, *mut; public: Vektor(int meret); int szamlal(int
Informatika terméktervezőknek
Informatika terméktervezőknek C# alapok Névterület (namespace) using Osztály (class) és Obejtumok Metódus (function, procedure, method) main() static void string[] arg Szintaxis // /* */ \n \t Névadások
Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar
Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit
1.AA MEGOLDÓ BERCI AA 1.
Programozás alapjai 2. (inf.) 2. zárthelyi 2015.05.07. gyak./lab. hiányzás: 3/2 Minden beadandó megoldását a feladatlapra, a feladat után írja! Készíthet piszkozatot, de csak a feladatlapra írt megoldásokat
Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem
Tanács Attila Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem Direct3D, DirectX o Csak Microsoft platformon OpenGL o Silicon Graphics: IRIS GL (zárt kód) o OpenGL (1992) o Nyílt
Bevezetés a programozásba 2
Bevezetés a programozásba 2 7. Előadás: STL konténerek, sablonok http://digitus.itk.ppke.hu/~flugi/ Vector int int main() { vector v(10); int int sum=0; for for (int i=0;i
117. AA Megoldó Alfréd AA 117.
Programozás alapjai 2. (inf.) pót-pótzárthelyi 2011.05.26. gyak. hiányzás: kzhpont: MEG123 IB.028/117. NZH:0 PZH:n Minden beadandó megoldását a feladatlapra, a feladat után írja! A megoldások során feltételezheti,
Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r
Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. április 4. Számok rendezése Feladat: Fejlesszük tovább úgy a buborék rendez algoritmust bemutató példát, hogy a felhasználó adhassa meg a
2011.11.29. JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése
Tartalom Integrált fejlesztés Java platformon JUnit JUnit használata Tesztelési technikák Demo 2 A specifikáció alapján teszteljük a program egyes részeit, klasszikus V-modell szerint Minden olyan metódust,
ISA szimulátor objektum-orientált modell (C++)
Budapesti Műszaki és Gazdaságtudományi Egyetem ISA szimulátor objektum-orientált modell (C++) Horváth Péter Elektronikus Eszközök Tanszéke 2015. február 12. Horváth Péter ISA szimulátor objektum-orientált
Szövegek C++ -ban, a string osztály
Szövegek C++ -ban, a string osztály A string osztály a Szabványos C++ könyvtár (Standard Template Library) része és bár az objektum-orientált programozásról, az osztályokról, csak később esik szó, a string
3. Osztályok II. Programozás II
3. Osztályok II. Programozás II Bevezető feladat Írj egy Nevsor osztályt, amely legfeljebb adott mennyiségű nevet képes eltárolni. A maximálisan tárolható nevek számát a konstruktorban adjuk meg. Az osztályt
HLSL programozás. Grafikus játékok fejlesztése Szécsi László t06-hlsl
HLSL programozás Grafikus játékok fejlesztése Szécsi László 2013.02.16. t06-hlsl RESOURCES PIPELINE STAGES RENDER STATES Vertex buffer Instance buffer Constant buffers and textures Index buffer Constant
STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1
STL gyakorlat C++ Izsó Tamás 2016. május 9. Izsó Tamás STL gyakorlat/ 1 Komponensek kapcsolata Deklarálja az alábbi osztálydiagramon szereplő osztályok közül az A, AA és AB osztályokat! A konstruktorokat
GPGPU: Általános célú grafikus processzorok cgpu: computational GPU GPGPU = cgpu Adatpárhuzamos gyorsító: dedikált eszköz, ami eleve csak erre
GPGPU: Általános célú grafikus processzorok cgpu: computational GPU GPGPU = cgpu Adatpárhuzamos gyorsító: dedikált eszköz, ami eleve csak erre szolgál. Nagyobb memória+grafika nélkül (nincs kijelzőre kimenet)
Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés
Bevezetés a programozásba 2 7. Előadás: Objektumszű és osztályszű elemek, hibakezelés ISMÉTLÉS Osztály class Particle { public: Particle( X, X, Y); virtual void mozog( ); ); virtual void rajzol( ) const;
C programozási nyelv
C programozási nyelv Előfeldolgozó utasítások Dr Schuster György 2011 május 3 Dr Schuster György () C programozási nyelv Előfeldolgozó utasítások 2011 május 3 1 / 15 A fordítás menete Dr Schuster György
Bevezetés a programozásba Előadás: A const
Bevezetés a programozásba 2 6. Előadás: A const ISMÉTLÉS Interface - Implementation struct Particle { int x,y; unsigned char r,g,b; void rajzol(); }; }; void Particle::rajzol() { gout
Bevezetés a programozásba I.
Bevezetés a programozásba I. 6. gyakorlat C++ alapok, szövegkezelés Surányi Márton PPKE-ITK 2010.10.12. Forrásfájlok: *.cpp fájlok Fordítás: a folyamat, amikor a forrásfájlból futtatható állományt állítunk
Megoldás. Feladat 1. Statikus teszt Specifikáció felülvizsgálat
Megoldás Feladat 1. Statikus teszt Specifikáció felülvizsgálat A feladatban szereplő specifikáció eredeti, angol nyelvű változata egy létező eszköz leírása. Nem állítjuk, hogy az eredeti dokumentum jól
OpenGL Compute Shader-ek. Valasek Gábor
OpenGL Compute Shader-ek Valasek Gábor Compute shader OpenGL 4.3 óta része a Core specifikációnak Speciális shaderek, amikben a szokásos GLSL parancsok (és néhány új) segítségével általános számítási feladatokat
Utolsó módosítás:
Utolsó módosítás: 2012. 09. 06. 1 A tantárggyal kapcsolatos adminisztratív kérdésekkel Micskei Zoltánt keressétek. 2 3 4 5 6 7 8 9 Forrás: Gartner Hype Cycle for Virtualization, 2010, http://premierit.intel.com/docs/doc-5768
Grafikus csővezeték és az OpenGL függvénykönyvtár
Grafikus csővezeték és az OpenGL függvénykönyvtár 1 / 32 A grafikus csővezeték 3D-s színtér objektumainak leírása primitívekkel: pontok, élek, poligonok. Primitívek szögpontjait vertexeknek nevezzük Adott
Parciális rekonfiguráció Heterogán számítási rendszerek VIMIMA15
BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Parciális rekonfiguráció Heterogán számítási rendszerek VIMIMA15 Fehér
8. gyakorlat Pointerek, dinamikus memóriakezelés
8. gyakorlat Pointerek, dinamikus memóriakezelés Házi ellenőrzés Egy számtani sorozat első két tagja A1 és A2. Számítsa ki a sorozat N- dik tagját! (f0051) Egy mértani sorozat első két tagja A1 és A2.
Transzformációk. Szécsi László
Transzformációk Szécsi László A feladat Adott a 3D modell háromszögek csúcspontjai [modellezési koordináták] Háromszögkitöltő algoritmus pixeleket színez be [viewport koordináták] A feladat: számítsuk
1. Bevezetés A C++ nem objektumorientált újdonságai 3
Előszó xiii 1. Bevezetés 1 2. A C++ nem objektumorientált újdonságai 3 2.1. A C és a C++ nyelv 3 2.1.1. Függvényparaméterek és visszatérési érték 3 2.1.2. A main függvény 4 2.1.3. A bool típus 4 2.1.4.
SZÁMÍTÓGÉP ARCHITEKTÚRÁK
SZÁMÍTÓGÉP ARCHITEKTÚRÁK Az utasítás-pipeline szélesítése Horváth Gábor, Belső Zoltán BME Hálózati Rendszerek és Szolgáltatások Tanszék ghorvath@hit.bme.hu, belso@hit.bme.hu Budapest, 2018-05-19 1 UTASÍTÁSFELDOLGOZÁS
Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók
Haskell 1. Alapok tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók elég jól elkerülhetők így a mellékhatások könnyebben
Programozás C++ -ban
8. Dinamikus objektumok Programozás C++ -ban Ahhoz hogy általános prolémákat is meg tudjunk oldani, szükség van arra, hogy dinamikusan hozhassunk létre vagy szüntethessünk meg objektumokat. A C programozási
Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN
Objektum Orientált Programozás 11. Kivételkezelés 44/1B IT MAN B IT v: 2016.05.03 MAN Pici elmélet A Java kivételkezelésének célja a programfutás során keletkezett hibák kiszűrése és megfelelő kezelése.
Transzformációk. Grafikus játékok fejlesztése Szécsi László 2013.02.26. t05-transform
Transzformációk Grafikus játékok fejlesztése Szécsi László 2013.02.26. t05-transform Koordinátarendszerek: modelltér Koordinátarendszerek: világtér Koordinátarendszerek: kameratér up right z eye ahead
Számítógépes grafika
Számítógépes grafika XX. rész A GPU programozása a GLSL nyelv Az OpenGL árnyaló nyelve a GLSL (OpenGL Shading Language), amely segítségével vertex- és pixel- (fragment) shaderek által programozhatjuk a
Labor gyakorlat Mikrovezérlők
Labor gyakorlat Mikrovezérlők ATMEL AVR ARDUINO 1. ELŐADÁS BUDAI TAMÁS 2015. 09. 06. Tartalom Labor 2 mikrovezérlők modul 2 alkalom 1 mikrovezérlők felépítése, elmélet 2 programozás, mintaprogramok Értékelés:
Fejlett programozási nyelvek C++ Iterátorok
Fejlett programozási nyelvek C++ Iterátorok 10. előadás Antal Margit 2009 slide 1 Témakörök I. Bevezetés II. Iterátor definíció III. Iterátorok jellemzői IV. Iterátorkategóriák V. Iterátor adapterek slide
Clang Static Analyzer belülről
Clang Static Analyzer belülről Nagy Donát 2015. október 6. Áttekintés 1 Clang Static Analyzer kívülről 2 A statikus elemzés folyamata 3 Az eszköz felépítése 4 Egy checker felépítése Rövid definíciók Clang
Labor gyakorlat Mikrovezérlők
Labor gyakorlat Mikrovezérlők ATMEL AVR ARDUINO 1. ELŐADÁS BUDAI TAMÁS Tartalom Labor 2 mikrovezérlők modul 2 alkalom 1 mikrovezérlők felépítése, elmélet 2 programozás, mintaprogramok Értékelés: a 2. alkalom
Konkurens TCP Szerver
A gyakorlat célja: Konkurens TCP Szerver Megismerkedni a párhuzamos programozás és a konkurens TCP szerver készítésének az elméleti és gyakorlati alapjaival és egy egyidejűleg több klienst is kiszolgáló
GPGPU. Architektúra esettanulmány
GPGPU Architektúra esettanulmány GeForce 7800 (2006) GeForce 7800 Rengeteg erőforrást fordítottak arra, hogy a throughput-ot maximalizálják Azaz a különböző típusú feldolgozóegységek (vertex és fragment
Bevezetés a párhuzamos programozási koncepciókba
Bevezetés a párhuzamos programozási koncepciókba Kacsuk Péter és Dózsa Gábor MTA SZTAKI Párhuzamos és Elosztott Rendszerek Laboratórium E-mail: kacsuk@sztaki.hu Web: www.lpds.sztaki.hu Programozási modellek
Programozási Nyelvek: C++
Programozási Nyelvek: C++ Gyakorló feladatkönyv Umann Kristóf #include "CppStudent.h" int main() { CppStudent *reader = new CppStudent(); reader->readbook(); while(!reader->doesunderstand()) { reader->exercise();
1000.AA Megoldo Alfréd 1000.A
Programozás alapjai 2. (inf.) 2. PZH 2018.05.22. hiányzás:0+3 L4-R4P ZH: 27,5+26 ABCDEF IB.028/100. Sum:0 e:19 Minden beadandó megoldását a feladatlapra, a feladat után írja! Készíthet piszkozatot, de
ARM Cortex magú mikrovezérlők. mbed
ARM Cortex magú mikrovezérlők mbed Scherer Balázs Budapest University of Technology and Economics Department of Measurement and Information Systems BME-MIT 2016 MBED webes fejlesztőkörnyezet 2009-ben megjelent
Programozási nyelvek Java
Programozási nyelvek Java Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 13. előadás Throwable Error Exception RuntimeException IOException Saját (általában) Nem ellenörzött kivételek (Unchecked
Programozás II. 4. Dr. Iványi Péter
Programozás II. 4. Dr. Iványi Péter 1 inline függvények Bizonyos függvények annyira rövidek, hogy nem biztos hogy a fordító függvényhívást fordít, hanem inkább az adott sorba beilleszti a kódot. #include
Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };
A C++ kódokban lévő makrókat melyik egység dolgozza fel az alábbiak közül? preprocessor A szabványos C++-ban nem is írhatunk makrókat (csak C-ben) assembler linker Az alábbi példában a Foo f(5); konstruktor
Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek
Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő
Ismerkedjünk tovább a számítógéppel. Alaplap és a processzeor
Ismerkedjünk tovább a számítógéppel Alaplap és a processzeor Neumann-elvű számítógépek főbb egységei A részek feladatai: Központi egység: Feladata a számítógép vezérlése, és a számítások elvégzése. Operatív
elektronikus adattárolást memóriacím
MEMÓRIA Feladata A memória elektronikus adattárolást valósít meg. A számítógép csak olyan műveletek elvégzésére és csak olyan adatok feldolgozására képes, melyek a memóriájában vannak. Az információ tárolása
2D képszintézis. Szirmay-Kalos László
2D képszintézis Szirmay-Kalos László 2D képszintézis Modell szín (200, 200) Kép Kamera ablak (window) viewport Unit=pixel Saját színnel rajzolás Világ koordinátarendszer Pixel vezérelt megközelítés: Tartalmazás
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Az Integrált Fejlesztői Környezet C++ alapok Az Integrált Fejlesztői Környezet Visual Studio 2013 Community Edition Kitekintés: fordítás Preprocesszor Fordító
Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!
Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt! valós adatokat növekvő sorrendbe rendezi és egy sorba kiírja
Bevezetés a programozásba. 9. Előadás: Rekordok
Bevezetés a programozásba 9. Előadás: Rekordok ISMÉTLÉS Függvényhívás #include #include #include #include using using namespace namespace std; std; double double terulet(double