CUDA.

Slides:



Advertisements
Hasonló előadás
A számítógép műszaki, fizikai része
Advertisements

1 Számítógépek felépítése 9. előadás I/O rendszerek.
Hatékonyságvizsgálat, dokumentálás
Memóriák típusai, jellemzői
A számítógép felépítése
Memória.
Neumann-elvek A számítógép legyen teljesen elektronikus, külön vezérlő és végrehajtó egységgel. Kettes számrendszert használjon. Az adatok és a programok.
A mikroprocesszor 1. rész.
Számítógépek felépítése sínrendszer, megszakítás
Számítógépek felépítése 3. előadás CPU, utasítás ciklus, címzé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.
 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC.
Turbo Pascal Változók.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Alaplapra integrált csatlakozók
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.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Optimalizálás nemklasszikus architektúrákon
A memória.
A 2000-es év utáni processzorok jellemzői
LDinamikus tömbök, kétdimenziós tömbök Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 21./0. lVektorok létrehozása futásidőben, dinamikusan.
Mikroszámítógépek I 8085 processzor.
Utasítás végrehajtás lépései
PIC processzor és környezete
CISC - RISC processzor jellemzők
A memória.
Számítógép memória jellemzői
Többmagos processzorok
Felkészítő tanár: Széki Tibor tanár úr
Sínrendszer.
Egy egyszerű gép vázlata
1 Operációs rendszerek Az NT folyamatok kezelése.
Demo/teszt környezetek Szerver konszolidáció Adatközpontok alapja.
Operációs Rendszerek II.
RAID lemezek (Redundant Array of Independent or Inexpensive Disks)
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
A számítógép teljesítménye
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Magas szintű hardware szintézis
Mikrokontroller (MCU, mikroC)
1.4. Fordítás, szerkesztés, az objektumkönyvtár használata.
Processzorok.
A számítógép felépítése
GPGPU A grafikus hardver általános célú felhasználása
A Neumann-elvű gépek A Neumann elvek:
Egy második generációs gép (az IBM 7094) felépítése
Egy első generációs gép (az IAS) felépítése
CUDA C/C++ programozás
A központi egység Informatika alapjai Készítette: Senkeiné B. Judit.
A Visual Basic nyelvi elemei
Mikroprocesszor.
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.
Alaplapra integrált csatlakozók
Ismerkedjünk tovább a számítógéppel
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.
Írja fel a tizes számrendszerbeli
Memória példák Feladat Egy számítógép rendszermemóriája egycsatornás, 64 bites adategységekkel rendelkező DDR1-DRAM-ra épül, melyben a burst.
Memóriakezelés feladatok Feladat: 12 bites címtartomány. 0 ~ 2047 legyen mindig.
1 Számítógépek felépítése 5. előadás a CPU gyorsítása, pipeline, cache Dr. Istenes Zoltán ELTE-TTK.
1 A számítógépek felépítése jellemzői, működése. 2 A számítógép feladata Az adatok Bevitele Tárolása Feldolgozása Kivitele (eredmény megjelenítése)
Neumann elvű számítógép. Neumann János ► Neumann János december 28-án Budapesten született ► 1930-ban emigrált az USA-ba.
RAM (Random Access Memory)
Kifejezések C#-ban.
A számítógép felépítése
GPGPU – CUDA 2..
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
CUDA – OpenGL.
Memória példák 2019.
Fejlett pipeline megoldások IMSC 2019
Cache példák 2019 (IMSC).
Előadás másolata:

CUDA

Optimalizálási kérdések 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: maximális teljesítmény növekedés P: párhuzamosítható kód aránya a soros kódban N: processzorok száma GPGPU példa: N: nagyon nagy , ha a párhuzamosítható a ¾-e a kódnak

Optimalizálási kérdések Magas szintű optimalizálás Mennyi a várható teljesítmény növekedés? Gyenge skálázódás (Gustafson törvény) Mennyire lineáris a skálázódás A processzorok számának növelésével Fix probléma méret processzoronként Azaz a problématér a processzorok számával nő

Optimalizálási kérdések Hogyan párhuzamosítsunk? Segédkönyvtárak használatával Meglévő soros kód párhuzamosítása A meglévő program már használ CPU-n futó könyvtárat Párhuzamosító fordító A teljesen automatikus vektorizáció nehéz probléma Praktikusan a fordítót segítő direktívákat kell használni OpenMP – CPU vektorizáció OpenACC – GPU vektorizáció Saját GPU kód

Optimalizálási kérdések Numerikus pontosság és sebesség A GPU erősen érzékeny az adat típusra Float vagy Double? Gyakran más eredményt adnak a számítások A Double legalább kétszer lassabb A lebegő pontos műveletek nem asszociatívak IEEE 754-nek megfelel, néhány kivétellel A CPU-hoz képest más a számítások pontossága A CPU és GPU más reprezentációt használ CPU 80bit, GPU 64bit

Optimalizálási kérdések Milyen elméleti mérőszámok vannak? Sávszélesség Elméleti sávszélesség a grafikus kártya specifikációjából Tesla M2090: GDDR5 RAM, 1.85GHz, 384bit széles busz Az elméleti sávszélesség: ECC használatakor a sávszélesség 20%-al kisebb Effektív sávszélesség a mérésből Memória írások és olvasások száma az eltelt idő alatt Effektív sávszélesség: Példa: 2048x2048-as mátrix másolása

