CUDA C/C++ programozás Textúra memória A segédanyag készítése a TÁMOP 4.2.4.A/2-11-1-2012-0001 Nemzeti Kiválóság Program című kiemelt projekt keretében.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

Tananyag: konzultáció
C++ programozási nyelv Gyakorlat hét
Összetett adattípusok 8/b tétel
LEgyméretű tömbök, vektorok Alkalmazott Informatikai Tanszék SZÁMÍTÁSTECHNIKA I. dr.Dudás László 17./0. lVektorok definiálása lVektorok definiálása kezdőértékekkel.
LFüggvények Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 20./0. lFüggvények deklarációja és prototípusa lA függvénydefiníció lHivatkozás.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Objective- C Bereczki Gréta Tamara
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Dinamikus tömbök.
Bevezetés a Java programozásba
Bevezetés a Java programozásba
11. előadás (2005. május 10.) A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások 1.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Mutatók, tömbök, függvények
Borland C/C++ mintapéldák
Java Típuskonverziók.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Web-grafika (VRML) 10. gyakorlat Kereszty Gábor. Script típusok Elemi típusok: szám: egész vagy lebegőpontos – int / float – 1 / 1.1 string: ‘Hello World!’
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Programozás Az adatokról C# -ban.
Tömbök Csernoch Mária.
Összetett adattípusok
Számítógépes Grafika 2. gyakorlat Programtervező informatikus (esti) 2011/2012 őszi félév.
Számítógépes grafika 3. gyakorlat.
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
A REKORD TIPUS Páll Boglárka. Ismétlés: Feladat Készítsünk kimutatást a XI.B osztály tanulóiról. Minden tanuló esetén a következő adatokat tartjuk nyilván:
Készítette: Csíki Gyula
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Web-grafika II (SVG) 3. gyakorlat Kereszty Gábor.
Komoróczy Tamás 1 Java programozási nyelv Stringek.
Java programozási nyelv Metódusok
Objektum orientált programozás
Objektum orientált programozás
CUDA C/C++ programozás Szál struktúra A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
CUDA C/C++ programozás Egyéb eszköztárak vegyesen A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt.
CUDA C/C++ programozás
CUDA C/C++ programozás GPU tulajdonságainak lekérdezése A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt.
A Visual Basic nyelvi elemei
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.
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
C Programozási alapok.
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Grafikus programozás Készítette: Csernok László
Memóriakezelés feladatok Feladat: 12 bites címtartomány. 0 ~ 2047 legyen mindig.
Excel programozás (makró)
Geometriai feladatok programozása Geometriai programozás Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010.
Programtervezés, programozás I. 2.5 tömbök,stringek
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
Struktúrák a C nyelvben 1 Akkor használjuk, ha az egy egyedre jellemző különböző típusú adatokat együtt akarjuk tárolni. Lényegében típusdeklaráció. A.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Informatikai gyakorlatok 11. évfolyam
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
GPGPU – CUDA 1..
a programegységek között
Programozási nyelvek típusossága.
GPGPU – CUDA 2..
Konverziós operátorok
CUDA – OpenGL.
Függvénysablonok használata
Cache példák 2019 (IMSC).
Előadás másolata:

CUDA C/C++ programozás Textúra memória A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében zajlott. A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszírozásával valósul meg.

GPU memória fajták (emlékeztető)  Valójában a CUDA architektúra szerint a CUDA magok többféle adattárolóhoz férnek hozzá.  Regiszterek  Írható-olvasható  Közös memória  Irható-olvasható  Konstans memória  Csak olvasható  Textúra memória  Csak olvasható  Grafikus memória  Írható-olvasható

Textúra memória  A CUDA lehetővé teszi textúrák gyors kezelését is.  2-3 dimenziós eléréshez optimalizált csak olvasható memóriaterület.  Valójában a globális memóriában kap helyet tömb-ként.  A memóriában levő adatok kiolvasása egy speciális textúrázón keresztül történik.  Automatikusan gyorsítótárazott.  Hardveresen támogatja a 2D-3D indexelést, és a szomszédos tömbelemek közötti interpolációt.  Tehát nagyon jó, ha 2D adatokat (például képeket) kell feldolgozni.

