 Map  Reduce  Scan  Histogram  Compact const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new.

Slides:



Advertisements
Hasonló előadás

Advertisements

 Folyékony anyagok  Füstszerű jelenségek  Felhők  Festékek.
2 8 Kiadás éve / Platform Server (1000’s of users) Workgroup (Dozens of users) Desktop (Single User) Laptop Tablet PC Windows CE.
3D képszintézis fizikai alapmodellje
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Bevezetés a tárgyakhoz Tárgyak  Objects are the containers for values of a specified type  Objects are either signals, variables or constants  Once.
 Lineáris egyenlet  algebrai egyenlet  konstansok és első fokú ismeretlenek  pl.: egyenes egyenlete  Lineáris egyenletrendszer  lineáris egyenletek.
 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.
 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC.
 Bővítmény rendszer  Az OpenGL bővítményeihez hasonló  A specifikiáció természetes fejlődése ▪ Gyártó specifikus bővítmény ▪ Általános bővítmények.
 Gauss szűrő uniform sampler2D colorMap; const float kernel[9] = float[9]( 1.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 2.0, 1.0); out vec4 outColor; void main(){
 Fény fotonok szimulációja  Nem változtatja meg a frekvenciát ütközéskor  Homogén és inhomogén közegben.
Socket programozás Példák
Hadoop Gyakorlat 1 Korszerű adatbázisok Parancsok Listázás – hadoop fs –ls Kiírja egy fájl tartalmát – hadoop fs –cat Betöltés – hadoop fs –put.
TRANZIENS ADATTÁROLÁS State objektum Egy alkalmazásszintű gyűjtemény (Dictionary), mely Tombstone esetén megőrzi tartalmát a memóriában kulcs/érték párokként.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
Borland C/C++ mintapéldák
Course Situation and Event Driven Models for Multilevel Abstraction Based Virtual Engineering Spaces Óbuda University John von Neumann Faculty of Informatics.
Oracle multimédia Kiss Attila Információs Rendszerek Tanszék
Természetesen P = Q = O esetén O + O = O. Tetszőleges, nem 2, vagy 3 karakterisztikájú test esetén hasonló módon eljárva E(K)-n zárt műveletet.
További vektor, mátrix algoritmusok
VFP xBase adatkezelés - munkaterületek - DML - DDL - navigáció - eljárások, függvények - vezérlési szerkezetek - változók - képernyő IO - mintaprogram.
A megértés körei Binzberger Viktor Budapest Műszaki és Gazdaságtudományi Egyetem Filozófia és Tudománytörténet Tanszék.
Multimédiás programok készítése Macromedia Director fejlesztői környezetben 4. előadás Készítette: Kosztyán Zsolt
Windows Server 2008 { PowerShell }
Alertet indíthat egy: SQL Server esemény (LOG) SQL Server performancia érték WMI events Alert végezhet: Operátor értesítést JOB indítás (válasz az eseményre)
Prog1, C a gyakorlatban Magasszintű programozási nyelvek 1 mérnök informatikus BSc előadás Bátfai Norbert egyetemi tanársegéd
Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése: Virtuális.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group Nyílt Fejlesztőrendszerek SWT haladó komponensek.
2012. tavaszi félév Vitéz Gergely. A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele.
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Motor IIII. Vezérlés Szécsi László. Letöltés diák: //l09-engine4.ppt.
Motor IIII. PhysX utáni rendberakás Vezérlés Szécsi László.
Motor II. Env map Spotlight Szécsi László. Letöltés /code/E/code/EggCoreSecondBase.zip Kibontani (vagy előző labor folyt.):
PhysX autó Szécsi László. Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l12-car.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip.
PhysX integráció Szécsi László. Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l11-physx.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip.
DirectX9 empty project Szécsi László. Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\
Server, Client. Client-Server Client numPlayers Id ServerMessage ClientMessage Server numPlayers ClientMessages[] ServerMessage Ha a kliens ugyanazt az.
V. labor Thread, animáció. Animáció A figurák a lépés kijelölése után nem rögtön az új helyen teremnek, hanem egyenes vonal mentén mozognak a cél felé.
OIS. Kezdeti teendők Letöltés: OgreLabControllersBase.zip Kicsomagol, betölt:.sln Additional include és library path beállítása Working directory beállítása.
II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for.
III. labor AWT, eseménykezelés Applet. Új class: ButtonView import java.awt.*; import java.awt.event.*; import java.util.LinkedList; public class ButtonView.
User interface Szécsi László. Egg projectben DXUTgui.cpp – CDXUTDialogResourceManager::CDXUTDialogReso urceManager() m_SpriteBufferBytes11 = 0; ezt kihagyták,
 Kvantált kép fényesség értékei: G [ 0, Gmax ]  G fényességű pontok száma: P(G)
GPGPU labor XII. Tomográfiás rekonstrukció. Kezdeti teendők Tantárgy honlapja, Monte Carlo szimuláció A labor kiindulási alapjának letöltése (lab12_base.zip),
GPGPU labor X. Monte Carlo módszerek. Kezdeti teendők Tantárgy honlapja, Monte Carlo módszerek A labor kiindulási alapjának letöltése (lab10_base.zip),
GPGPU labor IX. Lineáris egyenletrendszerek megoldása.
GPGPU Labor 15.. Párhuzamos primitívek Map Reduce Scan Histogram Compact.
GPGPU labor II. GPU mint vektor processzor. Kezdeti teendők Tantárgy honlapja, Bevezetés – Alap könyvtárak letöltése Tantárgy honlapja, GPU mint vektor.
FÖKIR Integrált Elektronikus Közoktatási Információs Rendszer A FÖKIR rendszer szoftverkomponensei FÖKIR Iskolaadminisztrációs Rendszer FÖKIR Fenntartói.
 OpenCL platform  Számító eszközök  OpenCL kontextusok  Parancs sorok  Szinkronizáció  Memória objektumok  OpenCL programok  OpenCL függvények.
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
CUDA C/C++ programozás
CUDA C/C++ programozás Atomikus műveletek A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
Hadoop Gyakorlat 1 Korszerű adatbázisok.
3D képek a fotóidból Tövissy Judit.
Google Summer of Code 2015 OpenCL image support for the r600g driver.
Sapientia - Erdélyi Magyar Tudományegyetem (EMTE) Csíkszereda
Szécsi László 3D Grafikus Rendszerek 15. előadás
GPGPU – CUDA 1..
Monte Carlo módszerek.
Párhuzamos primitívek
Lineáris egyenletrendszerek megoldása
OpenCL bevezetés II..
World map.
Tomográfiás rekonstrukció
Systems Hardware Business challenge
Függvénysablonok használata
What would x have to be in order for the mean to be 8?
Előadás másolata:

 Map  Reduce  Scan  Histogram  Compact

const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new float[dataSize]; cl_mem gData = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(float) * dataSize, NULL, NULL); clEnqueueWriteBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL); clSetKernelArg(mapKernel, 0, sizeof(cl_mem), &gData); size_t workSize = dataSize; clEnqueueNDRangeKernel(cl.cqueue(), mapKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL); clEnqueueReadBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL);

