Adat- és feladat párhuzamos modell Az ISO C99 szabvány részhalmaza

Hasonló dokumentumok
Eichhardt Iván GPGPU óra anyagai

Eichhardt Iván GPGPU óra anyagai

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

GPGPU és számítások heterogén rendszereken

OpenCL - The open standard for parallel programming of heterogeneous systems

OpenCL modul 2. óra: Első rész

Google Summer of Code OpenCL image support for the r600g driver

Magas szintű optimalizálás

Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

Párhuzamos és Grid rendszerek

Java II. I A Java programozási nyelv alapelemei

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

Pénzügyi algoritmusok

Java II. I A Java programozási nyelv alapelemei

Grafikus csővezeték és az OpenGL függvénykönyvtár

Programozás II. 2. Dr. Iványi Péter

Programozás C++ -ban

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

Programozási Nyelvek: C++

Kivételkezelés a C++ nyelvben Bevezetés

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

Dr. Schuster György október 14.

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

OpenGL Compute Shader-ek. Valasek Gábor

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Memóriakezelés, dinamikus memóriakezelés

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

Adatbázisok* tulajdonságai

1. Alapok. Programozás II

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

(GP)GPU kezdetek. Avagy hogyan lesz az algoritmusból implementáció. Lectures on Modern Scientific Programming Wigner RCP November 2015.

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

SAT probléma kielégíthetőségének vizsgálata. masszív parallel. mesterséges neurális hálózat alkalmazásával

Pénzügyi algoritmusok

GPGPU. GPU-k felépítése. Valasek Gábor

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

RPC Remote Procedure Call Távoli eljárás hívás

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

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Matematikai alapok. Dr. Iványi Péter

117. AA Megoldó Alfréd AA 117.

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

Kivételek, kivételkezelés a C++ nyelvben

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

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Occam 1. Készítette: Szabó Éva

Információs Technológia

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Architektúra, megszakítási rendszerek

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

Matematikai alapok. Dr. Iványi Péter

GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

SZÁMÍTÓGÉP ARCHITEKTÚRÁK

Bevezetés, a C++ osztályok. Pere László

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

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Diplomamunka. Miskolci Egyetem. GPGPU technológia kriptográfiai alkalmazása. Készítette: Csikó Richárd VIJFZK mérnök informatikus

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Számítógépes grafika

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás C++ -ban

Bevezetés a programozásba Előadás: A const

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

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

ANDROID ALKALMAZÁSFEJLESZTÉS

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

Programozás C++ -ban 2007/4

GPGPU programozás lehetőségei. Nagy Máté Ferenc Budapest ALICE ELTE TTK Fizika MSc 2011 e-science Café

Programozás II. 4. Dr. Iványi Péter

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

Készítette: Nagy Tibor István

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

A mikroszámítógép felépítése.

Bánsághi Anna

Pénzügyi algoritmusok

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

The modular mitmót system. DPY kijelző kártya C API

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

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

Pénzügyi algoritmusok

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

C++ programok fordítása

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

Konkurens TCP Szerver

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Szoftvertechnológia alapjai Java előadások

Operációs rendszerek. UNIX fájlrendszer

C++ Standard Template Library (STL)

Maximum kiválasztás tömbben

CUDA haladó ismeretek

C# osztályok. Krizsán Zoltán

Átírás:

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 támogatás

Heterogén platform támogatás Párhuzamos CPU-k Grafikus hardver (GPU) Jelfeldolgozó processzorok (DSP) Cell/B.E. processzor

Az OpenCL elemei Platform modell Végrehajtási séma Memória modell Program modell

Hoszt eszköz OpenCL eszközök Hoszt Számító egységek (CU) Feldolgozó egységek (PE) SIMD (közös utasítás számláló) SPMD (saját utasítás számláló) PE CU OpenCL eszköz

Hoszt program Kontextus management Végrehajtás vezérlés Kernel program Számító egységek vezérlése

Kernel program Index tér (NDRange) Munkacsoportok (work-groups) Feladat egységek (work-items) Globális azonosító (global ID) Azonos program a munkacsoportban A vezérlés eltérhet egységenként