Textúrázó használata 1 Textúra referencia deklarálás  A textúra memória használata egy textúra referencia deklarálásával kezdődik.  Ezt a globális scope-ban kell megtenni.  Paraméterek:  DataType: egy adattípus. Lehet:  Primitív típus: char, short, int, long, longlong, float, double  Vagy azokból alkotott 2-4 elemű vektor:  Pl.: float2, float4, char4, … Texture texRef;

Textúrázó használata 1 Textúra referencia deklarálás  További paraméterek:  Type: a textúra típusa.  cudaTextureType1D – 1-dmineziós textúra  cudaTextureType2D – 2-dmineziós textúra (kép)  cudaTextureType3D – 3-dmineziós textúra (térfogati adat)  cudaTextureType1DLayered, cudaTextureType2DLayered (ezzel most nem foglalkozunk)  ReadMode: Adat olvasási módja (mi jön ki a textúrázóból)  cudaReadModeElementType: olyan típusú adat, amit a DataType definiál,  cudaReadModeNormalizedFloat: normalizált float. (automatikus int->float konferzió, és [0, 1]-re skálázás.) Texture texRef;

A textúra egyéb tulajdonságai  A textúrázónak be lehet még állítani számos egyéb extra paraméter.  Valójában a „texture” típus egy „textureReference” nevű struktúrávól van származtatva, aminek a deklarációja: struct textureReference { int normalized; enum cudaTextureFilterMode filterMode; enum cudaTextureAddressMode addressMode[3]; struct cudaChannelFormatDesc channelDesc; int sRGB; unsigned int maxAnisotropy; enum cudaTextureFilterMode mipmapFilterMode; float mipmapLevelBias; float minMipmapLevelClamp; float maxMipmapLevelClamp; }

A textúra egyéb tulajdonságai  A fontosabb textúra paraméterek  Normalized:  Logikai érték. Normalizát textúra koordinátákat használunk-e. Meg lehet tartani az eredeti tömbindexeket, vagy [0, 1) –re lehet skálázni az egészet. (0, 0)(w, 0) (w, h) (0, h) (0, 0)(1, 0) (1, 1) (0, 1)

A textúra egyéb tulajdonságai  A fontosabb textúra paraméterek  filterMode :  Ha nem egész indexről akarunk olvasni egy képben, akkor a végső érték hogy legyen meghatározva (grafikában interpoláció).  cudaFilterModePoint: legközelebbi pont interpoláció  cudaFilterModeLinear: lineáris interpoláció (x 1, y 2 ) (x 2, y 2 ) (x 1, y 1 ) (x 2, y 1 )

A textúra egyéb tulajdonságai  A fontosabb textúra paraméterek  addressMode :  Képen kívüli koordináta olvasásakor mi történjen.  cudaAddressModeClamp: levágás a legközelebbi koordinátára pl.: w+5 -> w  cudaAddressModeWrap: a textúra a széle után megismétlődik  cudaAddressModeMirror, cudaAddressModeBorder  A többi a referenciában.

A 2D textúrák  A 2D textúrák használatához létre kell még hozni egy csatornaleírót.  Alapvetően a beolvasott adat textúráját határozza meg.  A segítségével meg lehet adni, hogy a textúra milyen adatokat tartalmaz, és 4 külön színcsatornán a bitmélységet külön specifikálhatja.  Mi itt csak létrehozzuk az alapértelmezett beállításokkal. Feltesszük, hogy olyan adatot olvas, amilyen a textúra referenciában meg van adva. Pl.: struct cudaChannelFormatDesc { int x, y, z, w; enum cudaChannelFormatKind f; }; cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc ();

2D textúra kötése a képhez  Ha megvan a tömb a grafikus memóriában, és a textúra referencia, akkor a kettőt össze kell kötni.  Amit meg kell adni:  A textúra kezdetének eltolása a tömbben.  Egy textúra referencia.  Mutató a memóriatömbre amit a textúrázón keresztül olvasnánk.  Egy csatornaleíró.  Textúra szélessége.  Textúra magassága.  A tömbön belül a textúra sorok közötti eltolás byte-okban.  A sorok kezdőcímeit igazítani lehet a memória szegmensekhez. Optimalizált elérés. (lásd előző előadás, cudaArray, cudaMallocPitch) cudaError_t cudaBindTexture2DcudaError_t cudaBindTexture2D ( size_t* offset, const textureReference* texref, const void* devPtr, const cudaChannelFormatDesc* desc, size_t width, size_t height, size_t pitch )textureReferencecudaChannelFormatDesc