__kernel void map(__global float* data) { int id = get_global_id(0); float square = data[id] * data[id]; data[id] = square; }

const size_t dataSize = 1024; cl_kernel reduceKernel = cl.createKernel(clProgram, "reduce_global"); float* hData = new float[dataSize]; cl_mem gData = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(float) * dataSize, NULL, NULL); clEnqueueWriteBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL); clSetKernelArg(reduceKernel, 0, sizeof(cl_mem), &gData); size_t workSize = dataSize; clEnqueueNDRangeKernel(cl.cqueue(), reduceKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL); clEnqueueReadBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL);

__kernel void reduce_global(__global float* data) { int id = get_global_id(0); for(unsigned int s = get_global_size(0) / 2; s > 0; s >>= 1) { if(id < s) { data[id] = max(data[id], data[id + s]); } barrier(CLK_GLOBAL_MEM_FENCE); }

const size_t dataSize = 1024; cl_kernel reduceKernel = cl.createKernel(clProgram, "reduce_global"); float* hData = new float[dataSize]; cl_mem gData = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(float) * dataSize, NULL, NULL); clEnqueueWriteBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL); clSetKernelArg(reduceKernel, 0, sizeof(cl_mem), &gData); size_t workSize = dataSize; clEnqueueNDRangeKernel(cl.cqueue(), reduceKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL); clEnqueueReadBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL);

__kernel void exscan_global(__global int* data) { int id = get_global_id(0); data[id] = (id > 0) ? data[id-1] : 0; barrier(CLK_GLOBAL_MEM_FENCE); for(int s = 1; s < get_global_size(0); s *= 2) { int tmp = data[id]; if(id + s < get_global_size(0)) { data[id + s] += tmp; } barrier(CLK_GLOBAL_MEM_FENCE); } if(id == 0) { data[0] = 0; }

const size_t dataSize = 1024; const size_t histogramSize = 32; cl_kernel histogramGlobalKernel = cl.createKernel(clProgram, "hist"); int *hData = new int[dataSize]; int *hHist = new int[histogramSize]; memset(hHist, 0, sizeof(int)*histogramSize); cl_mem gData = clCreateBuffer(cl.context(), CL_MEM_READ_ONLY, sizeof(int) * dataSize, NULL, NULL); clEnqueueWriteBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(int) * dataSize, hData, 0, NULL, NULL); cl_mem gHist = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(int) * histogramSize, NULL, NULL); clEnqueueWriteBuffer(cl.cqueue(), gHist, CL_TRUE, 0, sizeof(int) * histogramSize, hHist, 0, NULL, NULL);