Kernel program Index tér (NDRange) Munkacsoportok (work-groups) Finomabb index felbontás Munkacsoport azonosító (work-group ID) A feladat egységeknek lokális azonosító (local ID) Feladat egységek (work-items)

Kernel program Index tér (NDRange) N dimenziós problématér (N=1,2,3) Minden cimke egyforma dimenziójú Címzések Globális címtér: (G x, G y ) Munkacsoport méret: (S x, S y ) Munkacsoport azonosító: (w x, w y ) Lokális azonosító: (s x,s y )

Azonosítók számítása Globális címtér: (G x, G y ) Munkacsoport méret: (S x, S y ) Munkacsoport azonosító: (w x, w y ) Lokális azonosító: (s x,s y ) Globális azonosító: Munkacsoportok száma: Lokális azonosító: ), ( ), ( y y y x x x y x s S w s S w g g ) /, / ( ), ( y y x x y x S G S G W W y y y x x x y x S s g S s g w w /, /,

NDRange Gy Azonosítók számítása Feladat egység Feladat egység Feladat egység Feladat egység Munkacsoport méret Sy NDRange Gx Munkacsoport méret Sx

Kontextus (context) Eszközök: OpenCL eszközök halmaza Kernelek: OpenCL függvények csoportja Program objektumok: Kernel forráskód Végrehajtható bináris reprezentáció Memória objektumok: A hoszt és OpenCL eszközök által használt memória A kernelek által látott értékek

Parancs sorok (command-queue) A hoszt által ellenörzött parancs folyam A kernelek végrehajtását vezérli Parancsok Kernel végrehajtás Memória műveletek Szinkronizáció

Parancs sor módok In-order végrehajtás A parancsok fifo módon hajtódnak végre Soros végrehajtása a parancs sornak Out-of-order végrehajtás A parancsok nem várják meg az előző befejeződését Explicit szinkronizáció szükséges

Kernel típusok OpenCL kernel OpenCL C függvények Az OpenCL eszközön futtathatóak Natív kernel A hoszton futó függvények A memória objektumokat megosztottan használhatja Opcionális

Négy használható memória régió Globális memória Írható/olvasható a feladat egységekből Bármely eleme elérhető bármelyik PE-ből A hoszt allokálja Konstans memória Olvasható a feladat egységekből A hoszt allokálja és tölti fel értékekkel A kernelben statikusan is definiálható

Négy használható memória régió Lokális memória A munkacsoport osztott memóriája Minden feladat egység írhatja/olvashatja a munkacsoportban A hoszt nem fér hozzá Privát memória A feladat egység saját írható/olvasható memória területe Csak az adott feladat egység látja A hoszt nem fér hozzá

OpenCL eszköz Számító egység Számító egység Privát mem Privát mem Privát mem Privát mem PE 1 PE M PE 1 PE M Lokális mem Lokális mem Globális/Konstans memória cache Globális memória Konstans memória

A globális memória területet a hoszt kezeli Memória foglalás Memória másolás Szinkron és aszinkron másolás Memória felszabadítás A globális memória leképezhető a hoszt memóriába

Relaxált konzisztencia Nincs garantált konzisztencia a feladat egységek között Feladat egységen konzisztens olvasás/írás Lokális memória Munkacsoporton konzisztens Globális memória Munkacsoporton konzisztens Munkacsoportok között nincs garantált konzisztencia Parancsok között szinkronizációval kényszeríthető ki

Adat párhuzamos modell Párhuzamos művelet halmaz Adat feladat egység összerendelés Nincs korlátozva egy-egy kapcsolatra Hierarchikus adat párhuzamosság Explicit felbontás Teljes probléma tér és felbontása munkacsoportokra Implicit felbontás Teljes probléma tér és automatikus felbontás

Feladat párhuzamos modell A kernel egyetlen példányban Index tértől független Műveletek vektor típusokon Több független feladat Natív kernel tetszőleges párhuzamosítással

Munkacsoport szinkronizáció A feladat egységek szinkronizációja work-group barrier blokkoló hívás minden egységnek a barrier-re kell futnia Munkacsoportok között nincs szinkronizáció

Parancs sor szinkronizáció command-queue barrier Garantálja a barrier előtti parancsok végrehajtódását A barrier utáni parancs számára konzisztens memóriát biztosít Parancs sorok között nincs szinkronizáció Várakozás eseményre Minden parancs generál egy eseményt ha végrehajtódott Egy parancs végrehajtását várakoztathatjuk egy esemény bekövetkeztéig

Skalár típusok bool unsigned char, char (8 bites egész) unsigned short, short (16 bites egész) unsigned int, int (32 bites egész) unsigned long, long (64 bites egész) float (IEEE754 lebegőpontos) half (16 bites float) size_t (sizeof operátor típusa 32/64 bites) ptrdiff_t (két pointer különbsége 32/64 bites) (u)intptr_t (pointer típus) void

Vektor típusok (u)charn (u)shortn (u)intn (u)longn floatn Az előjeles változat kettes komplemens Az u az előjel nélküliséget jelöli n lehet 2,4,8,16

Vektor komponensek Swizzle operátor (.xyzw) float4 f; f.xy; f.xxyy; Numerikus indexek (.s[0-9 a-f A-F]) float4 f; f.s12; float16; f.sabcde Felezés (.odd,.even,.lo,.hi) float4 f; f.hi; f.even.lo; float4 left, right; float8 interleaved; interleaved.even = left; interleaved.odd = right;

Konverziók típusok között Implicit konverzió Korlátozott mértékben használható Skalár típusok között Explicit konverzió Skalár vektor konverzió float4 f = (float4)1.0; Vektor típusok közötti konverzió desttypen convert_desttype_sat_roundingmode(sourcetypen) _sat - értékkészletre vágás _roundingmode kerekítés uchar4 u; int4 c = convert_int4(u);

Konverziók típusok között Azonos méretű típusok között as_typen() float f = 1.0f; uint u = as_uint(f); // 0x3f800000 lesz az értéke float4 f = (float4)(1.0f, 2.0f, 3.0f, 4.0f); int4 i = as_int4(f); // (0x3f800000, 0x40000000, 0x40400000, 0x40800000)

Memória terület jelölők global : globális memória global float4 color; local : lokális memória local float16 shared; contant : konstans memória constant float uniformdata; hoszt oldalról inicializálható private : privát memória private float8 workitemexclusive;

Függvény jelölők kernel : OpenCL függvény Csak OpenCL eszközön hajtható végre A hoszt program meghívhatja Más OpenCL kernel meghívhatja attribute : fordító segítő attribútumok vec_type_hint(typen) : vektor műveletek mérete A feladat egységek összevonhatóak a fordító álltal

Beépített függvények Feladat egység információk uint get_work_dim() size_t get_global_size(uint dimidx); size_t get_global_id(uint dimidx); size_t get_local_size(uint dimidx); size_t get_local_id(uint dimidx); size_t get_num_groups(uint dimidx); size_t get_group_id(uint dimidx);

Beépített függvények Matematikai függvények float, half, egész típusokon Általánosan használt függvények float típusokon Geometriai függvények float típusokon Összehasonlító függvények float típusokon pl. isequal(float, float) isfinite(float)

Beépített függvények Vektor betöltő függvények pointer vektor konverzió Vektor sorosító függvények vektor pointer konverzió

Beépített függvények Szinkronizációs függvények barrier(flag); CLK_LOCAL_MEM_FENCE : lokális memóriát konzisztensé teszi CLK_GLOBAL_MEM_FENCE : globális memóriát konzisztensé teszi mem_fence(flag); read_mem_fence(flag); write_mem_fence(flag);

Beépített függvények Aszinkron memória másolás Globális memóriából lokális memóriába Lokális memóriából globális memóriába event_t async_work_group_copy(...); wait_group_events(..., eventlist); Prefetch A globális memória egy részének előtöltése a cache-be

#include <iostream> #include <CL/opencl.h> #define DATA_SIZE (1024*1240) int main(int argc, char* argv[]){ cl_int err; size_t global; // globális problématér size_t local; // lokális problématér cl_platform_id platform; err = clgetplatformids(1, &platform, NULL); if(err!= CL_SUCCESS){ std::cerr << "Error: Failed to find a platform!" << std::endl; return EXIT_FAILURE; } //...

cl_device_id device_id; err = clgetdeviceids(platform, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL); if(err!= CL_SUCCESS){ std::cerr << "Error: Failed to create a device group!" << std::endl; return EXIT_FAILURE; } cl_context context; context = clcreatecontext(0, 1, &device_id, NULL, NULL, &err); if (!context) { std::cerr << "Error: Failed to create a compute context!" << std::endl; return EXIT_FAILURE; } cl_command_queue commands; commands = clcreatecommandqueue(context, device_id, 0, &err); if (!commands) { std::cerr << "Error: Failed to create a command commands!" << std::endl; return EXIT_FAILURE; } //...

cl_program program; program = clcreateprogramwithsource(context, 1, (const char **) &KernelSource, NULL, &err); if (!program) { std::cerr << "Error: Failed to create compute program!" << std::endl; return EXIT_FAILURE; } err = clbuildprogram(program, 0, NULL, NULL, NULL, NULL); if (err!= CL_SUCCESS) { size_t len; char buffer[2048]; } std::cerr << "Error: Failed to build program executable!" << std::endl; clgetprogrambuildinfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); std::cerr << buffer << std::endl; exit(1); //...