Textúra használata  A textúra használatához még a kerneleket is módosítani kell.  A textúra olvasása a kernelben a tex1D, tex2D, vagy tex3D függvény segítségével működik.  tex1D(texture texRef, float x);  tex2D(texture texRef, float x, float y);  tex3D(texture texRef, float x, float y, float z);  Kiolvasunk egy adott textúra egy értékét az adott koordinátákról.  A textúrázón keresztül csak olvasni lehet.  A memória terület írása a háttérben lefoglalt tömb pointerével lehetséges. float value = tex2D(texRef, 25, 10.5);

Példa 2D textúrára #include texture texRef; … __global__ kernel(…) { uchar4 value = tex2D(texRef, x, y);... } int main(…) { uchar4* dev_ptr; cudaMalloc((void**)&dev_ptr, …); cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc (); cudaBindTexture2D(NULL, texRef, dev_ptr, channelDesc, width, height, pitch);... }

Egy példa textúrák használatára  13_TextureSmooth.cu  Iteratív simítás 3x3-as átlagszűrővel.  + extra Ping-pong technika bemutatás. :)

Ping-pong technika  Iteratív műveleteknél ha egy adathalmazon többször egymás után kell elvégezni a műveletet.  Például képek iteratív simításánál.  Két tömböt tartunk nyilván.  Kezdetben az egyik tömb az eredeti kép.  A másik tömb lesz a képen végzett művelet eredménye.  Majd megcseréljük a két képet, és a újra elvégezzük a műveletet most a második tömbből kiindulva, és az eredményt az első tömbbe írva.  És így tovább. 1. iteráció 2. iteráció 3. iteráció

Pár kimaradt részlet  Eddig a textúra, textúra referencián keresztül való használatával foglalkoztunk.  A textúrákhoz van egy másik alacsonyabb szintű elérés is, úgynevezett textúra objektumokon keresztül.  Nagyobb hozzáférés a textúra szolgáltatásokhoz.  Bonyolultabb kezelés.  A textúrát speciálisan tömbök kezelésére használt CUDA tömbökhöz (CUDA Array) kell kötni.  2-3D használathoz optimalizált.  Csak a CPU kódból írható, a CUDA API-n keresztül. (cudaMemcpyToArray függvény)  Most elég ha tudunk róla. Ha használni kell, a CUDA Programming Guide-ban van részletes leírás.

Pár kimaradt részlet  Lehet 1-, és 3D textúrákat is definiálni.  1D textúránál:  A textúra referencia deklarálásakor cudaTextureType1D a típus.  Az előkészítésnél a cudaBindTexture függvénnyel megy a textúra kötése, és nem kell magasság paraméter, és sorok közötti eltolás érték. (viszont a textúra méretét még mindig meg kell adni)  A kernelben a tex1D(texRef, x) függvénnyel olvasunk.  3D textúráknál:  Textúra objektumot kell használni, és  CUDA tömböt kell mögé tenni. cudaError_t cudaBindTexture ( size_t* offset, const textureReference* texref, const void* devPtr, const cudaChannelFormatDesc* desc, size_t size)

CUDA hibakezelés  Nem beszéltünk még a hibakezelésről.  A legtöbb függvény a CUDA api-ban egy hibakóddal tér vissza.  A többi (pl.: a kernel) után le lehet kérdezni, hogy történt –e hiba a futáskor.  cudaError_t cudaGetLastError ( void );  A hibakód alapján pedig szövegesen is le lehet kérdezni a probléma okát.  const __cudart_builtin__ char* cudaGetErrorString ( cudaError_t error ) kernel >>(...); cudaError_t error = cudaGetLastError(); if(error != cudaSuccess) printf(„%s\n”, cudaGetErrorString(error));