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

Hasonló dokumentumok
Google Summer of Code OpenCL image support for the r600g driver

OpenGL Compute Shader-ek. Valasek Gábor

OpenCL - The open standard for parallel programming of heterogeneous systems

Él: a képfüggvény hirtelen változása. Típusai. Felvételeken zajos formában jelennek meg. Lépcsős

HLSL programozás. Grafikus játékok fejlesztése Szécsi László t06-hlsl

Minták automatikus osztályba sorolása a mintát leíró jellemzők alapján. Típusok: felügyelt és felügyelet nélküli tanuló eljárások

7. fejezet: Mutatók és tömbök

Mutatók és mutató-aritmetika C-ben március 19.

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

Láthatósági kérdések

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

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

Készítette: Nagy Tibor István

Textúrák. Szécsi László

Párhuzamos és Grid rendszerek

Magas szintű optimalizálás

Grafikonok automatikus elemzése

Java grafikai lehetőségek

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD

Transzformációk. Grafikus játékok fejlesztése Szécsi László t05-transform

8. gyakorlat Pointerek, dinamikus memóriakezelés

Beágyazott rendszerek fejlesztése laboratórium DSP fejlesztési technológiák

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

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

Webprogramozás szakkör

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

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Számítógépes Grafika mintafeladatok

Számítógépes Grafika mintafeladatok

Bevezetés a programozásba. 5. Előadás: Tömbök

Grafikus csővezeték 1 / 44

SCILAB programcsomag segítségével

Osztályok. 4. gyakorlat

Adatelemzés SAS Enterprise Guide használatával. Soltész Gábor solteszgabee[at]gmail.com

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

rank(a) == rank([a b])

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

Függvények december 6. Határozza meg a következő határértékeket! 1. Feladat: x 0 7x 15 x ) = lim. Megoldás: lim. 2. Feladat: lim.

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

Önálló labor beszámoló Képek szegmentálása textúra analízis segítségével. MAJF21 Eisenberger András május 22. Konzulens: Dr.

Szimulációs technikák

Az egyenlőtlenség mindkét oldalát szorozzuk meg 4 16-al:

Máté: Számítógépes grafika alapjai

Klár Gergely 2010/2011. tavaszi félév

KÉPFELDOLGOZÁS. 10. gyakorlat: Morfológiai műveletek, alakjellemzők

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A C programozási nyelv III. Pointerek és tömbök.

17. előadás: Vektorok a térben

OpenGL és a mátrixok

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Számítógépes Graka - 4. Gyak

Függvények július 13. Határozza meg a következ határértékeket! 1. Feladat: x 0 7x 15 x ) = lim. x 7 x 15 x ) = (2 + 0) = lim.

Direct3D pipeline. Grafikus játékok fejlesztése Szécsi László t03-pipeline

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozási nyelvek II.: JAVA, 4. gyakorlat

A C programozási nyelv III. Pointerek és tömbök.

Számítógépes grafika

1. feladatsor: Vektorterek, lineáris kombináció, mátrixok, determináns (megoldás)

Transzformációk. Szécsi László

Algoritmusok és adatszerkezetek 2.

VIK A2 Matematika - BOSCH, Hatvan, 3. Gyakorlati anyag. Mátrix rangja

Véletlen szám generálás Labirintus felépítése 1x1-es felbontástól a teljes méretig

EGYSZERŰ SZÁMÍTÁSOK TÁBLÁZATKEZELÉS ELINDULÁS SZE INFORMATIKAI KÉPZÉS 1

Geometriai modellezés. Szécsi László

Az objektum leírására szolgálnak. Mire jók? Sokszor maga a jellemző az érdekes: Tömörítés. Objektumok csoportosítására

A Microsoft OFFICE. EXCEL táblázatkezelő. program alapjai as verzió használatával

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Munkánk során a cellák tartalmát gyakran másolni szoktuk. Előfordul, hogy képleteket tartalmazó cellákat másolunk.

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

Programozási nyelvek Java

Objektumok és osztályok. Az objektumorientált programozás alapjai. Rajzolás tollal, festés ecsettel. A koordinátarendszer

Szövegek C++ -ban, a string osztály

Készítette:

2) Egy háromszög két oldalának hossza 9 és 14 cm. A 14 cm hosszú oldallal szemközti szög 42. Adja meg a háromszög hiányzó adatait!

x 2 3 y 5 6 x + y 7 9

egy szisztolikus példa

