Magas szintű optimalizálás

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

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

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

OpenCL - The open standard for parallel programming of heterogeneous systems

Párhuzamos és Grid rendszerek

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

GPGPU: Általános célú grafikus processzorok cgpu: computational GPU GPGPU = cgpu Adatpárhuzamos gyorsító: dedikált eszköz, ami eleve csak erre

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

Nyíregyházi Egyetem Matematika és Informatika Intézete. Input/Output

SzA19. Az elágazások vizsgálata

GPGPU. Architektúra esettanulmány

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

Ismerkedjünk tovább a számítógéppel. Alaplap és a processzeor

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

Jurek Zoltán, Tóth Gyula

CUDA alapok CUDA projektek. CUDA bemutató. Adatbányászat és Webes Keresés Kutatócsoport SZTAKI

CUDA haladó ismeretek

Digitális rendszerek. Digitális logika szintje

Digitális rendszerek. Utasításarchitektúra szintje

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

Grafikus csővezeték 1 / 44

GPU alkalmazása az ALICE eseménygenerátorában

Az interrupt Benesóczky Zoltán 2004

elektronikus adattárolást memóriacím

GPU-k a gravitációs hullám kutatásban

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

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

Heterogén számítási rendszerek gyakorlatok (2017.)

GPU-Accelerated Collocation Pattern Discovery

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

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

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

ROBUSZTUS GPGPU PLUGIN FEJLESZTÉSE A RAPIDMINER ADATBÁNYÁSZATI SZOFTVERHEZ

Párhuzamos programozási platformok

Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon. Készítette: Kovács Andor. 2011/2012 első félév

Párhuzamos programozási platformok

Memóriák - tárak. Memória. Kapacitás Ár. Sebesség. Háttértár. (felejtő) (nem felejtő)

6. óra Mi van a számítógépházban? A számítógép: elektronikus berendezés. Tárolja az adatokat, feldolgozza és az adatok ki és bevitelére is képes.

Párhuzamos programok futásának kiértékelése Scalasca profiler segítségével

Feladatlap: Számítógép összetevők keresése

Eichhardt Iván GPGPU óra anyagai

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

A számítógép egységei

Eichhardt Iván GPGPU óra anyagai

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

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

Architektúra, cache. Mirıl lesz szó? Mi a probléma? Teljesítmény. Cache elve. Megoldás. Egy rövid idıintervallum alatt a memóriahivatkozások a teljes

egy szisztolikus példa

Hozzáférés a HPC-hez, kezdő lépések (előadás és demó)

Számítógép Architektúrák

Heterogén számítási rendszerek gyakorlatok (2018.)

Számítógép Architektúrák

Processzor (CPU - Central Processing Unit)

Assembly. Iványi Péter

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

Bevezetés a párhuzamos programozási koncepciókba

Digitális rendszerek. Mikroarchitektúra szintje

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

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

Virtualizációs technológiák Linux alatt (teljesítményteszt)

OPERÁCIÓS RENDSZEREK. Elmélet

Informatika érettségi vizsga

Fábián Zoltán Hálózatok elmélet

Mikrorendszerek tervezése

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

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

Hardver Ismeretek IA32 -> IA64

Operációs rendszerek III.

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

KUTATÁSOK INFORMATIKAI TÁMOGATÁSA. Dr. Szénási Sándor

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

Programozási nyelvek 6. előadás

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Java II. I A Java programozási nyelv alapelemei

Programozási nyelvek a közoktatásban alapfogalmak I. előadás

Architektúra, megszakítási rendszerek

Operációs rendszerek. Az NT folyamatok kezelése

5. Fejezet : Lebegőpontos számok. Lebegőpontos számok

8. Fejezet Processzor (CPU) és memória: tervezés, implementáció, modern megoldások

8. Fejezet Processzor (CPU) és memória: tervezés, implementáció, modern megoldások

Grafikus kártyák, mint olcsó szuperszámítógépek - I.

Bepillantás a gépházba

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

Architektúra, memóriák

Számítógép Architektúrák

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

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

Komputeralgebra Rendszerek

Utolsó módosítás:

Nagy adattömbökkel végzett FORRÓ TI BOR tudományos számítások lehetőségei. kisszámítógépes rendszerekben. Kutató Intézet

GPGPU-k és programozásuk

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

Bevitel-Kivitel. Eddig a számítógép agyáról volt szó. Szükség van eszközökre. Processzusok, memória, stb

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

Dr. Illés Zoltán

Virtualizációs Technológiák Bevezetés Kovács Ákos Forrás, BME-VIK Virtualizációs technológiák

5. tétel. A számítógép sematikus felépítése. (Ábra, buszok, CPU, Memória, IT, DMA, Periféria vezérlő)

National Instruments NI LabVIEW gyakorlati szeminárium: Szoftver telepítési segédlet

Átírás:

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 1 P 1 P N GPGPU példa: N: nagyon nagy S 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 1/(1 P) S 1/(1 3/ 4) 4, ha a párhuzamosítható a ¾-e a kódnak

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ő S N ( 1 P)(1 N)

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

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

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 9 9 Az elméleti sávszélesség: (1.85 10 (384 / 8) 2) /10 177.6GB / s 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 9 Effektív sávszélesség: B /10 Példa: 2048x2048-as mátrix másolása 2048 2 4 2 /10 9 r B w / time / time

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

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 cudamemcpyasync(a_d, a_h, size, cudamemcpyhosttodevice, 0); kernel<<<grid,block>>>(a_d); cpufunction(); Memória másolás és kernel futtatás átlapolása cudastreamcreate(&stream1); cudastreamcreate(&stream2); cudamemcpyasync(a_d, a_h, size, cudamemcpyhosttodevice, stream1); kernel<<<grid,block,0,stream2>>>(b_d);

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); }

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ó

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

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

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

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

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 Warp méret 32, Bankok száma 32

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

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

Hogyan válasszuk meg a munkaméretet? Occupancy Az aktív és maximálisan indítható warpok aránya

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

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)

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

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