Optimalizálási kérdések Hogyan kezeljük a memóriát? Adatcsere a host és device között Az elméleti sávszélesség kicsi (8GB/s) Minimalizáljuk az adatátvitelt Az átvitelnek is van költsége Kevés nagyobb blokk a sok kicsi helyett Speciális memória szervezés Pinned memória Write-combining memória Zero-copy memória Drága és korlátos erőforrások

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Adatcsere a host és device között Másolás és kernel futtatás átlapolása A host és device kód átlapolása Memória másolás és kernel futtatás átlapolása cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid,block>>>(a_d); cpuFunction(); cudaStreamCreate(&stream1); cudaStreamCreate(&stream2); cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, stream1); kernel<<<grid,block,0,stream2>>>(b_d);

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Adatcsere a host és device között Problématér darabolása size = N * sizeof(float)/nStreams; for(i=0; i<nStreams; ++i) { offset = i*N/nStreams; cudaMemcpyAsync(a_d+offset, a_h+offset, size, cudaMemcpyHostToDevice, stream[i]); kernel<<<N/(nThreads*nStreams), nThreads,0,stream[i]>>>(a_d+offset); }

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból A globális memória elérésének mintája (coalesced access) Egyszerű minta A warp egymás utáni memória címekhez fordul 128bit-es tranzakció

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból A globális memória elérésének mintája (coalesced access) Egyszerű minta, igazítás nélkül A warp egymás utáni memória címekhez fordul Több tranzakció szükséges L1 L2

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból A globális memória elérésének mintája (coalesced access) Az igazítás hatása

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból A globális memória elérésének mintája (coalesced access) Az elérendő elemek közötti offset hatása

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból Az osztott memória elérése Az osztott memória több egyforma méretű blokkokra van osztva Az egyes blokkok párhuzamosan elérhetőek Azonos blokkba irányuló kérések sorosítva lesznek CC 1.x Sávszélesség: bankonként 32bit két órajel alatt Egymást követő 32bites szavak egymást követő bankokban Warp méret 32, Bankok száma 16

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból CC 2.x Sávszélesség: bankonként 32bit két órajel alatt Egymást követő 32bites szavak egymást követő bankokban Warp méret 32, Bankok száma 32 CC 3.x Sávszélesség: bankonként 64bit egy órajel alatt Egymást követő 32bites szavak egymást követő bankokban, Vagy egymást követő 64bites szavak egymást követő bankokban

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból Lokális memória elérése Nem a multiprocesszorban van Automatikusan használja a fordító, ha szükséges Minimalizálni kell a használatát Textúra memória Cache-elt memória terület 2D lokalitásra optimalizálva Konstans késleltetés A cache találat csak a sávszélesség igényt csökkenti

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan kezeljük a memóriát? Memória elérés GPU kódból Konstans memória elérése 64KB a méretű cache-elt terület A konstans cache sorosítja a kéréseket, ha nem azonos címről van szó Regiszterek Általános esetben szinkron elérésű Read-after-write késleltetés 24 órajel, de megfelelő számú párhuzamos szál esetén amortizálódik Bank ütközés Az ütemező megpróbálja elkerülni Nincs közvetlen ráhatásunk

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan válasszuk meg a munkaméretet? Occupancy Az aktív és maximálisan indítható warpok aránya

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Hogyan válasszuk meg a munkaméretet? Párhuzamos kernel futtatás Eszközfüggő a párhuzamos kernelek száma Streamek segítségével párhuzamosítható Regiszter függőségek A késleltetés csökkenthető megfelelő számú szál indításával Blokk méret megválasztása Szálak száma a warp méret többszöröse legyen Minimum 64 szál legyen blokkonként 128-256 szál blokkonként jó kiindulás A késleltetés csökkenthető több kisebb blokkal Az osztott memória korlátai

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Aritmetikai pontosság vagy sebesség? Egyszeres vagy dupla pontosság Speciális matematikai függvények Típusok közötti konverzió Intrinsics függvények (__function) Közvetlenül a hardver utasításokra képződnek le Fordítási opciók -ftz=true (denormált számok legyenek nullák) -prec-div=false (osztás pontossága) -prec-sqrt=false (gyök számítás pontossága)

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Kód szervezés Elágazások, divergencia Warpon belüli elágazásokat kerülni kell Célszerű az elágazásokat a warp mérethez igazítani Elágazás előrejelzés Feltételes utasítás folyamok Elágazások feltételes kiterítése (utasítás limit) Speciális kiértékelési folyamat, ha a feltétel nem teljesül #pragma unroll

Optimalizálási kérdések cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); kernel<<<grid, block>>>(a_d); cpuFunction(); Optimalizálási kérdések Kód szervezés Ciklus változók Előjeles egész az előjel nélküli helyett Elágazást tartalmazó kódban kerüljük a szinkronizálást A __syncthreads() hívásra minden szálnak rá kell futnia Kernelből hívható függvények speciális kezelése Divergens kódból hívás helyett flaggel jelezzünk