clSetKernelArg(histogramGlobalKernel, 0, sizeof(cl_mem), &gData); clSetKernelArg(histogramGlobalKernel, 1, sizeof(cl_mem), &gHist); const size_t workSize = dataSize; clEnqueueNDRangeKernel(cl.cqueue(), histogramGlobalKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL); clEnqueueReadBuffer(cl.cqueue(), gHist, CL_TRUE, 0, sizeof(int) * histogramSize, hHist, 0, NULL, NULL);

__kernel void histogram_global(__global int* data, __global int* histogram) { int id = get_global_id(0); histogram[data[id]] += 1; }  Nincs szinkronizáció!  Hibás!

__kernel void histogram_global(__global int* data, __global int* histogram) { int id = get_global_id(0); atomic_add(&histogram[data[id]], 1); }  Az atomikus műveletek szinkronizáltak!

clSetKernelArg(histogramLocalKernel, 0, sizeof(cl_mem), &gData); clSetKernelArg(histogramLocalKernel, 1, sizeof(cl_mem), &gHist); clSetKernelArg(histogramLocalKernel, 2, sizeof(int) * histogramSize, NULL); clSetKernelArg(histogramLocalKernel, 3, sizeof(int), &histogramSize);  Lokális memória allokálása host oldalról

__kernel void histogram_local(__global int* data, __global int* histogram, __local int* lhistogram, const int histogramSize) { int id = get_global_id(0); int lid = get_local_id(0); if(lid < histogramSize) { lhistogram[lid] = 0; } barrier(CLK_LOCAL_MEM_FENCE); atomic_add(&lhistogram[data[id]], 1); barrier(CLK_LOCAL_MEM_FENCE); if(lid < histogramSize){ histogram[lid] = lhistogram[lid]; }

const size_t dataSize = 1024; cl_kernel predicateKernel = cl.createKernel(clProgram, "c_pred"); cl_kernel exscanKernel = cl.createKernel(clProgram, "c_exscan"); cl_kernel compactKernel = cl.createKernel(clProgram, "c_compact"); int* hData = new int[dataSize]; cl_mem gData = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(float) * dataSize, NULL, NULL); clEnqueueWriteBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL); cl_mem gPred = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(int) * dataSize, NULL, NULL); cl_mem gPrefSum = clCreateBuffer(cl.context(), CL_MEM_READ_WRITE, sizeof(int) * dataSize, NULL, NULL);

size_t workSize = dataSize; // Predicate clSetKernelArg(predicateKernel, 0, sizeof(cl_mem), &gData); clSetKernelArg(predicateKernel, 1, sizeof(cl_mem), &gPred); clEnqueueNDRangeKernel(cl.cqueue(), predicateKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL); // Exclusive scan on predicate buffer clSetKernelArg(exscanKernel, 0, sizeof(cl_mem), &gPred); clSetKernelArg(exscanKernel, 1, sizeof(cl_mem), &gPrefSum); clEnqueueNDRangeKernel(cl.cqueue(), exscanKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL);

// Compact clSetKernelArg(compactKernel, 0, sizeof(cl_mem), &gData); clSetKernelArg(compactKernel, 1, sizeof(cl_mem), &gPred); clSetKernelArg(compactKernel, 2, sizeof(cl_mem), &gPrefSum); clEnqueueNDRangeKernel(cl.cqueue(), compactKernel, 1, NULL, &workSize, NULL, 0, NULL, NULL); clEnqueueReadBuffer(cl.cqueue(), gData, CL_TRUE, 0, sizeof(float) * dataSize, hData, 0, NULL, NULL);

__kernel void c_pred(__global int* data, __global int* pred) { int id = get_global_id(0); int predVal = data[id] < 50 ? 1 : 0; pred[id] = predVal; }

__kernel void c_exscan(__global int* pred, __global int* prefSum) { int id = get_global_id(0); prefSum[id] = (id > 0) ? pred[id-1] : 0; barrier(CLK_GLOBAL_MEM_FENCE); for(int s = 1; s < get_global_size(0); s *= 2) { int tmp = prefSum[id]; if(id + s < get_global_size(0)) { prefSum[id + s] += tmp; } barrier(CLK_GLOBAL_MEM_FENCE); } if(id == 0) { prefSum[0] = 0; }

__kernel void c_compact(__global int* data, __global int* pred, __global int* prefSum) { int id = get_global_id(0); int val = data[id]; barrier(CLK_GLOBAL_MEM_FENCE); if(pred[id] == 1) { data[prefSum[id]]=val; }