Lényege: valamilyen szempont szerint homogén csoportok képzése a pixelekből. Amit már ismerünk:

12. előadás. Egyenletrendszerek, mátrixok. Dr. Szörényi Miklós, Dr. Kallós Gábor

1. Olvassuk be két pont koordinátáit: (x1, y1) és (x2, y2). Határozzuk meg a két pont távolságát és nyomtassuk ki.

Excel III. Haladó ismeretek

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Termék modell. Definíció:

Képek és grafikák. A Beszúrás/Kép parancsot választva beszúrhatunk képet ClipArt gyűjteményből, vagy fájlból. 1. ábra Kép beszúrása

Struktúra nélküli adatszerkezetek

Szöveges műveletek. Mielőtt nekikezdenénk első szövegünk bevitelének, tanuljunk meg néhány alapvető műveletet a 2003-as verzió segítségével:

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

Lakóház tervezés ADT 3.3-al. Segédlet

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

Képszerkesztés. Letölthető mintafeladatok gyakorláshoz: Minta teszt 1 Minta teszt 2. A modul célja

Programozás II gyakorlat. 8. Operátor túlterhelés

SZÁMÍTÁSOK A TÁBLÁZATBAN

Matlab alapok. Vektorok. Baran Ágnes

4,5 1,5 cm. Ezek alapján 8 és 1,5 cm lesz.

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

Morfológia. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar Szoftvertechnológia Intézet

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Smalltalk 2. Készítette: Szabó Éva

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Plakátok, részecskerendszerek. Szécsi László

Függvények Megoldások

Átírás:

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épest: Célra szabott egyedi formátumok (1-4 csatorna, 8-32 bit szélesség, vagy float, azonban double nincs!) A memóriavezérlő után már más egységek kezelik, plussz műveleteket tudnak rajtuk végezni (pl.: lineáris interpoláció) Az adott dimenzióra felkészített cache logika (nagyon gyors elérni a szomszédos értékeket) 2

Textúrák Az előzőekből következik, hogy a textúrák alapvetően képfeldolgozási feladatokra hasznosak. Azonban előfordulhat, hogy valamilyen számítást elég float-ban elvégeznünk, ebben az esetben hasznos lehet őket használni A textúra szűrési műveletek ingyen vannak abban az értelemben, hogy a kártya nominális teljesítményébe nincsenek bele értve. 3

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 4

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z Csatornák száma (most 4) és a csatorna reprezentációja (mot float) cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 5

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; Kép dimenzióinak megadása desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 6

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z Kép méreteinek megadása A nem használt dimenziókba 0-t kell írni! cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 7

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z OpenCL kép azonosító létrehozása cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 8

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z Ugyan olyan flag-ek, mint a buffereknél cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 9

OpenCL-ben a textúrát egy formátum és egy leíró párosával hozhatjuk létre: cl_image_format format = { CL_RGBA, CL_FLOAT }; cl_image_desc desc = {}; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = W; //x desc.image_height = H; //y desc.image_depth = 0; //z Ez a pointer az adatokra, aminek most esetünkben W*H*4 db float-ra kell mutatnia cl_mem img = clcreateimage(context, CL_MEM_READ_ONLY CL_MEM_COPY_HOST_PTR CL_MEM_HOST_NO_ACCESS, &format, &desc, image_data.data(), &status); 10

Az OpenCL kernelnek ugyanúgy kell átadni a textúrákat, mint a buffereket: cl_mem img; cl_int status = clsetkernelarg(kernel, 0, sizeof(img), &img); A kernel kódban pedig meg kell jelölni, hogy hány dimenziós képet várunk, és azt is, hogy írjuk vagy olvassuk (egyszerre a kettőt nem lehet!): kernel void sobel(read_only image2d_t src, write_only image2d_t dst){... } 11

Fel-, letölteni vagy másolni hasonló parancsokkal lehet, mint a buffereket, pl.: size_t origin[3] = {0, 0, 0}; size_t dims[3] = {W, H, 1}; status = clenqueuereadimage(queue, img, false, origin, dims, 0, 0, image_data.data(), 0, nullptr, nullptr); 12

Fel-, letölteni vagy másolni hasonló parancsokkal lehet, mint a buffereket, pl.: size_t origin[3] = {0, 0, 0}; size_t dims[3] = {W, H, 1}; A képnek egy rész tégláját is hivatkozhatjuk, a másolás kezdőpontjának, és a méretének megadásával. A nem használt dimenzióban a méret 1 kell legyen! Mi most az egész képet akarjuk másolni. status = clenqueuereadimage(queue, img, false, origin, dims, 0, 0, image_data.data(), 0, nullptr, nullptr); 13