cl_kernel kernel; kernel = clcreatekernel(program, "square", &err); if (!kernel err!= CL_SUCCESS) { std::cerr << "Error: Failed to create compute kernel!" << std::endl; exit(1); } float* data = new float[data_size]; // bemenő adathalmaz float* results = new float[data_size]; // eredmény halmaz unsigned int correct; cl_mem input; // device memória a bemenetnek cl_mem output; // device memória az eredménynek // A bemenet véletlen számok halmaza unsigned int count = DATA_SIZE; for(int i = 0; i < count; i++){ data[i] = rand() / (float)rand_max; } //...

input = clcreatebuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL); output = clcreatebuffer(context, CL_MEM_WRITE_ONLY,sizeof(float) * count, NULL, NULL); if (!input!output) { std::cerr << "Error: Failed to allocate device memory!" << std::endl; exit(1); } // Bemenő adat másolása az eszköz globális memóriájába err = clenqueuewritebuffer(commands, input, CL_TRUE, 0, sizeof(float) * count, data, 0, NULL, NULL); if (err!= CL_SUCCESS) { std::cerr << "Error: Failed to write to source array!" << std::endl; exit(1); } //...

// Kernel paraméterek beállítása err = 0; err = clsetkernelarg(kernel, 0, sizeof(cl_mem), &input); err = clsetkernelarg(kernel, 1, sizeof(cl_mem), &output); err = clsetkernelarg(kernel, 2, sizeof(unsigned int), &count); if (err!= CL_SUCCESS) { std::cerr << "Error: Failed to set kernel arguments! " << err << std::endl; exit(1); } // Munkacsoport méret meghatározása err = clgetkernelworkgroupinfo(kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, NULL); if (err!= CL_SUCCESS) { std::cerr << "Error: Failed to retrieve kernel work group info! " << err << std::endl; exit(1); } //...

// Kernel indítása global = count; err = clenqueuendrangekernel(commands, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err) { std::cerr << "Error: Failed to execute kernel!" << std::endl; return EXIT_FAILURE; } // Az eredmény bevárása clfinish(commands); // Az eredmény visszaolvasása err = clenqueuereadbuffer( commands, output, CL_TRUE, 0, sizeof(float) * count, results, 0, NULL, NULL ); if (err!= CL_SUCCESS) { std::cerr << "Error: Failed to read output array! " << err << std::endl; exit(1); } //...

// Az eredmény ellenőrzése correct = 0; for(int i = 0; i < count; i++) { if(results[i] == data[i] * data[i]) correct++; } std::cout << "Computed " << correct << "/" << count << " correct values" << std::endl; std::cout << "Computed " << 100.f * (float)correct/(float)count << "% correct values" << std::endl; //...

// Takarítás delete [] data; delete [] results; clreleasememobject(input); clreleasememobject(output); clreleaseprogram(program); clreleasekernel(kernel); clreleasecommandqueue(commands); clreleasecontext(context); return 0; }

OpenCL kernel kernel void square( global float* input, global float* output, const unsigned int count){ int i = get_global_id(0); if(i < count){ output[i] = input[i] * input[i]; } }