Fel-, letölteni vagy másolni hasonló parancsokkal lehet, mint a buffereket, pl.: size_t origin[3] = {0, 0, 0}; size_t dims[3] = {W, H, 1}; Blokkoló hívás, vagy sem (csak akkor tér-e vissza, ha befejezőtöbb a művelet, vagy pedig azonnal visszatér, amint bekerült a queue-be) status = clenqueuereadimage(queue, img, false, origin, dims, 0, 0, image_data.data(), 0, nullptr, nullptr); 14

Fel-, letölteni vagy másolni hasonló parancsokkal lehet, mint a buffereket, pl.: size_t origin[3] = {0, 0, 0}; size_t dims[3] = {W, H, 1}; status = clenqueuereadimage(queue, img, false, origin, dims, 0, 0, image_data.data(), 0, nullptr, nullptr); Pointer, ahova kérjük a kártyáról visszamásolt adatokat 15

Ahhoz, hogy egy textúrát olvasni tudjuk, meg kell adni, hogy milyen módon akarjuk mintavételezni (sampling), ez egy sampler objektum írja le. Ezt mind a gazda oldalon, mind a kernelben definiálhatjuk, itt most az utóbbira van példa: constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE CLK_ADDRESS_CLAMP_TO_EDGE CLK_FILTER_NEAREST; Milyen koordináta rendszerben akarjuk címezni a textúrát? Normalizált: 0.0 1.0 vagy pixel index 0 - n-1 16

Ahhoz, hogy egy textúrát olvasni tudjuk, meg kell adni, hogy milyen módon akarjuk mintavételezni (sampling), ez egy sampler objektum írja le. Ezt mind a gazda oldalon, mind a kernelben definiálhatjuk, itt most az utóbbira van példa: constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE CLK_ADDRESS_CLAMP_TO_EDGE CLK_FILTER_NEAREST; Mi történjén, ha túl indexeljük a széleken? Repeat: periodikus határfeltétel Clamp to edge: levágja a legközelebbi határra Clamp: feketét ad vissza None: undefined 17

Ahhoz, hogy egy textúrát olvasni tudjuk, meg kell adni, hogy milyen módon akarjuk mintavételezni (sampling), ez egy sampler objektum írja le. Ezt mind a gazda oldalon, mind a kernelben definiálhatjuk, itt most az utóbbira van példa: constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE CLK_ADDRESS_CLAMP_TO_EDGE CLK_FILTER_NEAREST; A textúra szűrésének módja: Legközelebbi szomszéd, vagy lineáris interpoláció 18

Ezek után a read_image beépített függvénnyel lehet egy adott textúrából egy kiválasztott sampler-el beolvasni egy pixelt: float4 pixel = read_imagef(src, sampler, (int2)(x, y)); Íráskor nincs szűrés, de ott is beépített függvény kell hívnunk: write_imagef(dst, (int2)(x, y), pixel); 19

Példa: élkiemelés A példakódban egy élkiemelési szűrést hajtunk végre a képen, aminek a neve Sobel-filter, ez két darab (egyik függőleges, a másik vízszintes) 3x3-as kernel (a képfeldolgoázsi értelemben ), amivel konvolválni kell (szintén a képfeldolgozási értelemben!): 1 1 pixel k x, y = i= 1 j= 1 ahol most k=w vagy H. image x + i, y + i filter k (i + 1, j + 1) 20

Példa: élkiemelés A két Sobel filter eredményének a négyzetösszegével kell korrigálni az eredeti képet, hogy a gradienst közelítsük: gradient x, y = pixel W x, y 2 + pixel H x, y 2 A példakódban a gradienst mind a 4 csatornában nézzük, ezért a négyzetre emelést a két 4-es vektor skaláris szorzatával számoljuk: dot(pixel, pixel), ahol pixel egy float4! 21

Példa: élkiemelés Végül a gradiens értékét hozzá keverjük a képhez, hogy ne csak az éleket lássuk, hanem az eredeti képből is maradjon valami: final pixel x,y = pixel (α + 1 α gradient) 22

Példa: élkiemelés Eredmény (az átlátszósági csatornát is szűrtük, így egy egész vicces sematikus ábrát nyertünk): 23