GPGPU-k és programozásuk - tankonyvtar.hu...3.5.6. b) A hardveres függőség ellenőrzés...
Transcript of GPGPU-k és programozásuk - tankonyvtar.hu...3.5.6. b) A hardveres függőség ellenőrzés...
Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
Dezső, Sima Sándor, Szénási
Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk írta Dezső, Sima és Sándor, Szénási Szerzői jog © 2013 Typotex
Kivonat
A processzor technika alkalmazásának fejlődése terén napjaink egyik jellemző tendenciája a GPGPU-k rohamos
térnyerése a számításigényes feladatok futtatásához mind a tudományos, mind a műszaki és újabban a pénzügyi-
üzleti szférában.
A tárgy célja kettős. Egyrészt megismerteti a hallgatókat a GPGPU-k működési elveivel, felépítésével,
jellemzőivel, valamint a fontosabb NVIDIA és AMD GPGPU implementációkkal, másrészt a tárgy gyakorlati
ismereteket nyújt az adatpárhuzamos programozás és kiemelten a GPGPU-k programozása, programok
optimalizálása területén a CUDA nyelv és programozási környezetének megismertetésén keresztül.
Lektorálta: Dr. Levendovszky János, Dr. Oláh András
iii Created by XMLmind XSL-FO Converter.
Tartalom
I. GPGPU-k ........................................................................................................................................ 1 Cél .......................................................................................................................................... ix 1. Bevezetés a GPGPU-kba .................................................................................................... 10
1. Objektumok ábrázolása háromszögekkel ................................................................. 10 1.1. GPU-k shadereinek főbb típusai .................................................................. 11
2. Él- és csúcs shader modellek funkcióinak egybeolvadása ........................................ 12 3. Nvidia GPU-k és Intel P4 ill. Core2 CPU-k FP32/FP64 teljesítményének összehasonlítása
[7] ................................................................................................................................. 14 4. AMD GPU-k csúcs FP32 teljesítménye [8] ............................................................... 15 5. GPU-k FP32 feldolgozási teljesítményének fejlődése [9] ........................................ 16 6. Nvidia GPU-k és Intel P4, Core2 CPU-k sávszélességének fejlődése [7] ................ 16 7. CPU-k és GPU-k főbb jellemzőinek összevetése [12] .............................................. 17
2. A GPGPU modell virtuális gép elve .................................................................................. 19 1. GPGPU-k virtuális gép modellje .............................................................................. 19
1.1. GPGPU-k virtuális gép modellje .................................................................. 19 1.2. Pseudo assembly kód hordozhatóságának előnyei ....................................... 19 1.3. Az alkalmazásfejlesztés fázisai - 1 ............................................................... 19 1.4. Az alkalmazás végrehajtásának fázisai - 2 ................................................... 20 1.5. Alkalmazások leírása eltérő absztrakciós szinteken ..................................... 20
2. GPGPU-kon alapuló masszívan adatpárhuzamos számítási modell ......................... 21 2.1. GPGPU-k specifikációja különböző absztrakciós szinteken ........................ 21 2.2. GPGPU-k virtuális gép szintű specifikációja ............................................... 22 2.3. Az GPGPU alapú masszívan párhuzamos adatfeldolgozási modell ............. 22 2.4. A GPGPU alapú masszívan párhuzamos számítási modellek térnyerése .... 22 2.5. A tárgyalt számítási modell kiválasztása ...................................................... 23 2.6. A használt terminológia kiválasztása ........................................................... 23
2.6.1. A GPGPU alapú masszívan párhuzamos adatfeldolgozási modellre SIMT
(Single instruction Multiple Threads) számítási modell néven hivatkozunk. 23 2.6.2. A GPGPU alapú masszívan adatpárhuzamos számítási modellel kapcsolatos
kifejezések megválasztása ......................................................................... 23 3. A SIMT számítási modell ......................................................................................... 24
3.1. A SIMT számítási modell főbb komponensei .............................................. 24 3.2. A számítási feladat modellje ........................................................................ 24
3.2.1. A szál modell ................................................................................... 25 3.2.2. A kernel modell ............................................................................... 29
3.3. A platform modellje ..................................................................................... 30 3.3.1. A számítási erőforrások modellje .................................................... 31 3.3.2. A memória modell ........................................................................... 35
3.4. A végrehajtási modell .................................................................................. 39 3.4.1. A SIMT végrehajtás elve ................................................................. 39 3.4.2. A feladat szétosztása a PE-k felé ..................................................... 43 3.4.3. Az adatmegosztás elve ..................................................................... 47 3.4.4. Az adatfüggő végrehajtás elve ......................................................... 48 3.4.5. A szinkronizáció elve ...................................................................... 50
4. GPGPU-k pseudo ISA szintű leírása ........................................................................ 51 4.1. Pseudo ISA-k leírása .................................................................................... 52 4.2. Mintapélda: Az Nvidia PTX virtuális gép pseudo ISA szintű leírása .......... 52 4.3. Mintapélda: Az Nvidia PTX virtuális gép pseudo ISA szintű leírása .......... 53 4.4. Nvidia számítási képesség (számítási képesség) elve [31], [1] .................... 54 4.5. a) A funkcionális jellemzők, vagyis a számítási képességek összehasonlítása
egymást követő Nvidia pseudo ISA (PTX) verziókban [32] ............................... 55 4.6. b) Az eszközjellemzők fejlődésének összehasonlítása egymást követő Nvidia
pseudo ISA (PTX) számítási képességekben [32] .............................................. 56 4.7. c) Számítási képességhez kötött architektúra specifikációk az Nvidia PTX-ben [32]
.............................................................................................................................. 56
GPGPU-k és programozásuk
iv Created by XMLmind XSL-FO Converter.
4.8. d) Natív aritmetikai utasítások végrehajtási sebessége az Nvidia PTX számítási
képességeinek egymást követő verzióiban (utasítás / óraciklus/SM) [7] ............ 56 4.9. Egymást követő CUDA SDK-kkal megjelent PTX ISA verziók, valamint az általuk
támogatott számítási képesség verziók (sm[xx]) (A táblázatban ez Supported Targets
néven szerepel) [20] ............................................................................................ 57 4.10. Nvidia GPGPU magjai és kártyái által támogatott számítási képesség verziók [32]
.............................................................................................................................. 58 4.11. A PTX kód előre hordozhatósága [31] ....................................................... 58 4.12. Egy megadott GPGPU számítási képesség verzióra fordított objektum fájlra
(CUBIN file) vonatkozó kompatibilitási szabályok [31] .................................... 58 3. GPGPU magok és kártyák áttekintése ................................................................................ 59
1. Általános áttekintés ................................................................................................... 59 1.1. GPGPU magok ............................................................................................. 59 1.2. Az Nvidia duál-GPU grafikus kártyáinak főbb jellemzői ............................ 62 1.3. Az AMD/ATI duál-GPU grafikus kártyáinak főbb jellemzői ...................... 62 1.4. Megjegyzés az AMD alapú grafikus kártyákhoz [36], [37] ......................... 62
2. Az Nvidia grafikus magok és kártyák főbb jellemzőinek áttekintése ....................... 63 2.1. Az Nvidia grafikus magok és kártyák főbb jellemzői .................................. 63
2.1.1. Egy SM felépítése a G80 architektúrában ....................................... 64 2.1.2. Az Nvidia GPGPU kártyáinak pozicionálása a termékspektrumukon belül
[41] ............................................................................................................ 67 2.2. Példák az Nvidia grafikus kártyáira ............................................................. 68
2.2.1. Nvidia GeForce GTX 480 (GF 100 alapú) [42] ............................... 68 2.2.2. Párba állított Nvidia GeForce GTX 480 kártyák [42] (GF100 alapú) 68 2.2.3. Nvidia GeForce GTX 480 és 580 kártyák [44] ................................ 69 2.2.4. Nvidia GTX 680 kártya [80] (GK104 alapú) ................................... 70 2.2.5. Nvidia GTX Titan kártya [81] (GK110 alapú) ................................ 70
3. Az AMD grafikus magok és kártyák főbb jellemzőinek áttekintése ........................ 71 3.1. Az AMD grafikus magok és kártyák főbb jellemzői .................................... 71 3.2. Példák AMD grafikus kártyákra .................................................................. 75
3.2.1. ATI HD 5970 (gyakorlatilag RV870 alapú) [46] ............................ 76 3.2.2. ATI HD 5970 (RV870 alapú) [47] .................................................. 76 3.2.3. AMD HD 6990 (Cayman alapú) [48] .............................................. 77 3.2.4. AMD Radeon HD 7970 (Tahiti XT, Southern Islands alapú) - Első GCN
megvalósítás [49] ....................................................................................... 77 3.2.5. GPGPU árak 2012 nyarán [50] ........................................................ 78
4. Az Nvidia Fermi családhoz tartozó magok és kártyák ....................................................... 80 1. A Fermi család áttekintése ........................................................................................ 80
1.1. A Fermi főbb alcsaládjai .............................................................................. 81 2. A Fermi PTX 2.0 legfontosabb újításai .................................................................... 81
2.1. A PTX 2.0 áttekintése .................................................................................. 81 2.2. A PTX 2.0 pseudo ISA főbb újításai ............................................................ 82
2.2.1. a) A változók és a pointerek számára biztosított egységesített címtér mely
azonos load/store utasításkészlettel érhető el - 1 [11] ................................ 82 2.2.2. a) A változók és a pointerek számára biztosított egységesített címtér mely
azonos load/store utasításkészlettel érhető el - 2 [11] ................................ 83 2.2.3. b) 64-bites címzési lehetőség ........................................................... 84 2.2.4. c) Új utasítások, amelyek támogatják az OpenCL és DirectCompute API-kat
..................................................................................................................... 84 2.2.5. d) A predikáció teljeskőrű támogatása [51] ..................................... 84 2.2.6. e) A 32- és 64-bites lebegőpontos feldolgozás teljeskörű IEEE 754-3008
támogatása ................................................................................................. 85 2.2.7. A Fermi GPGPU-kra történő programfejlesztések megkönnyítése [11]
85 3. A Fermi mikroarchitektúrájának főbb újításai és továbbfejlesztései ........................ 85
3.1. Főbb újítások ................................................................................................ 85 3.2. Főbb továbbfejlesztések ............................................................................... 85 3.3. Főbb architekturális újdonságok a Fermiben ............................................... 85
3.3.1. a) Párhuzamos kernel futtatás [52], [18] .......................................... 86 3.3.2. b) Valódi kétszintű cache hierarchia [11] ........................................ 86
GPGPU-k és programozásuk
v Created by XMLmind XSL-FO Converter.
3.3.3. c) SM-enként konfigurálható osztott memória és L1 cache [11] ..... 87 3.3.4. d) ECC támogatás [11] .................................................................... 88
3.4. A Fermi főbb architektúrális továbbfejlesztései ........................................... 89 3.4.1. a) Jelentősen megnövelt FP64 teljesítmény ..................................... 89
3.5. Aritmetikai műveletek átviteli sebessége óraciklusonként és SM-enként [13] 89 3.5.1. b) Jelentősen csökkentett kontextus váltási idők [11] ...................... 89 3.5.2. c) 10-20-szorosára felgyorsított atomi memória műveletek [11] ..... 90
4. A Fermi GF100 mikroarchitektúrája ........................................................................ 90 4.1. A Fermi GF100 felépítése [18], [11] ............................................................ 90 4.2. A Fermi GT100 magasszintű mikroarchitektúrája ....................................... 90 4.3. Az Nvidia GPGPU-k magasszintű mikroarchitektúrájának fejlődése [52] .. 91 4.4. Cuda GF100 SM felépítése [19] ................................................................... 92 4.5. Az Nvidia GPGPU-iban található magok (SM) fejlődése - 1 ...................... 92 4.6. Az Nvidia GPGPU-iban található magok (SM) fejlődése - 2 ...................... 94 4.7. A Fermi GF100 GPGPU felépítése és működése ......................................... 95
4.7.1. A Cuda GF100 SM felépítése [19] .................................................. 95 4.7.2. Egy ALU („CUDA mag”) ............................................................... 96
4.8. SIMT végrehajtás elve soros kernel végrehajtás esetén ............................... 97 4.9. A Fermi GF100 GPGPU működési elve ...................................................... 97 4.10. Feladat ütemezés alfeladatai ....................................................................... 97 4.11. Kernelek ütemezése az SM-ekre [25], [18] ................................................ 98 4.12. Azonos kernelhez tartozó szálblokkok SM-hez rendelése ......................... 98 4.13. A CUDA szál blokkok fogalma és jellemzői [53] ...................................... 99 4.14. Szál blokkok warp-okká történő szegmentálása [59] ............................... 100 4.15. Warpok ütemezése végrehajtásra az SM-ekre .......................................... 101 4.16. A Fermi GF100 mikroarchitektúra blokk diagrammja és működésének leírása
101 4.17. Feltételezett működési elv - 1 ................................................................... 103 4.18. Feltételezett működési elv - 2 ................................................................... 104 4.19. Feltételezett működési elv - 3 ................................................................... 105 4.20. Példa: Aritmetikai műveletek kibocsájtási sebessége (művelet/órajel) SM-enként
[13] .................................................................................................................... 107 4.21. A Fermi GF100 SM warp ütemezési politikája - 1 .................................. 108 4.22. A Fermi GF100 SM warp ütemezési politikája - 2 .................................. 109 4.23. A Fermi GF100 maximális teljesítményének becslése - 1 ....................... 112 4.24. A Fermi GF100 maximális teljesítményének becslése - 2 ....................... 114
5. A Fermi GF104 mikroarchitektúrája ...................................................................... 116 5.1. SM-enként rendelkezésre álló feldolgozó egységek a GF104 és a GF100 esetében
117 5.2. A GF 104/114 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-
enként [13] ......................................................................................................... 118 5.3. Warp kibocsájtás a Fermi GF104-ben ......................................................... 118 5.4. A Fermi GF104 alapú GTX 460-as kártya maximális számítási teljesítmény adatai
119 6. A Fermi GF110 mikroarchitektúrája ...................................................................... 120
6.1. A Fermi GF110 mikroarchitektúrája [64] ................................................... 120 6.2. A Fermi GF110 felépítése [65] .................................................................. 120 6.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66]
121 6.4. A GF 100/110 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-
enként [13] ........................................................................................................ 122 7. A Fermi GF114 mikroarchitektúrája ...................................................................... 123
7.1. A Fermi GF114 magjának felépítése a GTX 560-as kártyában [67] .......... 123 7.2. A Fermi GF114 mikroarchitektúrája .......................................................... 124 7.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66]
125 7.4. A GF 104/114 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-
enként [13] ........................................................................................................ 125 5. Az Nvidia Kepler családhoz tartozó magok és kártyák .................................................... 127
1. Az Nvidia Kepler családjának áttekintése .............................................................. 127
GPGPU-k és programozásuk
vi Created by XMLmind XSL-FO Converter.
1.1. A Kepler alcsaládjai ................................................................................... 127 1.2. A GK104 Kepler mag [76] ......................................................................... 127 1.3. A GK110 Kepler mag [70] ......................................................................... 128 1.4. Az Nvidia Kepler GK104 és GK110 magjainak főbb tulajdonságai [70] .. 128
2. A Kepler PTX 3.x főbb újításai .............................................................................. 129 3. A Kepler mikroarchitektúrájának főbb újításai ....................................................... 129
3.1. a) Dinamikus párhuzamosság [70] ............................................................. 129 3.1.1. A Kepler GPU-kban használt dinamikus párhuzamosság elve ...... 130 3.1.2. Dinamikus párhuzamosság előnyei [70] ........................................ 130
3.2. b) A Hyper-Q ütemezési mechanizmus ...................................................... 130 3.2.1. A Hyper-Q ütemező mechanizmus lehetséges gyorsító hatása ...... 135
3.3. c) Grid Management Unit .......................................................................... 136 3.4. d) A GPU Direct ........................................................................................ 136 3.5. A Kepler mikroarchitektúrájának főbb továbbfejlesztései ......................... 137
3.5.1. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 1 ................................................... 138 3.5.2. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 2 ................................................... 138 3.5.3. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 3 ................................................... 139 3.5.4. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 4 ................................................... 139 3.5.5. A Fermi és Kepler feldolgozó egységei lapkaméretének és energia
fogyasztásának összehasonlítása [76] ...................................................... 139 3.5.6. b) A hardveres függőség ellenőrzés egyszerűsítése a fordító által az
ütemezőnek szolgáltatott kulcsszavak (compiler hints) segítségével ...... 141 3.5.7. c) SMX-enként négyszeres warp ütemező bevezetése .................. 141 3.5.8. Rendelkezésre álló számítási erőforrások a Kepler SMX és a Fermi SM
esetében ................................................................................................... 142 3.5.9. d) A szálanként elérhető regiszterek számának megnégyszerezése 143 3.5.10. A Kepler magokban bevezetett szálanként elérhető regiszterszám
négyszerezésének hatása .......................................................................... 143 3.5.11. e) Egy általános célra használható 48 KB-os, csak olvasható adat
gyorsítótár bevezetése .............................................................................. 143 3.5.12. f) Az L2 cache méret és sávszélesség megduplázása a Fermihez képest
144 4. Az Nvidia GK104 Kepler magja, és a hozzá tartozó kártyák ................................. 144
4.1. A Kepler alcsaládjai ................................................................................... 144 4.2. GK104 Kepler mag [76] ............................................................................. 145 4.3. Az Nvidia GK104 mag lapkájának képe [78] ............................................ 145 4.4. A Kepler GK104 mag SMX-ének blokkdiagrammja [76] ......................... 146 4.5. A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32 és FP64
teljesítménye ..................................................................................................... 147 4.5.1. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32
teljesítménye - 1 ...................................................................................... 147 4.5.2. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32
teljesítménye - 2 [70] ............................................................................... 147 4.5.3. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32
teljesítménye - 3 ...................................................................................... 148 4.5.4. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64
teljesítménye - 1 ...................................................................................... 148 4.5.5. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64
teljesítménye - 2 [70] ............................................................................... 149 4.5.6. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64
teljesítménye - 3 ...................................................................................... 149 5. Az Nvidia GK110 Kepler magja, és a hozzá tartozó kártyák ................................. 149
5.1. A Kepler alcsaládjai ................................................................................... 149 5.2. A GK110 mag ............................................................................................ 150 5.3. A GK110 Kepler mag [70] ......................................................................... 150
5.3.1. Az Nvidia Kepler GK110 magjának fotója [70] ............................ 150
GPGPU-k és programozásuk
vii Created by XMLmind XSL-FO Converter.
5.3.2. Az Nvidia Kepler GK110 magjának felépítése [79] ...................... 151 5.3.3. Az Nvidia GK110 és GK104 magjainak összehasonlítása [79] ..... 152 5.3.4. A Kepler GK110 SMX-ének blokkdiagrammja [70] ..................... 153 5.3.5. a) A GK110 alapú GeForce GTX Titan grafikus kártya maximális FP32
teljesítménye ............................................................................................ 154 5.3.6. b) A GK110 alapú GeForce GTX Titan grafikus kártya maximális FP64
teljesítménye ............................................................................................ 154 6. Az Nvidia mikroarchitektúráinak fejlődése ............................................................ 155
6.1. a) Az Nvidia Fermi előtti GPGPU-inak FP32 warp kibocsájtási hatékonysága 155 6.2. b) Az Nvidia Fermi és Kepler GPGPU-inak FP32 warp kibocsájtási hatékonysága
155 6.3. c) Az Nvidia Fermi előtti GPGPU-inak FP64 teljesítmény növekedése .... 156 6.4. d) Az Nvidia Tesla GPGPU-inak FP64 teljesítmény növekedése .............. 156
6. Az AMD heterogén rendszerarchitektúrája ...................................................................... 158 1. A HSA elve ............................................................................................................. 158
1.1. A HSA elv első nyivános bemutatása (6/2011) [84], [85] ......................... 158 1.2. A HSA (Heterogeneous Systems Architecture) céljai ................................ 158
1.2.1. AMD’s view of the evolution path to heterogeneous computing (6/2011)
[84] .......................................................................................................... 159 2. A HSA célkitűzései [85], [87] ................................................................................ 159
2.1. a) A CPU és a GPU számára közös címteret biztosító memória model [87] 160 2.2. b) Felhasználói szintű parancs várakozósor [87] ........................................ 160 2.3. c) A HAS IL virtuális ISA (HSA köztes réteg - HSA Intermediate Layer) [87]. [88]
............................................................................................................................ 160 2.4. d) Az alkalmazásfeldolgozás modellje [88] ............................................... 160 2.5. Az alkalmazásfeldolgozás elve a HSA-ban [87] ........................................ 161 2.6. A futtatási fázis [87] ................................................................................... 162 2.7. Heterogeneous Sytem Architecture Foundation (HSAF - Heterogén Rendszer
architektúra alapítvány) ..................................................................................... 164 2.8. Az AMD útiterve a HSA implementációjára [90] ...................................... 164 2.9. Az AMD útiterve a HSA implementációjára - részletezés [85] ................. 165
7. Az AMD Southern Islands családhoz tartozó magok és kártyák ..................................... 166 1. Az AMD Southern Islands családjának áttekintése ................................................ 166
1.1. Az AMD útiterve a HSA implementációjára (Financial Analyst Day 2012 február)
[90] .................................................................................................................... 166 1.2. Az AMD új GPU mikroarchitektúrája: a Graphics Core Next (GCN) Következő
Grafikus Mag) ................................................................................................... 166 1.3. A GCN mikroarchitektúra bejelentése és megvalósítása ........................... 167 1.4. Az AMD útiterve, mely a GCN mikroarchitektúra megjelenését jelzi a Southern
Islands grafikai családban (2012 február) [94] .................................................. 167 2. A Southern Islands mikroarchitektúra főbb újításai ............................................... 167
2.1. VLIW4 alapú GPU-k helyett SIMD alapú GPU bevezetése ...................... 167 2.1.1. Az ATI (melyet AMD 2006-ban felvásárolt) és az AMD GPU-k
mikroarchitektúra fejlődésének főbb állomásai [95] ............................... 168 2.1.2. VLIW alapú ALU-k használata GPU-kban ................................... 168 2.1.3. VLIW-alapú ALU-k ...................................................................... 169 2.1.4. Hullámfront sorozat átkódolása VLIW4 utasításokká [96] ........... 169 2.1.5. Hullámfrontok ütemezése VLIW4 kódolást feltételezve [96] ....... 170 2.1.6. Grafikus feldolgozás és VLIW alapú ALU-k ................................ 171 2.1.7. Az AMD motivációja a korábbi GPU-kban használt VLIW alapú ALU-k
használatára ............................................................................................. 171 2.1.8. Feldolgozó egységek (EU) száma Nvidia és AMD GPU-k esetében 172 2.1.9. Az AMD motivációja első GPU-iban VLIW5 alapú ALU-k használatára
[97] .......................................................................................................... 172 2.1.10. Az AMD VILW5 ALU-jának kialakítása ..................................... 172 2.1.11. A továbbfejlesztett VLIW5 ALU bevezetése .............................. 174 2.1.12. A VLIW4 bevezetése a továbbfejlesztett VLIW5 kialakítás helyett - 1
174 2.1.13. A VLIW4 bevezetése a továbbfejlesztett VLIW5 kialakítás helyett - 2
174
GPGPU-k és programozásuk
viii Created by XMLmind XSL-FO Converter.
2.1.14. Az AMD továbbfejlesztett VLIW5 és VLIW4 megvalósításainak
összehasonlítása [17] ............................................................................... 175 2.1.15. A numerikus számítások fontosságának növekedése és ezzel
összefüggésben a GCN microarchitektúra bevezetése ............................ 177 2.1.16. A VLIW4 alapú ALU-k leváltása SIMD alapú GCN architektúrájú ALU-
kra [91] .................................................................................................... 177 2.2. Az AMD ZeroCore technológiája [49] ...................................................... 177
2.2.1. A ZeroCore technológia segítségével elérhető passzív állapotú energia
fogyasztás [104] ....................................................................................... 178 2.2.2. Az AMD PowerTune technológiája .............................................. 178 2.2.3. A Northern Islands családban bevezetett PowerTune technológia (HD
6900/Cayman), 2010 december) [106] .................................................... 179 2.2.4. A PowerTune technológia használatának előnye [105] ................. 179
3. Az AMD Southern Islands kártyacsaládja .............................................................. 180 3.1. A Southern Islands család áttekintése ........................................................ 180
3.1.1. Az AMD GCN bejelentése és megvalósítása ................................ 180 3.1.2. A Southern Islands család főbb jellemzői ...................................... 181 3.1.3. Southern Islands család alcsaládjai - 1 [107] ................................. 181 3.1.4. A Southern Islands család alcsaládjai - 2 [108] ............................. 182 3.1.5. Az AMD és Nvidia grafikus magjai lapkaméreteinek összehasonlítása [95]
................................................................................................................... 182 3.1.6. AMD GCN bejelentése és megvalósítása ...................................... 183
3.2. A Radeon HD7970 grafikus kártya Tahiti XT magjának mikroarchitektúrája 183 3.2.1. A Tahiti XT mag mikroarchitektúrájának áttekintése [95] ............ 183 3.2.2. A 7950 (Tahiti Pro) és a 7970 (Tahiti XT) magokat használó kártyák közötti
különbségek ............................................................................................. 184 3.2.3. A számítási egységek (CU - Compute Unit) architekturális áttekintése -
egyszerűsített blokkdiagramm [95] ......................................................... 185 3.2.4. Egy számítási egység (CU) részletes blokkdiagrammja [108] ...... 185 3.2.5. Egy számítási egység (CU) fő egységei ........................................ 185 3.2.6. A CU négy 16-széles SIMD egysége [110] (nagymértékben egyszerűsített
leírás) ....................................................................................................... 186 3.2.7. A CU skalár egysége [110] ............................................................ 186 3.2.8. A HD 7970 (Tahiti XT) grafikai kártya maximális FP32 és FP64
teljesítménye ............................................................................................ 186 3.2.9. A HD 7970 (Tahiti XT) cache hierarchiája [95] ............................ 187 3.2.10. CPU-nkénti és GPU-nkénti elérhető tárhelyek a HD 7970-ben (Tahiti XT)
[110] ........................................................................................................ 187 3.2.11. A HD 7970 (Tahiti XT) magban található memóriák méretei, valamint
azok olvasási sebessége [16] ................................................................... 188 3.3. Működési elvük (Ismétlés a 3.2-es fejezetből) ........................................... 189
3.3.1. Számítási feladatok ........................................................................ 189 3.3.2. Munkaelemek ................................................................................ 190 3.3.3. A kernel ......................................................................................... 191 3.3.4. Munkacsoportok ............................................................................ 191 3.3.5. Hullámfrontok - 1 .......................................................................... 192 3.3.6. Hullámfrontok - 2 .......................................................................... 192 3.3.7. Működési elv ................................................................................. 193 3.3.8. Számítási feladatok elindítása a GPU-n ......................................... 193 3.3.9. Számítási feladatok végrehajtása - 1 .............................................. 193 3.3.10. Számítási feladatok végrehajtása - 2 ............................................ 194 3.3.11. Számítási feladatok végrehajtása - 3 ............................................ 194
3.4. A HD 7970 (Tahiti XT) teljesítmény adatai és fogyasztása [110] ............. 194 3.4.1. a) A kártya teljesítménye játékokban ............................................. 195 3.4.2. a) Nagy teljesítményű grafikus kártyák teljesítménye játékokban - 1 [50]
195 3.4.3. a) Nagy teljesítményű grafikus kártyák teljesítménye játékokban - 2 [50]
195 3.4.4. b) Nagy teljesítményű grafikus kártyák teljesítménye számítási feladatokon
mérve [50] ............................................................................................... 196
GPGPU-k és programozásuk
ix Created by XMLmind XSL-FO Converter.
3.4.5. c) Terhelés alatti energia fogyasztás (teljes terhelésen) [50] ......... 197 3.4.6. d) Üresjárati fogyasztás [50] .......................................................... 198
8. Az AMD Sea Islands családja .......................................................................................... 200 1. A Sea Islands család helye az AMD 2013-as útitervében [111] ............................. 200 2. A Sea Islands család fő jellemzői ........................................................................... 200 3. Az AMD 2. generációs GCN-jének, a Sea Islands családnak a tervezett bevezetése 201 4. A HD 8950/70 grafikus kártyák fő paraméterei ..................................................... 201
9. Kitekintés ......................................................................................................................... 202 1. Nvidia útiterve 2014-re és tovább ........................................................................... 202
1.1. A Maxwell CPU + GPU ............................................................................. 202 1.2. A Volta CPU + GPU .................................................................................. 203 1.3. Volta processzor rétegezett DRAM-mal [113] .......................................... 203
2. AMD grafikai útiterve 2013-ra ............................................................................... 203 3. Az AMD asztali gépekbe szánt grafikai kártyáinak 2013-as útiterve ...................... 204 4. Az Intel Xeon Phi családja ..................................................................................... 204
4.1. A Knights Ferry protípusa .......................................................................... 205 4.2. Az MIC elnevezés módosítása Xeon Phi-re, és a nyílt forráskódú szoftverek
támogatása ......................................................................................................... 205 4.3. A Knights Corner processzor ..................................................................... 206 4.4. A Xeon Phi család főbb jellemzői [120] .................................................... 206 4.5. A Xeon Phi társprocesszor család elsőként megjelenő tagjai és főbb jellemzőik
[121] .................................................................................................................. 207 4.6. A Knights Corner (KCN) DPA felépítése [120] ........................................ 208 4.7. A Knights Corner mikroarchitektúrája [120] ............................................. 208 4.8. A lapka dupla gyűrűs összeköttetéseinek kialakítása [122] ....................... 209 4.9. A Knights Corner magjának blokk diagrammja [120] ............................... 209 4.10. A vektor feldolgozó egység blokkvázlata és futószalag alapú működése [120]
210 4.11. A Xeon Phi társprocesszor rendszer-architektúrája [122] ........................ 210 4.12. The Xeon Phi 5110P társprocesszor [124] ............................................... 211 4.13. A Xeon Phi társprocesszor nyáklap (hátoldal) [122] ............................... 212 4.14. Az aktív hűtéssel ellátott Xeon Phi 3100 szerelési ábrája [122] .............. 212 4.15. Az Intel többmagos, sokmagos és cluster architektúráinak közös fejlesztési
platformja [125] ................................................................................................ 213 4.16. Az Intel Knight Corner és a versenytársai teljesítmény hatékonyságának
összehasonlítása [120] ....................................................................................... 213 4.17. A Xeon Phi 5110P, SE10P/X és a 2-processzoros Intel Xeon szerver maximális
teljesítményének összehasonlítása [126] ........................................................... 214 4.18. Xeon 5110P és egy 2-processzoros Sandy Bridge alapú Xeon szerver
teljesítményének [126] ...................................................................................... 214 4.19. A Xeon Phi 5110P sebességének összehasonlítása egy 2-processzoros Xeon
szerverrel ........................................................................................................... 215 4.20. Az Intel Xeon Phi családjának útiterve [127] .......................................... 215 4.21. Assessing the peak FP64 performance of the Knights Corner coprocessor with that
of Nvidia’s and AMD’s recent devices ............................................................. 216 4.22. a) Intel Knights Corner családjának FP64 teljesítménye [126] ................ 216 4.23. b) Az Nvidia Tesla GPGPU-inak FP64 teljesítménye .............................. 217 4.24. c) AMD csúcskategóriás GPU-inak FP64 teljesítménye .......................... 218
10. Hivatkozások .................................................................................................................. 219 II. GPGPU-k és programozásuk ..................................................................................................... 226
1. Bevezetés ......................................................................................................................... 231 1. Bevezetés (1) .......................................................................................................... 231
1.1. GPU-k számítási kapacitása ....................................................................... 231 2. Bevezetés (2) .......................................................................................................... 231
2.1. Valós alkalmazások .................................................................................... 231 2.2. Grafikus Feldolgozó Egységek .................................................................. 232
2.2.1. Shaderek ........................................................................................ 232 2.3. Unified Shader Model ................................................................................ 232 2.4. GPGPU fogalom megjelenése .................................................................... 233 2.5. GPGPU helye és szerepe ............................................................................. 234
GPGPU-k és programozásuk
x Created by XMLmind XSL-FO Converter.
2.6. CPU-GPGPU összehasonlítás .................................................................... 234 2.7. Memória szerkezete ................................................................................... 235 2.8. SIMT végrehajtás ....................................................................................... 236
2. Programozási modell ........................................................................................................ 238 1. CUDA környezet alapjai ......................................................................................... 238
1.1. CUDA környezet ........................................................................................ 238 1.2. Szükséges komponensek ............................................................................ 238 1.3. CUDA környezet áttekintése ...................................................................... 239 1.4. CUDA környezet részei ............................................................................. 240 1.5. CUDA szoftver rétegek .............................................................................. 240 1.6. CUDA alapú fejlesztés lépései ................................................................... 241
2. Fordítás és szerkesztés ............................................................................................ 242 2.1. CUDA fordítás lépései ............................................................................... 242
2.1.1. Bemenet ......................................................................................... 242 2.1.2. Kimenet ......................................................................................... 243
2.2. nvcc fordító alapvető paraméterei .............................................................. 244 2.2.1. Fordítás céljának meghatározása ................................................... 244
2.3. nvcc fordító alapvető paraméterei (2) ........................................................ 244 2.4. nvcc fordító alapvető paraméterei (3) ........................................................ 245 2.5. nvcc fordító alapvető paraméterei (4) ........................................................ 245 2.6. Példa parancssori fordításra ....................................................................... 245 2.7. Fordítás áttekintése .................................................................................... 246
3. Platform modell ...................................................................................................... 246 3.1. CUDA platform modell .............................................................................. 246 3.2. CUDA platform modell (2) ........................................................................ 249 3.3. Hozzáférés az eszközökhöz ........................................................................ 250
3.3.1. CUDA eszköz kiválasztása ............................................................ 251 3.4. Eszközök adatai .......................................................................................... 251 3.5. Eszközök adatainak lekérdezése ................................................................ 251
3.5.1. Feladat 2.3.1 .................................................................................. 252 4. Memória modell ..................................................................................................... 252
4.1. CUDA memória modell ............................................................................. 252 4.1.1. Kapcsolat a hoszttal ....................................................................... 252
4.2. CUDA memória modell – globális memória ............................................. 253 4.3. CUDA memória modell – konstans memória ............................................ 254 4.4. CUDA memória modell – textúra memória ............................................... 255 4.5. CUDA memória modell – megosztott memória ......................................... 256 4.6. CUDA memória modell – regiszterek ........................................................ 257 4.7. CUDA memória modell – lokális memória ............................................... 258
4.7.1. Deklaráció .................................................................................... 258 4.8. Memória modell fizikai leképezése ............................................................ 259 4.9. Memory handling ....................................................................................... 261 4.10. Memória területek elérhetőség szerint ..................................................... 261 4.11. Dinamikus memóriakezelés – foglalás ..................................................... 262
4.11.1. Memória felszabadítás ................................................................. 262 4.12. Memória területek közötti másolás .......................................................... 262 4.13. Rögzített memória (pinned memory) ....................................................... 263 4.14. Másolás nélküli memória (zero-copy memory) ....................................... 264
5. Végrehajtási modell ................................................................................................ 264 5.1. CUDA végrehajtási modell - szálak ........................................................... 264 5.2. CUDA blokkok .......................................................................................... 265 5.3. Blokkok azonosítása .................................................................................. 265 5.4. Globális – lokális index .............................................................................. 266
5.4.1. Lokális azonosító ........................................................................... 266 5.4.2. Globális azonosító ......................................................................... 267
5.5. Néhány alapvető összefüggés .................................................................... 267 5.6. CUDA végrehajtási modell – kernel .......................................................... 267 5.7. CUDA végrehajtási modell – kernel indítása ............................................. 268 5.8. Kernel indítással kapcsolatos típusok ........................................................ 268 5.9. Kernel implementálása ............................................................................... 269
GPGPU-k és programozásuk
xi Created by XMLmind XSL-FO Converter.
5.10. Kernel elindítás példa ............................................................................... 269 5.11. Blokkokat kezelő kernel implementálása ................................................. 270 5.12. Blokkokat kezelő kernel indítás példa ...................................................... 270 5.13. Teljes alkalmazás elkészítése ................................................................... 270
5.13.1. Feladat 2.5.1 ................................................................................ 271 3. Programozási környezet ................................................................................................... 272
1. Visual Studio használata ......................................................................................... 272 1.1. Visual Studio lehetőségek .......................................................................... 272
1.1.1. New project wizard ........................................................................ 272 1.2. New project wizard .................................................................................... 272 1.3. Custom build rules ..................................................................................... 273 1.4. CUDA-val kapcsolatos project beállítások ................................................ 274
2. Számítási képességek ............................................................................................. 275 2.1. Számítási képességek (1) ........................................................................... 275 2.2. Számítási képességek (2) ........................................................................... 276 2.3. Számítási képességek (3) ........................................................................... 276 2.4. Compute capability (4) ................................................................................ 277 2.5. Néhány Nvidia GPU számítási képessége .................................................. 277 2.6. Néhány Nvidia GPU számítási képessége .................................................. 277
3. CUDA nyelvi kiterjesztés ....................................................................................... 278 3.1. CUDA language extensions ....................................................................... 278 3.2. Mindkét oldalon elérhető típusok ............................................................... 278
3.2.1. dim3 típus ..................................................................................... 278 3.3. Mindkét oldalon elérhető függvények ........................................................ 278 3.4. Csak eszköz oldalon elérhető változók ...................................................... 279 3.5. Csak eszköz oldalon elérhető függvények ................................................. 279 3.6. Csak hoszt oldalon elérhető függvények .................................................... 280
4. Aszinkron konkurens végrehajtás ........................................................................... 281 4.1. Stream-ek ................................................................................................... 281 4.2. Stream-ek létrehozás és megszüntetése ...................................................... 281 4.3. Stream-ek használata .................................................................................. 282 4.4. Példa a stream-ek használatára ................................................................... 283 4.5. Stream szinkronizáció ................................................................................ 283 4.6. Szinkronizációt magukba foglaló műveletek ............................................. 283 4.7. Stream időzítés [12] ................................................................................... 284 4.8. Konkurens végrehajtás támogatása ............................................................ 284 4.9. Példa blokkolt sorra ................................................................................... 285 4.10. Példa blokkolt sorra (2) ............................................................................ 285
5. CUDA események .................................................................................................. 286 5.1. Események létrehozása és megszüntetése .................................................. 286 5.2. Esemény rögzítése ...................................................................................... 286 5.3. Esemény szinkronizálása ........................................................................... 287 5.4. Esemény ellenőrzése .................................................................................. 287 5.5. Szinkronizáció eseményekkel .................................................................... 288 5.6. Szinkronizáció eseményekkel (példa) ........................................................ 288 5.7. Események között eltelt idő számítása ....................................................... 289 5.8. Eltelt idő számítása (példa) ........................................................................ 289
6. Egyesített Virtuális Címtér ..................................................................................... 289 6.1. CUDA Unified Virtual Address Management ........................................... 289 6.2. Egyesített Virtuális Címtér (UVA) ............................................................ 290 6.3. Egyesített Virtuális Címtér – elérhetőség ................................................... 290 6.4. Peer to peer kommunikáció az eszközök között ......................................... 291 6.5. UVA és a P2P átvitel .................................................................................. 292 6.6. P2P memória átvitel GPU-k között ............................................................ 292 6.7. P2P memória másolás GPU-k között ......................................................... 293 6.8. P2P memória hozzáférést bemutató kernel ................................................ 293 6.9. CUDA UVA összegzés .............................................................................. 294
4. Optimalizációs technikák ................................................................................................. 295 1. Megosztott memória használata ............................................................................. 295
1.1. Optimalizációs stratégiák ........................................................................... 295
GPGPU-k és programozásuk
xii Created by XMLmind XSL-FO Converter.
1.2. Mátrix szorzó alkalmazás elkészítése ........................................................ 295 1.2.1. Feladat 4.1.1 .................................................................................. 295
1.3. Többdimenziós mátrix a memóriában ........................................................ 296 1.4. Többdimenziós mátrix a memóriában ........................................................ 297 1.5. Több dimenziós mátrix a GPU memóriában ............................................... 297 1.6. Igazított elhelyezés ..................................................................................... 298 1.7. Igazított memóriakezelés ........................................................................... 299 1.8. Igazított memória másolása ........................................................................ 299 1.9. Mátrix szorzó alkalmazás elkészítése igazított memóriával ....................... 300
1.9.1. Feladat 4.1.2 .................................................................................. 300 1.10. Kernel igazított memóriakezeléssel .......................................................... 300 1.11. Kernel hívása igazított tömbök esetén ...................................................... 301 1.12. Megosztott memória kezelése .................................................................. 301 1.13. Ötlet a mátrix szorzás gyorsítására (csempe technika) ............................. 302 1.14. Mátrix szorzó alkalmazás elkészítése (megosztott memóriával) .............. 302
1.14.1. Feladat 4.1.3 ................................................................................ 302 1.15. Mátrix szorzás gyorsítása ......................................................................... 303 1.16. Mátrix szorzás gyorsítása (2) ................................................................... 303 1.17. Mátrix szorzás gyorsítása (3) ................................................................... 304 1.18. Mátrix szorzás gyorsítása (4) ................................................................... 305 1.19. Mátrix szorzás gyorsítása (5) ................................................................... 306 1.20. Optimalizált mátrix szorzás kernel ........................................................... 307 1.21. Összehasonlító vizsgálat .......................................................................... 308
2. Atomi műveletek használata ................................................................................... 308 2.1. Atomi műveletek szükségessége ................................................................ 308 2.2. CUDA atomi műveletek ............................................................................. 308 2.3. CUDA atomi műveletek - aritmetika ......................................................... 309 2.4. CUDA atomi műveletek – aritmetika (2) ................................................... 309 2.5. CUDA atomi műveletek – logikai függvények .......................................... 310
2.5.1. Feladat 4.2.1 .................................................................................. 310 2.6. Vektor legkisebb elemének értéke ............................................................. 310
2.6.1. Feladat 4.2.2 .................................................................................. 310 2.7. Memóriahozzáférések csökkentése – megosztott memória ........................ 310
2.7.1. Összehasonlító vizsgálat ................................................................ 311 2.8. Blokkon belüli párhuzamosítás .................................................................. 312
2.8.1. Feladat 4.2.3 .................................................................................. 312 2.9. Párhuzamos minimum - betöltés ................................................................ 312 2.10. Párhuzamos minimum – blokk minimuma .............................................. 313 2.11. Párhuzamos minimum - kernel ................................................................ 314 2.12. Párhuzamos minimum – kernel (2) .......................................................... 314 2.13. Összehasonlító vizsgálat .......................................................................... 314 2.14. Összehasonlító vizsgálat .......................................................................... 315
3. Kihasználtság .......................................................................................................... 315 3.1. A végrehajtás áttekintése ............................................................................ 315 3.2. Kihasználtság ............................................................................................. 316 3.3. Kihasználtság és a regiszterek kapcsolata .................................................. 316 3.4. Kihasználtság és megosztott memória ....................................................... 317 3.5. Kihasználtság és blokk méret ..................................................................... 317 3.6. CUDA Occupancy calculator ..................................................................... 318 3.7. CUDA Occupancy calculator - példa ......................................................... 318 3.8. CUDA Occupancy calculator – változó blokk méret hatása ...................... 319 3.9. CUDA Occupancy calculator – változó regiszter szám hatása .................. 319 3.10. CUDA Occupancy calculator – változó megosztott memória hatása ....... 320 3.11. Blokk mérettel kapcsolatos javaslatok [18] .............................................. 320
4. Parallel Nsight ........................................................................................................ 321 4.1. Parallel Nsight ............................................................................................ 321 4.2. Kernel nyomkövetés .................................................................................. 322 4.3. GPU memória régiók megtekintése ........................................................... 322 4.4. CUDA Debug Focus .................................................................................. 323 4.5. CUDA Device Summary ............................................................................ 323
GPGPU-k és programozásuk
xiii Created by XMLmind XSL-FO Converter.
4.6. CUDA Device Summary - rács .................................................................. 324 4.7. CUDA Device Summary - warp ................................................................ 324 4.8. PTX code nyomkövetése ............................................................................ 325 4.9. Memória ellenőrzés használata .................................................................. 326 4.10. CUDA memória ellenőrző minta eredmény ............................................. 326 4.11. Lehetséges hibakódok és jelentésük ......................................................... 327
5. CUDA könyvtárak ........................................................................................................... 329 1. CUBLAS könyvtár ................................................................................................. 329
1.1. CUBLAS Library ....................................................................................... 329 1.2. CUBLAS alapú alkalmazások fejlesztése .................................................. 329 1.3. CUBLAS függvények visszatérési értéke .................................................. 329 1.4. CUBLAS segítő függvények ...................................................................... 330 1.5. CUBLAS memória kezelés ........................................................................ 330 1.6. BLAS függvények áttekintése .................................................................... 331 1.7. Néhány CUBLAS 1. szintű függvény ........................................................ 331 1.8. Néhány CUBLAS 2. szintű függvény ........................................................ 332 1.9. Néhány CUBLAS 3. szintű függvény ........................................................ 332
6. CUDA verziók ................................................................................................................. 334 1. CUDA 4 újdonságok .............................................................................................. 334
1.1. CUDA 4.0 újdonságai ................................................................................ 334 1.2. Aktuális eszköz kiválasztása ...................................................................... 334 1.3. Aktuális eszköz – stream, események ........................................................ 334 1.4. Több-GPU példa ........................................................................................ 335 1.5. Több CPU szál használata .......................................................................... 335 1.6. Vektor szorzás több-GPU-s környezetben - kernel .................................... 336 1.7. Vektor szorzás több-GPU-s környezetben – memória foglalás .................. 336 1.8. Vektor szorzás több-GPU-s környezetben – kernel hívás .......................... 337 1.9. Vektor szorzás több-GPU-s környezetben – kernel hívás .......................... 337
2. CUDA 5 újdonságok .............................................................................................. 338 2.1. CUDA 5.0 újdonságok [26] ....................................................................... 338 2.2. Dinamikus párhuzamosság ......................................................................... 338
7. Felhasznált irodalom ........................................................................................................ 340 1. Felhasznált irodalom ............................................................................................... 340 2. Gyakran előforduló kifejezések fordításai ............................................................... 341
xiv Created by XMLmind XSL-FO Converter.
Az ábrák listája
1.1. ................................................................................................................................................... 10 1.2. ................................................................................................................................................... 10 1.3. ................................................................................................................................................... 11 1.4. Képpont/csúcs shader modellek (SM) támogatottsága az egymást követő DirectX verziókban és a
Microsoft operációs rendszerekben [2], [3] ..................................................................................... 11 1.5. ................................................................................................................................................... 13 1.6. Az egységesített shader architektúra alapelve [6] ...................................................................... 13 1.7. ................................................................................................................................................... 14 1.8. ................................................................................................................................................... 14 1.9. ................................................................................................................................................... 15 1.10. ................................................................................................................................................. 16 1.11. ................................................................................................................................................. 17 1.12. GPU és CPU lapkafelülete k kihasználtságának összehasonlítása [10] .................................. 17 1.13. ................................................................................................................................................. 17 2.1. ................................................................................................................................................... 19 2.2. ................................................................................................................................................... 20 2.3. ................................................................................................................................................... 20 2.4. ................................................................................................................................................... 20 2.5. ................................................................................................................................................... 21 2.6. GPGPU-k és adatpárhuzamos gyorsítók terminológiája ........................................................... 23 2.7. A SIMT számítási modell tervezési tere .................................................................................... 24 2.8. ................................................................................................................................................... 24 2.9. ................................................................................................................................................... 25 2.10. Az Ndimenziós tartomány értelmezése [12] ............................................................................ 25 2.11. A munkaelem értelmezése ([12] alapján) ............................................................................... 26 2.12. A munkacsoport értelmezése [12] .......................................................................................... 27 2.13. A hullámfrontok értelmezése [12] .......................................................................................... 28 2.14. ................................................................................................................................................. 29 2.15. A kernel modell értelmezése .................................................................................................... 29 2.16. ................................................................................................................................................. 30 2.17. ................................................................................................................................................. 30 2.18. ................................................................................................................................................. 31 2.19. A számítási erőforrások modellje [15] .................................................................................... 31 2.20. ................................................................................................................................................. 32 2.21. ................................................................................................................................................. 32 2.22. ................................................................................................................................................. 33 2.23. ................................................................................................................................................. 34 2.24. ................................................................................................................................................. 35 2.25. GPGPU-kon a virtuális gép szintjén elérhető tárterületek ....................................................... 35 2.26. ................................................................................................................................................. 35 2.27. ................................................................................................................................................. 36 2.28. ................................................................................................................................................. 36 2.29. ................................................................................................................................................. 37 2.30. ................................................................................................................................................. 37 2.31. Az AMD IL v2.0 alatt rendelkezésre álló tárhelyek [22] ......................................................... 38 2.32. ................................................................................................................................................. 38 2.33. A végrehajtási modell fő komponensei .................................................................................... 39 2.34. A végrehajtás modell fő fogalmai ............................................................................................ 39 2.35. Memóriaolvasás miatti várakozások elrejtését lehetővé tevő hullámfront ütemezés [24] ...... 40 2.36. CPUk és GPUk lapkaterületének eltérő kihasználtsága [10] ................................................... 40 2.37. A használt platform modell [15] .............................................................................................. 41 2.38. A SIMD végrehajtás elve ......................................................................................................... 41 2.39. SIMT végrehajtás elve ............................................................................................................. 42 2.40. A SIMT végrehajtás elve ......................................................................................................... 42 2.41. A SIMD és a SIMT végrehajtás összevetése ........................................................................... 43 2.42. A végrehajtás modell fő fogalmai ............................................................................................ 43
GPGPU-k és programozásuk
xv Created by XMLmind XSL-FO Converter.
2.43. A végrehajtási tartomány felbontása munkacsoportokra ......................................................... 44 2.44. A végrehajtási tartomány felbontása munkacsoportokra ......................................................... 44 2.45. ................................................................................................................................................. 45 2.46. ................................................................................................................................................. 45 2.47. ................................................................................................................................................. 46 2.48. ................................................................................................................................................. 46 2.49. A végrehajtás modell fő fogalmai ............................................................................................ 47 2.50. ................................................................................................................................................. 48 2.51. A végrehajtás modell fő fogalmai ............................................................................................ 48 2.52. Elágazások végrehajtása - 1 [26] ............................................................................................. 49 2.53. Elágazások végrehajtása - 2 [26] ............................................................................................. 49 2.54. Utasítás folyam végrehajtásának folytatása elágazás után [26] ............................................... 50 2.55. A végrehajtás modell fő fogalmai ............................................................................................ 50 2.56. ................................................................................................................................................. 51 2.57. ................................................................................................................................................. 52 2.58. ................................................................................................................................................. 52 2.59. ................................................................................................................................................. 53 2.60. ................................................................................................................................................. 53 2.61. ................................................................................................................................................. 54 2.62. ................................................................................................................................................. 55 2.63. ................................................................................................................................................. 56 2.64. ................................................................................................................................................. 56 2.65. ................................................................................................................................................. 56 2.66. ................................................................................................................................................. 57 2.67. ................................................................................................................................................. 58 3.1. A SIMT végrehajtás megvalósítási alternatívái ......................................................................... 59 3.2. Az Nvidia és AMD/ATI GPGPU vonalainak áttekintése .......................................................... 59 3.3. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (1) .................... 60 3.4. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (2) .................... 60 3.5. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (3) .................... 61 3.6. Main features of Nvidia’s dual-GPU graphics cards [33], [34] ................................................. 62 3.7. Az AMD/ATI duál-GPU grafikus kártyáinak főbb jellemzői [35] ............................................ 62 3.8. ................................................................................................................................................... 62 3.9. Az Nvidia Fermi előtti grafikus kártyái [33] ............................................................................ 63 3.10. A MAD (Multiply-ADD - Szorzás-Összeadás) művelet értelmezése [51] .............................. 64 3.11. ................................................................................................................................................. 64 3.12. Az Nvidia Fermi alapú grafikus kártyáinak főbb jellemzői [33] ............................................. 65 3.13. Az Nvidia Kepler alapú grafikus kártyáinak főbb jellemzői [33] ........................................... 66 3.14. ................................................................................................................................................. 67 3.15. ................................................................................................................................................. 68 3.16. ................................................................................................................................................. 69 3.17. ................................................................................................................................................. 69 3.18. ................................................................................................................................................. 70 3.19. ................................................................................................................................................. 70 3.20. Az AMD/ATI korai grafikus kártyáinak főbb jellemzői -1 [35] ............................................. 71 3.21. Az AMD/ATI korai grafikus kártyáinak főbb jellemzői - 2 [35] ............................................. 72 3.22. Az AMD Southern Islands sorozatú grafikus kártyái [35] ...................................................... 72 3.23. Az AMD Northern Islands sorozatú grafikus kártyái [35] ...................................................... 73 3.24. AMD Southern Islands sorozatú (GCN) grafikus kártyái [35] ................................................ 74 3.25. Az AMD Sea Islands sorozatú grafikus kártyáinak főbb jellemzői [45] ................................. 74 3.26. ATI HD 5870 (RV870 alapú) [43] ......................................................................................... 75 3.27. ATI HD 5970: 2 x ATI HD 5870 némileg csökkentett memória órajellel ............................... 76 3.28. ATI HD 5970: 2 x ATI HD 5870 valamelyest csökkentett memória órajellel ........................ 76 3.29. AMD HD 6990: 2 x ATI HD 6970 valamelyest csökkentett memória és shader órajellel ...... 77 3.30. AMD HD 7970 ........................................................................................................................ 77 3.31. GPU árak összehasonlítása 2012 nyarán ................................................................................. 78 4.1. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (2) .................... 80 4.2. ................................................................................................................................................... 80 4.3. ................................................................................................................................................... 81 4.4. ................................................................................................................................................... 82
GPGPU-k és programozásuk
xvi Created by XMLmind XSL-FO Converter.
4.5. ................................................................................................................................................... 83 4.6. ................................................................................................................................................... 86 4.7. ................................................................................................................................................... 86 4.8. ................................................................................................................................................... 88 4.9. ................................................................................................................................................... 89 4.10. ................................................................................................................................................. 89 4.11. ................................................................................................................................................. 89 4.12. ................................................................................................................................................. 90 4.13. A Fermi rendszerarchitektúrája [52] ....................................................................................... 90 4.14. ................................................................................................................................................. 91 4.15. ................................................................................................................................................. 92 4.16. ................................................................................................................................................. 93 4.17. ................................................................................................................................................. 93 4.18. ................................................................................................................................................. 94 4.19. ................................................................................................................................................. 95 4.20. ................................................................................................................................................. 96 4.21. A single ALU [57] .................................................................................................................. 96 4.22. Multiply-Add (MAD) és Fused-Multiply-Add (FMA) műveletek összevetése [51] .............. 97 4.23. szálak hierarchiája [58] ............................................................................................................ 97 4.24. ................................................................................................................................................. 98 4.25. ................................................................................................................................................. 98 4.26. ............................................................................................................................................... 100 4.27. ............................................................................................................................................... 100 4.28. ............................................................................................................................................... 102 4.29. A Bulldozer mag felépítése [60] ........................................................................................... 103 4.30. A Fermi mag [52] .................................................................................................................. 103 4.31. A Fermi mag [52] ................................................................................................................. 105 4.32. A Fermi mag [52] ................................................................................................................. 106 4.33. ............................................................................................................................................... 107 4.34. ............................................................................................................................................... 108 4.35. Warp ütemezés a G80-ban [59] ............................................................................................. 110 4.36. Warp ütemezés a G80-ban [59] ............................................................................................. 111 4.37. Warp ütemezés a G80-ban [59] ............................................................................................. 111 4.38. A Fermi magja [52] .............................................................................................................. 113 4.39. A Fermi magja [52] ............................................................................................................... 115 4.40. GF104 és GF100 felépítésének összehasonlítása [62] .......................................................... 116 4.41. ............................................................................................................................................... 117 4.42. ............................................................................................................................................... 118 4.43. ............................................................................................................................................... 118 4.44. ............................................................................................................................................... 120 4.45. ............................................................................................................................................... 121 4.46. ............................................................................................................................................... 121 4.47. ............................................................................................................................................... 122 4.48. ............................................................................................................................................... 123 4.49. ............................................................................................................................................... 124 4.50. ............................................................................................................................................... 125 4.51. ............................................................................................................................................... 125 5.1. GPGPU magok, kártyák és az azokat támogató szoftverek áttekintése (3) ............................ 127 5.2. ................................................................................................................................................. 127 5.3. A GK104 Kepler magjának blokkdiagrammja ........................................................................ 127 5.4. A GK110 Kepler magjának blokkdiagrammja ........................................................................ 128 5.5. ................................................................................................................................................. 128 5.6. A Kepler GPU-kban használt dinamikus párhuzamosság elve ................................................ 130 5.7. Soros és párhuzamos kernel futtatási modell a Fermiben és a Fermi előtti eszközökben [25], [18]
130 5.8. Soros és párhuzamos kernel futtatási modell a Fermiben és a Fermi előtti eszközökben [25], [18]
131 5.9. Egyetlen hardver munkasor használata több kernelfolyam esetén [70] .................................. 131 5.10. Fermi párhuzamos végrehajtási modellje [70] ....................................................................... 132 5.11. A Hyper-Q ütemezési modell működési elve [70] ................................................................ 133
GPGPU-k és programozásuk
xvii Created by XMLmind XSL-FO Converter.
5.12. A Hyper-Q működési modell elve [70] ................................................................................. 134 5.13. A Kepler Hyper-Q ütemező mechanizmusa, mely egyidejűle több MPI feladat kiküldédére képes,
szemben a Fermi egyetlen MPI feladat kibocsájtási képességével [73] ......................................... 135 5.14. A Fermi és a Kepler architektúriák ütemező alrendszereinek összehasonlítása [70] ............ 136 5.15. GPU Direct a Keplerben [70] ................................................................................................ 137 5.16. Titan (Cray XK7) szuperszámítógép [75] .............................................................................. 137 5.17. Mag és shader frekvenciák összehasonlítása az Nvidia fontosabb GPU családjaiban .......... 138 5.18. Rendelkezésre álló feldolgozási erőforrások a Kepler SMX és a Fermi SM esetén ............. 139 5.19. Magok és shaderek órajel frekvenciái az Nvidia főbb GPU családjaiban ............................ 139 5.20. ............................................................................................................................................... 139 5.21. Nvidia és AMD GPU kártyák főbb jellemzőinek összevetése [77] ...................................... 140 5.22. Fermi és Kepler kártyák teljesítményhatékonyságának összevetése [76] ............................. 141 5.23. A Fermi hardveres függőség ellenőrzője [76] ....................................................................... 141 5.24. A Kepler hardveres függőség ellenőrzésének blokkdiagrammja [76] .................................. 141 5.25. ............................................................................................................................................... 142 5.26. ............................................................................................................................................... 142 5.27. ............................................................................................................................................... 142 5.28. Számítási verziók főbb eszköz jellemzői [32] ...................................................................... 143 5.29. A Kepler cache architektúrája [70] ....................................................................................... 144 5.30. ............................................................................................................................................... 145 5.31. A GK104 Kepler magjának blokkdiagrammja ...................................................................... 145 5.32. ............................................................................................................................................... 145 5.33. ............................................................................................................................................... 146 5.34. Az Nvidia Kepler-alapú GTX 680 GPGPU kártya [33] ....................................................... 147 5.35. ............................................................................................................................................... 147 5.36. ............................................................................................................................................... 149 5.37. ............................................................................................................................................... 149 5.38. A GK110 Kepler magjának blokkdiagrammja ...................................................................... 150 5.39. ............................................................................................................................................... 151 5.40. ............................................................................................................................................... 151 5.41. ............................................................................................................................................... 152 5.42. ............................................................................................................................................... 153 5.43. ............................................................................................................................................... 155 5.44. ............................................................................................................................................... 155 5.45. ............................................................................................................................................... 156 5.46. ............................................................................................................................................... 157 6.1. ................................................................................................................................................. 158 6.2. Az AMD összefoglaló ábrája a processzorok teljesítményének fejlődédéről a mikroarchitektúra
egymást követő fejlődési szakaszaiban (6/2011) [84] .................................................................... 159 6.3. AMD’s view of the evolution to heterogeneous computing [84] ............................................ 159 6.4. ................................................................................................................................................. 160 6.5. A fordítási fázis ....................................................................................................................... 161 6.6. A futtatási fázis ........................................................................................................................ 162 6.7. Klasszikus három fázisú moduláris fordító felépítése [89] ..................................................... 163 6.8. ................................................................................................................................................. 164 6.9. ................................................................................................................................................. 164 6.10. ............................................................................................................................................... 165 7.1. ................................................................................................................................................. 166 7.2. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (3) .................. 167 7.3. ................................................................................................................................................. 167 7.4. Az ATI és az AMD GPU-k mikroarchitektúra fejlődésének főbb állomásai [95] .................. 168 7.5. Egy VLIW5 ALU blokkdiagrammja [17] ............................................................................... 168 7.6. ................................................................................................................................................. 169 7.7. VLIW4 ALU blokkdiagrammja (a Northern Islands család (HD6900-as kártyájában)) [17] . 169 7.8. 16-széles SIMD egység egyszerűsített blokkdiagrammja ([95]) ............................................ 170 7.9. ................................................................................................................................................. 170 7.10. ............................................................................................................................................... 172 7.11. Feldolgozó egységek (EU) száma Nvidia és AMD GPU-k esetében .................................... 172 7.12. A vertex shader futószalag az ATI első DX 9.0 támogatású GPU-jában (az R300 magban) (2002)
[102] .............................................................................................................................................. 173
GPGPU-k és programozásuk
xviii Created by XMLmind XSL-FO Converter.
7.13. Az AMD VLIW alapú shader ALU-inak fejlődési lépései .................................................... 174 7.14. Az AMD VLIW alapú shader ALU-inak fejlődési lépései .................................................... 174 7.15. A Northern Islands vonalban (HD6900) bevezetett VLIW4 ALU blokkdiagrammja [17] ... 175 7.16. ............................................................................................................................................... 175 7.17. ............................................................................................................................................... 177 7.18. ............................................................................................................................................... 178 7.19. ............................................................................................................................................... 179 7.20. ............................................................................................................................................... 179 7.21. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (4) ................ 180 7.22. Southern Islands család alcsaládjai [107] ............................................................................. 181 7.23. ............................................................................................................................................... 182 7.24. ............................................................................................................................................... 182 7.25. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (3) ................ 183 7.26. ............................................................................................................................................... 183 7.27. HD 5950 (Tahiti Pro) blokkdiagrammja [109] ..................................................................... 184 7.28. ............................................................................................................................................... 185 7.29. ............................................................................................................................................... 185 7.30. A 16-széles SIMD egység egyszerűsített blokkdiagrammja ([95] alapján) ........................... 186 7.31. ............................................................................................................................................... 187 7.32. ............................................................................................................................................... 187 7.33. ............................................................................................................................................... 188 7.34. Az N dimenziós végrehajtási tartomány értelmezése [12] .................................................... 189 7.35. A munkaelem értelmezése ([12] alapján) .............................................................................. 190 7.36. A munkacsoport értelmezése [12] ......................................................................................... 191 7.37. A hullámfrontok értelmezése [12] ......................................................................................... 192 7.38. Southern Islands sorozatú processzor blokkdiagrammja [110] ............................................ 193 7.39. CU blokkdiagrammja [110] .................................................................................................. 194 7.40. ............................................................................................................................................... 195 7.41. ............................................................................................................................................... 195 7.42. ............................................................................................................................................... 196 7.43. ............................................................................................................................................... 197 7.44. ............................................................................................................................................... 198 8.1. ................................................................................................................................................. 200 8.2. ................................................................................................................................................. 200 8.3. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (4) .................. 201 9.1. ................................................................................................................................................. 202 9.2. ................................................................................................................................................. 203 9.3. Az Intel Package-on-Package memória rétegezett megoldása a Clover Trail tábla platformon [116]
203 9.4. Az AMD asztali gépekbe szánt grafikai kártyáinak 2013-as útiterve [117] ........................... 204 9.5. ................................................................................................................................................. 204 9.6. ................................................................................................................................................. 204 9.7. ................................................................................................................................................. 205 9.8. Az Intel Xeon Phi család áttekintése (a korábbi MIC család) ................................................. 206 9.9. ................................................................................................................................................. 206 9.10. ............................................................................................................................................... 207 9.11. Intel Xeon Phi családjának fő jellemzői [122], [123] ........................................................... 207 9.12. ............................................................................................................................................... 208 9.13. A Knights Corner mikroarchitektúrája [120] ........................................................................ 209 9.14. ............................................................................................................................................... 209 9.15. ............................................................................................................................................... 209 9.16. ............................................................................................................................................... 210 9.17. ............................................................................................................................................... 210 9.18. ............................................................................................................................................... 211 9.19. ............................................................................................................................................... 212 9.20. ............................................................................................................................................... 212 9.21. ............................................................................................................................................... 213 9.22. ............................................................................................................................................... 213 9.23. ............................................................................................................................................... 214 9.24. ............................................................................................................................................... 214
GPGPU-k és programozásuk
xix Created by XMLmind XSL-FO Converter.
9.25. ............................................................................................................................................... 215 9.26. ............................................................................................................................................... 216 9.27. ............................................................................................................................................... 217 9.28. ............................................................................................................................................... 218 1.1. [11] .......................................................................................................................................... 231 1.2. ................................................................................................................................................. 231 1.3. [3] ............................................................................................................................................ 233 1.4. [5] ............................................................................................................................................ 234 1.5. [3] ............................................................................................................................................ 235 1.6. [7] ............................................................................................................................................ 237 2.1. ................................................................................................................................................. 238 2.2. [5] ............................................................................................................................................ 239 2.3. [5] ............................................................................................................................................ 241 2.4. [2] ............................................................................................................................................ 242 2.5. ................................................................................................................................................. 245 2.6. ................................................................................................................................................. 246 2.7. [5] ............................................................................................................................................ 247 2.8. [5] ............................................................................................................................................ 249 2.9. ................................................................................................................................................. 250 2.10. ............................................................................................................................................... 251 2.11. ............................................................................................................................................... 251 2.12. ............................................................................................................................................... 252 2.13. [5] .......................................................................................................................................... 252 2.14. ............................................................................................................................................... 253 2.15. [5] .......................................................................................................................................... 254 2.16. ............................................................................................................................................... 254 2.17. [5] .......................................................................................................................................... 255 2.18. [5] .......................................................................................................................................... 255 2.19. ............................................................................................................................................... 256 2.20. [5] .......................................................................................................................................... 257 2.21. ............................................................................................................................................... 257 2.22. [5] .......................................................................................................................................... 258 2.23. ............................................................................................................................................... 259 2.24. [5] .......................................................................................................................................... 259 2.25. [5] .......................................................................................................................................... 260 2.26. ............................................................................................................................................... 261 2.27. ............................................................................................................................................... 261 2.28. ............................................................................................................................................... 262 2.29. ............................................................................................................................................... 262 2.30. ............................................................................................................................................... 263 2.31. [5] .......................................................................................................................................... 263 2.32. ............................................................................................................................................... 264 2.33. [5] .......................................................................................................................................... 266 2.34. ............................................................................................................................................... 268 2.35. ............................................................................................................................................... 269 2.36. ............................................................................................................................................... 269 2.37. ............................................................................................................................................... 270 2.38. ............................................................................................................................................... 270 3.1. ................................................................................................................................................. 272 3.2. ................................................................................................................................................. 273 3.3. ................................................................................................................................................. 274 3.4. ................................................................................................................................................. 274 3.5. ................................................................................................................................................. 277 3.6. ................................................................................................................................................. 277 3.7. [12] .......................................................................................................................................... 281 3.8. ................................................................................................................................................. 282 3.9. ................................................................................................................................................. 282 3.10. ............................................................................................................................................... 282 3.11. ............................................................................................................................................... 283 3.12. ............................................................................................................................................... 283
GPGPU-k és programozásuk
xx Created by XMLmind XSL-FO Converter.
3.13. ............................................................................................................................................... 283 3.14. [12] ........................................................................................................................................ 285 3.15. [12] ........................................................................................................................................ 285 3.16. ............................................................................................................................................... 286 3.17. ............................................................................................................................................... 286 3.18. ............................................................................................................................................... 287 3.19. ............................................................................................................................................... 287 3.20. ............................................................................................................................................... 287 3.21. ............................................................................................................................................... 288 3.22. ............................................................................................................................................... 289 3.23. [9] .......................................................................................................................................... 290 3.24. ............................................................................................................................................... 290 3.25. [10] ........................................................................................................................................ 291 3.26. ............................................................................................................................................... 292 3.27. ............................................................................................................................................... 292 3.28. ............................................................................................................................................... 292 3.29. ............................................................................................................................................... 292 3.30. ............................................................................................................................................... 292 3.31. ............................................................................................................................................... 293 3.32. ............................................................................................................................................... 293 3.33. ............................................................................................................................................... 293 3.34. ............................................................................................................................................... 293 3.35. ............................................................................................................................................... 294 4.1. ................................................................................................................................................. 296 4.2. ................................................................................................................................................. 296 4.3. ................................................................................................................................................. 297 4.4. ................................................................................................................................................. 297 4.5. ................................................................................................................................................. 297 4.6. ................................................................................................................................................. 297 4.7. ................................................................................................................................................. 298 4.8. ................................................................................................................................................. 298 4.9. ................................................................................................................................................. 298 4.10. ............................................................................................................................................... 300 4.11. ............................................................................................................................................... 301 4.12. ............................................................................................................................................... 301 4.13. ............................................................................................................................................... 301 4.14. ............................................................................................................................................... 301 4.15. ............................................................................................................................................... 303 4.16. ............................................................................................................................................... 303 4.17. ............................................................................................................................................... 304 4.18. ............................................................................................................................................... 305 4.19. ............................................................................................................................................... 306 4.20. ............................................................................................................................................... 307 4.21. ............................................................................................................................................... 308 4.22. ............................................................................................................................................... 310 4.23. ............................................................................................................................................... 311 4.24. ............................................................................................................................................... 311 4.25. ............................................................................................................................................... 313 4.26. ............................................................................................................................................... 313 4.27. ............................................................................................................................................... 314 4.28. ............................................................................................................................................... 314 4.29. ............................................................................................................................................... 314 4.30. ............................................................................................................................................... 315 4.31. ............................................................................................................................................... 318 4.32. ............................................................................................................................................... 319 4.33. ............................................................................................................................................... 319 4.34. ............................................................................................................................................... 320 4.35. ............................................................................................................................................... 322 4.36. ............................................................................................................................................... 323 4.37. ............................................................................................................................................... 324
GPGPU-k és programozásuk
xxi Created by XMLmind XSL-FO Converter.
4.38. ............................................................................................................................................... 324 4.39. ............................................................................................................................................... 325 4.40. ............................................................................................................................................... 325 4.41. ............................................................................................................................................... 327 5.1. ................................................................................................................................................. 330 6.1. ................................................................................................................................................. 335 6.2. ................................................................................................................................................. 336 6.3. ................................................................................................................................................. 336 6.4. ................................................................................................................................................. 337 6.5. ................................................................................................................................................. 338 6.6. ................................................................................................................................................. 338
Created by XMLmind XSL-FO Converter.
I. rész - GPGPU-k
2 Created by XMLmind XSL-FO Converter.
Tartalom
Cél ................................................................................................................................................... ix 1. Bevezetés a GPGPU-kba ............................................................................................................. 10
1. Objektumok ábrázolása háromszögekkel ........................................................................... 10 1.1. GPU-k shadereinek főbb típusai ............................................................................ 11
2. Él- és csúcs shader modellek funkcióinak egybeolvadása ................................................. 12 3. Nvidia GPU-k és Intel P4 ill. Core2 CPU-k FP32/FP64 teljesítményének összehasonlítása [7]
14 4. AMD GPU-k csúcs FP32 teljesítménye [8] ........................................................................ 15 5. GPU-k FP32 feldolgozási teljesítményének fejlődése [9] .................................................. 16 6. Nvidia GPU-k és Intel P4, Core2 CPU-k sávszélességének fejlődése [7] .......................... 16 7. CPU-k és GPU-k főbb jellemzőinek összevetése [12] ....................................................... 17
2. A GPGPU modell virtuális gép elve ............................................................................................ 19 1. GPGPU-k virtuális gép modellje ........................................................................................ 19
1.1. GPGPU-k virtuális gép modellje ........................................................................... 19 1.2. Pseudo assembly kód hordozhatóságának előnyei ................................................. 19 1.3. Az alkalmazásfejlesztés fázisai - 1 ........................................................................ 19 1.4. Az alkalmazás végrehajtásának fázisai - 2 ............................................................. 20 1.5. Alkalmazások leírása eltérő absztrakciós szinteken .............................................. 20
2. GPGPU-kon alapuló masszívan adatpárhuzamos számítási modell .................................. 21 2.1. GPGPU-k specifikációja különböző absztrakciós szinteken ................................. 21 2.2. GPGPU-k virtuális gép szintű specifikációja ........................................................ 22 2.3. Az GPGPU alapú masszívan párhuzamos adatfeldolgozási modell ...................... 22 2.4. A GPGPU alapú masszívan párhuzamos számítási modellek térnyerése .............. 22 2.5. A tárgyalt számítási modell kiválasztása ............................................................... 23 2.6. A használt terminológia kiválasztása ..................................................................... 23
2.6.1. A GPGPU alapú masszívan párhuzamos adatfeldolgozási modellre SIMT (Single
instruction Multiple Threads) számítási modell néven hivatkozunk. .................. 23 2.6.2. A GPGPU alapú masszívan adatpárhuzamos számítási modellel kapcsolatos
kifejezések megválasztása ................................................................................... 23 3. A SIMT számítási modell .................................................................................................. 24
3.1. A SIMT számítási modell főbb komponensei ....................................................... 24 3.2. A számítási feladat modellje .................................................................................. 24
3.2.1. A szál modell ............................................................................................ 25 3.2.2. A kernel modell ......................................................................................... 29
3.3. A platform modellje ............................................................................................... 30 3.3.1. A számítási erőforrások modellje .............................................................. 31 3.3.2. A memória modell .................................................................................... 35
3.4. A végrehajtási modell ............................................................................................ 39 3.4.1. A SIMT végrehajtás elve .......................................................................... 39 3.4.2. A feladat szétosztása a PE-k felé ............................................................... 43 3.4.3. Az adatmegosztás elve .............................................................................. 47 3.4.4. Az adatfüggő végrehajtás elve .................................................................. 48 3.4.5. A szinkronizáció elve ................................................................................ 50
4. GPGPU-k pseudo ISA szintű leírása .................................................................................. 51 4.1. Pseudo ISA-k leírása ............................................................................................. 52 4.2. Mintapélda: Az Nvidia PTX virtuális gép pseudo ISA szintű leírása .................... 52 4.3. Mintapélda: Az Nvidia PTX virtuális gép pseudo ISA szintű leírása .................... 53 4.4. Nvidia számítási képesség (számítási képesség) elve [31], [1] .............................. 54 4.5. a) A funkcionális jellemzők, vagyis a számítási képességek összehasonlítása egymást
követő Nvidia pseudo ISA (PTX) verziókban [32] ...................................................... 55 4.6. b) Az eszközjellemzők fejlődésének összehasonlítása egymást követő Nvidia pseudo ISA
(PTX) számítási képességekben [32] ............................................................................ 56 4.7. c) Számítási képességhez kötött architektúra specifikációk az Nvidia PTX-ben [32] 56 4.8. d) Natív aritmetikai utasítások végrehajtási sebessége az Nvidia PTX számítási
képességeinek egymást követő verzióiban (utasítás / óraciklus/SM) [7] ...................... 56
GPGPU-k
3 Created by XMLmind XSL-FO Converter.
4.9. Egymást követő CUDA SDK-kkal megjelent PTX ISA verziók, valamint az általuk
támogatott számítási képesség verziók (sm[xx]) (A táblázatban ez Supported Targets néven
szerepel) [20] ................................................................................................................ 57 4.10. Nvidia GPGPU magjai és kártyái által támogatott számítási képesség verziók [32] 58 4.11. A PTX kód előre hordozhatósága [31] ................................................................ 58 4.12. Egy megadott GPGPU számítási képesség verzióra fordított objektum fájlra (CUBIN
file) vonatkozó kompatibilitási szabályok [31] ............................................................. 58 3. GPGPU magok és kártyák áttekintése ......................................................................................... 59
1. Általános áttekintés ............................................................................................................ 59 1.1. GPGPU magok ...................................................................................................... 59 1.2. Az Nvidia duál-GPU grafikus kártyáinak főbb jellemzői ...................................... 62 1.3. Az AMD/ATI duál-GPU grafikus kártyáinak főbb jellemzői ................................ 62 1.4. Megjegyzés az AMD alapú grafikus kártyákhoz [36], [37] ................................... 62
2. Az Nvidia grafikus magok és kártyák főbb jellemzőinek áttekintése ................................ 63 2.1. Az Nvidia grafikus magok és kártyák főbb jellemzői ............................................ 63
2.1.1. Egy SM felépítése a G80 architektúrában ................................................. 64 2.1.2. Az Nvidia GPGPU kártyáinak pozicionálása a termékspektrumukon belül [41]
67 2.2. Példák az Nvidia grafikus kártyáira ....................................................................... 68
2.2.1. Nvidia GeForce GTX 480 (GF 100 alapú) [42] ........................................ 68 2.2.2. Párba állított Nvidia GeForce GTX 480 kártyák [42] (GF100 alapú) ....... 68 2.2.3. Nvidia GeForce GTX 480 és 580 kártyák [44] ......................................... 69 2.2.4. Nvidia GTX 680 kártya [80] (GK104 alapú) ............................................ 70 2.2.5. Nvidia GTX Titan kártya [81] (GK110 alapú) .......................................... 70
3. Az AMD grafikus magok és kártyák főbb jellemzőinek áttekintése .................................. 71 3.1. Az AMD grafikus magok és kártyák főbb jellemzői ............................................. 71 3.2. Példák AMD grafikus kártyákra ............................................................................ 75
3.2.1. ATI HD 5970 (gyakorlatilag RV870 alapú) [46] ...................................... 76 3.2.2. ATI HD 5970 (RV870 alapú) [47] ............................................................ 76 3.2.3. AMD HD 6990 (Cayman alapú) [48] ........................................................ 77 3.2.4. AMD Radeon HD 7970 (Tahiti XT, Southern Islands alapú) - Első GCN
megvalósítás [49] ................................................................................................ 77 3.2.5. GPGPU árak 2012 nyarán [50] ................................................................. 78
4. Az Nvidia Fermi családhoz tartozó magok és kártyák ................................................................ 80 1. A Fermi család áttekintése ................................................................................................. 80
1.1. A Fermi főbb alcsaládjai ........................................................................................ 81 2. A Fermi PTX 2.0 legfontosabb újításai .............................................................................. 81
2.1. A PTX 2.0 áttekintése ............................................................................................ 81 2.2. A PTX 2.0 pseudo ISA főbb újításai ..................................................................... 82
2.2.1. a) A változók és a pointerek számára biztosított egységesített címtér mely azonos
load/store utasításkészlettel érhető el - 1 [11] ..................................................... 82 2.2.2. a) A változók és a pointerek számára biztosított egységesített címtér mely azonos
load/store utasításkészlettel érhető el - 2 [11] ..................................................... 83 2.2.3. b) 64-bites címzési lehetőség .................................................................... 84 2.2.4. c) Új utasítások, amelyek támogatják az OpenCL és DirectCompute API-kat
84 2.2.5. d) A predikáció teljeskőrű támogatása [51] ............................................... 84 2.2.6. e) A 32- és 64-bites lebegőpontos feldolgozás teljeskörű IEEE 754-3008
támogatása ........................................................................................................... 85 2.2.7. A Fermi GPGPU-kra történő programfejlesztések megkönnyítése [11] ... 85
3. A Fermi mikroarchitektúrájának főbb újításai és továbbfejlesztései .................................. 85 3.1. Főbb újítások ......................................................................................................... 85 3.2. Főbb továbbfejlesztések ......................................................................................... 85 3.3. Főbb architekturális újdonságok a Fermiben ......................................................... 85
3.3.1. a) Párhuzamos kernel futtatás [52], [18] ................................................... 86 3.3.2. b) Valódi kétszintű cache hierarchia [11] .................................................. 86 3.3.3. c) SM-enként konfigurálható osztott memória és L1 cache [11] .............. 87 3.3.4. d) ECC támogatás [11] .............................................................................. 88
3.4. A Fermi főbb architektúrális továbbfejlesztései .................................................... 89 3.4.1. a) Jelentősen megnövelt FP64 teljesítmény .............................................. 89
GPGPU-k
4 Created by XMLmind XSL-FO Converter.
3.5. Aritmetikai műveletek átviteli sebessége óraciklusonként és SM-enként [13] ...... 89 3.5.1. b) Jelentősen csökkentett kontextus váltási idők [11] ............................... 89 3.5.2. c) 10-20-szorosára felgyorsított atomi memória műveletek [11] .............. 90
4. A Fermi GF100 mikroarchitektúrája .................................................................................. 90 4.1. A Fermi GF100 felépítése [18], [11] ..................................................................... 90 4.2. A Fermi GT100 magasszintű mikroarchitektúrája ................................................. 90 4.3. Az Nvidia GPGPU-k magasszintű mikroarchitektúrájának fejlődése [52] ............ 91 4.4. Cuda GF100 SM felépítése [19] ............................................................................ 92 4.5. Az Nvidia GPGPU-iban található magok (SM) fejlődése - 1 ................................ 92 4.6. Az Nvidia GPGPU-iban található magok (SM) fejlődése - 2 ................................ 94 4.7. A Fermi GF100 GPGPU felépítése és működése .................................................. 95
4.7.1. A Cuda GF100 SM felépítése [19] ............................................................ 95 4.7.2. Egy ALU („CUDA mag”) ......................................................................... 96
4.8. SIMT végrehajtás elve soros kernel végrehajtás esetén ......................................... 97 4.9. A Fermi GF100 GPGPU működési elve ................................................................ 97 4.10. Feladat ütemezés alfeladatai ................................................................................ 97 4.11. Kernelek ütemezése az SM-ekre [25], [18] ......................................................... 98 4.12. Azonos kernelhez tartozó szálblokkok SM-hez rendelése ................................... 98 4.13. A CUDA szál blokkok fogalma és jellemzői [53] ............................................... 99 4.14. Szál blokkok warp-okká történő szegmentálása [59] ........................................ 100 4.15. Warpok ütemezése végrehajtásra az SM-ekre ................................................... 101 4.16. A Fermi GF100 mikroarchitektúra blokk diagrammja és működésének leírása . 101 4.17. Feltételezett működési elv - 1 ............................................................................ 103 4.18. Feltételezett működési elv - 2 ............................................................................ 104 4.19. Feltételezett működési elv - 3 ............................................................................ 105 4.20. Példa: Aritmetikai műveletek kibocsájtási sebessége (művelet/órajel) SM-enként [13]
107 4.21. A Fermi GF100 SM warp ütemezési politikája - 1 ............................................ 108 4.22. A Fermi GF100 SM warp ütemezési politikája - 2 ............................................ 109 4.23. A Fermi GF100 maximális teljesítményének becslése - 1 ................................. 112 4.24. A Fermi GF100 maximális teljesítményének becslése - 2 ................................. 114
5. A Fermi GF104 mikroarchitektúrája ................................................................................ 116 5.1. SM-enként rendelkezésre álló feldolgozó egységek a GF104 és a GF100 esetében 117 5.2. A GF 104/114 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13]
...................................................................................................................................... 118 5.3. Warp kibocsájtás a Fermi GF104-ben .................................................................. 118 5.4. A Fermi GF104 alapú GTX 460-as kártya maximális számítási teljesítmény adatai 119
6. A Fermi GF110 mikroarchitektúrája ................................................................................ 120 6.1. A Fermi GF110 mikroarchitektúrája [64] ............................................................. 120 6.2. A Fermi GF110 felépítése [65] ............................................................................ 120 6.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66] 121 6.4. A GF 100/110 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13]
...................................................................................................................................... 122 7. A Fermi GF114 mikroarchitektúrája ................................................................................ 123
7.1. A Fermi GF114 magjának felépítése a GTX 560-as kártyában [67] ................... 123 7.2. A Fermi GF114 mikroarchitektúrája ................................................................... 124 7.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66] 125 7.4. A GF 104/114 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13]
...................................................................................................................................... 125 5. Az Nvidia Kepler családhoz tartozó magok és kártyák ............................................................. 127
1. Az Nvidia Kepler családjának áttekintése ........................................................................ 127 1.1. A Kepler alcsaládjai ............................................................................................. 127 1.2. A GK104 Kepler mag [76] .................................................................................. 127 1.3. A GK110 Kepler mag [70] .................................................................................. 128 1.4. Az Nvidia Kepler GK104 és GK110 magjainak főbb tulajdonságai [70] ............ 128
2. A Kepler PTX 3.x főbb újításai ........................................................................................ 129 3. A Kepler mikroarchitektúrájának főbb újításai ................................................................ 129
3.1. a) Dinamikus párhuzamosság [70] ...................................................................... 129 3.1.1. A Kepler GPU-kban használt dinamikus párhuzamosság elve ............... 130 3.1.2. Dinamikus párhuzamosság előnyei [70] ................................................. 130
GPGPU-k
5 Created by XMLmind XSL-FO Converter.
3.2. b) A Hyper-Q ütemezési mechanizmus ............................................................... 130 3.2.1. A Hyper-Q ütemező mechanizmus lehetséges gyorsító hatása ............... 135
3.3. c) Grid Management Unit .................................................................................... 136 3.4. d) A GPU Direct .................................................................................................. 136 3.5. A Kepler mikroarchitektúrájának főbb továbbfejlesztései ................................... 137
3.5.1. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 1 ............................................................. 138 3.5.2. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 2 ............................................................. 138 3.5.3. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 3 ............................................................. 139 3.5.4. a) A feldolgozó egységek működési frekvenciájának (shader frequency)
lecsökkentése a mag frekvenciájára - 4 ............................................................. 139 3.5.5. A Fermi és Kepler feldolgozó egységei lapkaméretének és energia fogyasztásának
összehasonlítása [76] ......................................................................................... 139 3.5.6. b) A hardveres függőség ellenőrzés egyszerűsítése a fordító által az ütemezőnek
szolgáltatott kulcsszavak (compiler hints) segítségével .................................... 141 3.5.7. c) SMX-enként négyszeres warp ütemező bevezetése ............................ 141 3.5.8. Rendelkezésre álló számítási erőforrások a Kepler SMX és a Fermi SM esetében
............................................................................................................................ 142 3.5.9. d) A szálanként elérhető regiszterek számának megnégyszerezése ........ 143 3.5.10. A Kepler magokban bevezetett szálanként elérhető regiszterszám
négyszerezésének hatása ................................................................................... 143 3.5.11. e) Egy általános célra használható 48 KB-os, csak olvasható adat gyorsítótár
bevezetése ......................................................................................................... 143 3.5.12. f) Az L2 cache méret és sávszélesség megduplázása a Fermihez képest 144
4. Az Nvidia GK104 Kepler magja, és a hozzá tartozó kártyák ........................................... 144 4.1. A Kepler alcsaládjai ............................................................................................. 144 4.2. GK104 Kepler mag [76] ...................................................................................... 145 4.3. Az Nvidia GK104 mag lapkájának képe [78] ...................................................... 145 4.4. A Kepler GK104 mag SMX-ének blokkdiagrammja [76] ................................... 146 4.5. A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32 és FP64 teljesítménye
...................................................................................................................................... 147 4.5.1. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32
teljesítménye - 1 ................................................................................................ 147 4.5.2. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32
teljesítménye - 2 [70] ........................................................................................ 147 4.5.3. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32
teljesítménye - 3 ................................................................................................ 148 4.5.4. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64
teljesítménye - 1 ................................................................................................ 148 4.5.5. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64
teljesítménye - 2 [70] ........................................................................................ 149 4.5.6. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64
teljesítménye - 3 ................................................................................................ 149 5. Az Nvidia GK110 Kepler magja, és a hozzá tartozó kártyák ........................................... 149
5.1. A Kepler alcsaládjai ............................................................................................. 149 5.2. A GK110 mag ...................................................................................................... 150 5.3. A GK110 Kepler mag [70] .................................................................................. 150
5.3.1. Az Nvidia Kepler GK110 magjának fotója [70] ..................................... 150 5.3.2. Az Nvidia Kepler GK110 magjának felépítése [79] ............................... 151 5.3.3. Az Nvidia GK110 és GK104 magjainak összehasonlítása [79] .............. 152 5.3.4. A Kepler GK110 SMX-ének blokkdiagrammja [70] .............................. 153 5.3.5. a) A GK110 alapú GeForce GTX Titan grafikus kártya maximális FP32
teljesítménye ..................................................................................................... 154 5.3.6. b) A GK110 alapú GeForce GTX Titan grafikus kártya maximális FP64
teljesítménye ..................................................................................................... 154 6. Az Nvidia mikroarchitektúráinak fejlődése ..................................................................... 155
6.1. a) Az Nvidia Fermi előtti GPGPU-inak FP32 warp kibocsájtási hatékonysága .. 155 6.2. b) Az Nvidia Fermi és Kepler GPGPU-inak FP32 warp kibocsájtási hatékonysága 155
GPGPU-k
6 Created by XMLmind XSL-FO Converter.
6.3. c) Az Nvidia Fermi előtti GPGPU-inak FP64 teljesítmény növekedése ............. 156 6.4. d) Az Nvidia Tesla GPGPU-inak FP64 teljesítmény növekedése ....................... 156
6. Az AMD heterogén rendszerarchitektúrája ............................................................................... 158 1. A HSA elve ...................................................................................................................... 158
1.1. A HSA elv első nyivános bemutatása (6/2011) [84], [85] ................................... 158 1.2. A HSA (Heterogeneous Systems Architecture) céljai ......................................... 158
1.2.1. AMD’s view of the evolution path to heterogeneous computing (6/2011) [84]
159 2. A HSA célkitűzései [85], [87] .......................................................................................... 159
2.1. a) A CPU és a GPU számára közös címteret biztosító memória model [87] ....... 160 2.2. b) Felhasználói szintű parancs várakozósor [87] ................................................. 160 2.3. c) A HAS IL virtuális ISA (HSA köztes réteg - HSA Intermediate Layer) [87]. [88] 160 2.4. d) Az alkalmazásfeldolgozás modellje [88] ......................................................... 160 2.5. Az alkalmazásfeldolgozás elve a HSA-ban [87] .................................................. 161 2.6. A futtatási fázis [87] ............................................................................................ 162 2.7. Heterogeneous Sytem Architecture Foundation (HSAF - Heterogén Rendszer architektúra
alapítvány) .................................................................................................................. 164 2.8. Az AMD útiterve a HSA implementációjára [90] ............................................... 164 2.9. Az AMD útiterve a HSA implementációjára - részletezés [85] ........................... 165
7. Az AMD Southern Islands családhoz tartozó magok és kártyák ............................................... 166 1. Az AMD Southern Islands családjának áttekintése .......................................................... 166
1.1. Az AMD útiterve a HSA implementációjára (Financial Analyst Day 2012 február) [90]
166 1.2. Az AMD új GPU mikroarchitektúrája: a Graphics Core Next (GCN) Következő Grafikus
Mag) ........................................................................................................................... 166 1.3. A GCN mikroarchitektúra bejelentése és megvalósítása ..................................... 167 1.4. Az AMD útiterve, mely a GCN mikroarchitektúra megjelenését jelzi a Southern Islands
grafikai családban (2012 február) [94] ....................................................................... 167 2. A Southern Islands mikroarchitektúra főbb újításai ......................................................... 167
2.1. VLIW4 alapú GPU-k helyett SIMD alapú GPU bevezetése ............................... 167 2.1.1. Az ATI (melyet AMD 2006-ban felvásárolt) és az AMD GPU-k
mikroarchitektúra fejlődésének főbb állomásai [95] ......................................... 168 2.1.2. VLIW alapú ALU-k használata GPU-kban ............................................. 168 2.1.3. VLIW-alapú ALU-k ................................................................................ 169 2.1.4. Hullámfront sorozat átkódolása VLIW4 utasításokká [96] ..................... 169 2.1.5. Hullámfrontok ütemezése VLIW4 kódolást feltételezve [96] ................. 170 2.1.6. Grafikus feldolgozás és VLIW alapú ALU-k .......................................... 171 2.1.7. Az AMD motivációja a korábbi GPU-kban használt VLIW alapú ALU-k
használatára ....................................................................................................... 171 2.1.8. Feldolgozó egységek (EU) száma Nvidia és AMD GPU-k esetében ...... 172 2.1.9. Az AMD motivációja első GPU-iban VLIW5 alapú ALU-k használatára [97]
172 2.1.10. Az AMD VILW5 ALU-jának kialakítása .............................................. 172 2.1.11. A továbbfejlesztett VLIW5 ALU bevezetése ........................................ 174 2.1.12. A VLIW4 bevezetése a továbbfejlesztett VLIW5 kialakítás helyett - 1 174 2.1.13. A VLIW4 bevezetése a továbbfejlesztett VLIW5 kialakítás helyett - 2 174 2.1.14. Az AMD továbbfejlesztett VLIW5 és VLIW4 megvalósításainak
összehasonlítása [17] ......................................................................................... 175 2.1.15. A numerikus számítások fontosságának növekedése és ezzel összefüggésben a
GCN microarchitektúra bevezetése ................................................................... 177 2.1.16. A VLIW4 alapú ALU-k leváltása SIMD alapú GCN architektúrájú ALU-kra
[91] .................................................................................................................... 177 2.2. Az AMD ZeroCore technológiája [49] ................................................................ 177
2.2.1. A ZeroCore technológia segítségével elérhető passzív állapotú energia fogyasztás
[104] .................................................................................................................. 178 2.2.2. Az AMD PowerTune technológiája ........................................................ 178 2.2.3. A Northern Islands családban bevezetett PowerTune technológia (HD
6900/Cayman), 2010 december) [106] .............................................................. 179 2.2.4. A PowerTune technológia használatának előnye [105] .......................... 179
3. Az AMD Southern Islands kártyacsaládja ....................................................................... 180
GPGPU-k
7 Created by XMLmind XSL-FO Converter.
3.1. A Southern Islands család áttekintése .................................................................. 180 3.1.1. Az AMD GCN bejelentése és megvalósítása .......................................... 180 3.1.2. A Southern Islands család főbb jellemzői ............................................... 181 3.1.3. Southern Islands család alcsaládjai - 1 [107] .......................................... 181 3.1.4. A Southern Islands család alcsaládjai - 2 [108] ....................................... 182 3.1.5. Az AMD és Nvidia grafikus magjai lapkaméreteinek összehasonlítása [95] 182 3.1.6. AMD GCN bejelentése és megvalósítása ............................................... 183
3.2. A Radeon HD7970 grafikus kártya Tahiti XT magjának mikroarchitektúrája .... 183 3.2.1. A Tahiti XT mag mikroarchitektúrájának áttekintése [95] ..................... 183 3.2.2. A 7950 (Tahiti Pro) és a 7970 (Tahiti XT) magokat használó kártyák közötti
különbségek ...................................................................................................... 184 3.2.3. A számítási egységek (CU - Compute Unit) architekturális áttekintése -
egyszerűsített blokkdiagramm [95] ................................................................... 185 3.2.4. Egy számítási egység (CU) részletes blokkdiagrammja [108] ................ 185 3.2.5. Egy számítási egység (CU) fő egységei .................................................. 185 3.2.6. A CU négy 16-széles SIMD egysége [110] (nagymértékben egyszerűsített leírás)
............................................................................................................................ 186 3.2.7. A CU skalár egysége [110] ..................................................................... 186 3.2.8. A HD 7970 (Tahiti XT) grafikai kártya maximális FP32 és FP64 teljesítménye
186 3.2.9. A HD 7970 (Tahiti XT) cache hierarchiája [95] ..................................... 187 3.2.10. CPU-nkénti és GPU-nkénti elérhető tárhelyek a HD 7970-ben (Tahiti XT) [110]
............................................................................................................................ 187 3.2.11. A HD 7970 (Tahiti XT) magban található memóriák méretei, valamint azok
olvasási sebessége [16] ..................................................................................... 188 3.3. Működési elvük (Ismétlés a 3.2-es fejezetből) .................................................... 189
3.3.1. Számítási feladatok ................................................................................. 189 3.3.2. Munkaelemek .......................................................................................... 190 3.3.3. A kernel ................................................................................................... 191 3.3.4. Munkacsoportok ...................................................................................... 191 3.3.5. Hullámfrontok - 1 .................................................................................... 192 3.3.6. Hullámfrontok - 2 .................................................................................... 192 3.3.7. Működési elv ........................................................................................... 193 3.3.8. Számítási feladatok elindítása a GPU-n .................................................. 193 3.3.9. Számítási feladatok végrehajtása - 1 ....................................................... 193 3.3.10. Számítási feladatok végrehajtása - 2 ..................................................... 194 3.3.11. Számítási feladatok végrehajtása - 3 ..................................................... 194
3.4. A HD 7970 (Tahiti XT) teljesítmény adatai és fogyasztása [110] ....................... 194 3.4.1. a) A kártya teljesítménye játékokban ...................................................... 195 3.4.2. a) Nagy teljesítményű grafikus kártyák teljesítménye játékokban - 1 [50] 195 3.4.3. a) Nagy teljesítményű grafikus kártyák teljesítménye játékokban - 2 [50] 195 3.4.4. b) Nagy teljesítményű grafikus kártyák teljesítménye számítási feladatokon mérve
[50] .................................................................................................................... 196 3.4.5. c) Terhelés alatti energia fogyasztás (teljes terhelésen) [50] ................... 197 3.4.6. d) Üresjárati fogyasztás [50] ................................................................... 198
8. Az AMD Sea Islands családja ................................................................................................... 200 1. A Sea Islands család helye az AMD 2013-as útitervében [111] ...................................... 200 2. A Sea Islands család fő jellemzői ..................................................................................... 200 3. Az AMD 2. generációs GCN-jének, a Sea Islands családnak a tervezett bevezetése ...... 201 4. A HD 8950/70 grafikus kártyák fő paraméterei ............................................................... 201
9. Kitekintés ................................................................................................................................... 202 1. Nvidia útiterve 2014-re és tovább .................................................................................... 202
1.1. A Maxwell CPU + GPU ...................................................................................... 202 1.2. A Volta CPU + GPU ........................................................................................... 203 1.3. Volta processzor rétegezett DRAM-mal [113] .................................................... 203
2. AMD grafikai útiterve 2013-ra ........................................................................................ 203 3. Az AMD asztali gépekbe szánt grafikai kártyáinak 2013-as útiterve ............................... 204 4. Az Intel Xeon Phi családja ............................................................................................... 204
4.1. A Knights Ferry protípusa ................................................................................... 205
GPGPU-k
8 Created by XMLmind XSL-FO Converter.
4.2. Az MIC elnevezés módosítása Xeon Phi-re, és a nyílt forráskódú szoftverek támogatása
205 4.3. A Knights Corner processzor ............................................................................... 206 4.4. A Xeon Phi család főbb jellemzői [120] .............................................................. 206 4.5. A Xeon Phi társprocesszor család elsőként megjelenő tagjai és főbb jellemzőik [121]
207 4.6. A Knights Corner (KCN) DPA felépítése [120] .................................................. 208 4.7. A Knights Corner mikroarchitektúrája [120] ....................................................... 208 4.8. A lapka dupla gyűrűs összeköttetéseinek kialakítása [122] ................................. 209 4.9. A Knights Corner magjának blokk diagrammja [120] ......................................... 209 4.10. A vektor feldolgozó egység blokkvázlata és futószalag alapú működése [120] 210 4.11. A Xeon Phi társprocesszor rendszer-architektúrája [122] ................................. 210 4.12. The Xeon Phi 5110P társprocesszor [124] ......................................................... 211 4.13. A Xeon Phi társprocesszor nyáklap (hátoldal) [122] ......................................... 212 4.14. Az aktív hűtéssel ellátott Xeon Phi 3100 szerelési ábrája [122] ........................ 212 4.15. Az Intel többmagos, sokmagos és cluster architektúráinak közös fejlesztési platformja
[125] ........................................................................................................................... 213 4.16. Az Intel Knight Corner és a versenytársai teljesítmény hatékonyságának
összehasonlítása [120] ................................................................................................ 213 4.17. A Xeon Phi 5110P, SE10P/X és a 2-processzoros Intel Xeon szerver maximális
teljesítményének összehasonlítása [126] .................................................................... 214 4.18. Xeon 5110P és egy 2-processzoros Sandy Bridge alapú Xeon szerver teljesítményének
[126] ........................................................................................................................... 214 4.19. A Xeon Phi 5110P sebességének összehasonlítása egy 2-processzoros Xeon szerverrel
215 4.20. Az Intel Xeon Phi családjának útiterve [127] .................................................... 215 4.21. Assessing the peak FP64 performance of the Knights Corner coprocessor with that of
Nvidia’s and AMD’s recent devices ........................................................................... 216 4.22. a) Intel Knights Corner családjának FP64 teljesítménye [126] ......................... 216 4.23. b) Az Nvidia Tesla GPGPU-inak FP64 teljesítménye ....................................... 217 4.24. c) AMD csúcskategóriás GPU-inak FP64 teljesítménye ................................... 218
10. Hivatkozások ........................................................................................................................... 219
ix Created by XMLmind XSL-FO Converter.
Cél
A GPGPU-k architektúrájának és működési elvének bemutatása, valamint az aktuális GPGPU családok
működésének ismertetése.
Megjegyzések
1. A közel 500 diából nagyjából 100 egy korábban, a TÁMOP-4.1.2-08/2/A/KMR-2009-0053 keretében
kidolgozott tananyagból származik.
2. Felhívjuk a figyelmet arra, hogy a GPGPU-k programozási kérdéseivel, hatékony használatával, valamint a
rendelkezésre álló fejlesztési környezetekkel ugyanezen TÁMOP pályázat keretében kidolgozott Dr. Szénási
Sándor: GPGPU-k programozása című tananyag foglalkozik.
10 Created by XMLmind XSL-FO Converter.
1. fejezet - Bevezetés a GPGPU-kba
1. Objektumok ábrázolása háromszögekkel
1.1. ábra -
A csúcspontok leírásával, melyek egyrészt
• három térbeli koordinátával írhatók le és
• tartalmaznak olyan további információkat is, melyek a képalkotáshoz szükségesek, mint a
• szín
• textúra
• tükröződési tulajdonságok
• stb.
Példa: Egy delfin hárömszög alapú ábrázolása [1]
1.2. ábra -
Bevezetés a GPGPU-kba
11 Created by XMLmind XSL-FO Converter.
1.1. GPU-k shadereinek főbb típusai
1.3. ábra -
1.4. ábra - Képpont/csúcs shader modellek (SM) támogatottsága az egymást követő
DirectX verziókban és a Microsoft operációs rendszerekben [2], [3]
Bevezetés a GPGPU-kba
12 Created by XMLmind XSL-FO Converter.
2. Él- és csúcs shader modellek funkcióinak egybeolvadása
A korai shader modellek (2-es és 3-as verziók ) különböző pontossági igénynek tettek eleget, ebből fakadóan
különböző adattípusokat, regiszter készleteket és utasítás készleteket használtak.
Ezeket a modelleket a 4-es shader modell integrálta.
Shader model 2 [4]
• Eltérő pontossági igények
Eltérő adattípusok
• Csúcs shader: FP32 (koordináták)
• Képpont shader: FX24 (3 szín x 8)
• Eltérő utasítások
• Eltérő felhasználható erőforrások (pl. regiszterek)
Shader model 3 [4]
• Egységes pontossági igény mindkét shader esetén (FP32)
részpontosság megadásának lehetősége (FP16 vagy FP24) a shader kódjának módosításával
• Eltérő utasítások
• Eltérő rendelkezésre álló erőforrások (pl. regiszterek)
Shader model 4 (a DirectX 10 vezette be) [5]
• Egységes pontossági igény mindkét shader esetén (FP32)
Bevezetés a GPGPU-kba
13 Created by XMLmind XSL-FO Converter.
új adatformátumok használatának lehetőségével.
• Egységes utasítás készlet.
• Egységes felhasználható erőforrások (pl. átmeneti és állandó regiszterek).
SM4 előtti GPU-k shader architektúrái
SM4 előtti GPU-k (DirectX 10):
eltérő csúcs és képpont egységekkel rendelkeztek, eltérő funkciókkal.
A külön csúcs és képpont shaderek használatának hátrányai
• A hardver implementáció nem hatékony
• A csúcs- és képpont shaderek gyakran ellentétes terhelési mintával rendelkeznek [3]).
1.5. ábra -
1.6. ábra - Az egységesített shader architektúra alapelve [6]
Bevezetés a GPGPU-kba
14 Created by XMLmind XSL-FO Converter.
1.7. ábra -
3. Nvidia GPU-k és Intel P4 ill. Core2 CPU-k FP32/FP64 teljesítményének összehasonlítása [7]
1.8. ábra -
Bevezetés a GPGPU-kba
15 Created by XMLmind XSL-FO Converter.
4. AMD GPU-k csúcs FP32 teljesítménye [8]
1.9. ábra -
Bevezetés a GPGPU-kba
16 Created by XMLmind XSL-FO Converter.
5. GPU-k FP32 feldolgozási teljesítményének fejlődése [9]
1.10. ábra -
6. Nvidia GPU-k és Intel P4, Core2 CPU-k sávszélességének fejlődése [7]
Bevezetés a GPGPU-kba
17 Created by XMLmind XSL-FO Converter.
1.11. ábra -
1.12. ábra - GPU és CPU lapkafelülete k kihasználtságának összehasonlítása [10]
• A vezérlés kevesebb helyet foglal, mivel a GPGPU-k egyszerűbb vezérlést használnak (minden ALU-n
azonos utasítást hajt végre).
• A cache kevesebb helyet foglal el, mivel a GPGPU-k támogatják a masszív többszálúságot, és ez a
technológia elrejti a hosszú várakozási időket olyan műveleteknél, mint például a cache hiány esetén
szükségessé váló memória hozzáférés.
7. CPU-k és GPU-k főbb jellemzőinek összevetése [12]
1.13. ábra -
Bevezetés a GPGPU-kba
18 Created by XMLmind XSL-FO Converter.
19 Created by XMLmind XSL-FO Converter.
2. fejezet - A GPGPU modell virtuális gép elve
1. GPGPU-k virtuális gép modellje
1.1. GPGPU-k virtuális gép modellje
A GPGPU-kra történő program fejlesztés a virtuális gép elven alapszik, az alábbi ábra szerint.
2.1. ábra -
1.2. Pseudo assembly kód hordozhatóságának előnyei
• A lefordított pseudo ISA kód (PTX / IL kód) független marad a tényleges GPGPU hardver megvalósításától,
vagyis használható az egymást követő GPGPU családokban is.
Az objektum kód előre kompatibilitása (GPGPU kód, pl. CUBIN kód) biztosított azonban általában csak a
főverziókon belül (pl. 1.x vagy 2.x).
• Amennyiben a PTX/IL fájl olyan GPGPU-ra kerül lefordításra, ami egy adott funkcióval nem rendelkezik,
akkor a hardverben nem implementált eljárásokat emulációval kell megoldani. Ez lelassítja a végrehajtást.
• A pseudo assembly kód hordozhatósága (Nvidia PTX vagy AMD IL) nagyon előnyös a GPGPU technológiák
jelenleg tapasztalható gyors fejlődése esetében, mivel így a kód újrahasznosítása alacsonyabb költséggel
valósítható meg.
• A kód újrahasznosítás költségét a GPGPU generációk közötti váltás (például a GT200 alapú eszközről GF100
vagy GF110 alapú eszközre való áttérés) vagy a szoftveres környezet leváltása okozza (például CUDA 1.x
SDK-ról CUDA 2.x-re vagy CUDA 3.x SDK-ról CUDA 4.x SDK-ra).
1.3. Az alkalmazásfejlesztés fázisai - 1
A használt virtuális gép elv következtében az alkalmazásfejlesztés egy kétfázisú eljárássá válik.
• 1. fázis: A HLL alkalmazás lefordítása pseudo assembly kódra
A GPGPU modell virtuális gép elve
20 Created by XMLmind XSL-FO Converter.
2.2. ábra -
A lefordított pseudo ISA kód (PTX code/IL code) az aktuális hardver megvalósítástól független marad, vagyis
eltérő GPGPU családok között hordozható.
1.4. Az alkalmazás végrehajtásának fázisai - 2
• 2. fázis: A pseudo assembly kód lefordítása GPU specifikus bináris kódra
2.3. ábra -
Az objektum kód (GPGPU kód, pl. a CUBIN fájl) előre hordozható, viszont ez az előre kompatibilitás általában
csak azonos főverziókon belül (például az Nvidia 1.x, vagy a 2.x) áll fent.
1.5. Alkalmazások leírása eltérő absztrakciós szinteken
• Az alkalmazások leírhatóak különböző absztrakciós szinteken a megfelelő nyelvi eszközök
(fejlesztőkészletek) használatával, amint azt a lenti ábra szemlélteti.
2.4. ábra -
A GPGPU modell virtuális gép elve
21 Created by XMLmind XSL-FO Converter.
A számítási eszközök is specifikálhatóak különböző absztrakciós szinteken (ld. később).
Megjegyzés
Az Nvidia és az AMD GPGPU-k virtuális gép modellje hasonlít a Java nyelv által használt virtuális gép
modellre, hiszen
• a Java nyelvhez tartozik egy pseudo ISA definició, amit Java bytekódnak hívnak.
• A Java nyelven írt alkalmazások először a platform független Java bytekódra fordulnak le.
• A Java bytekódot ezt követően vagy interpretálja a számítógépre feltelepített Java Runtime Environment
(JRE), vagy futásidőben objektum kódra fordítja le a Just-In-Time (JIT) fordító.
2. GPGPU-kon alapuló masszívan adatpárhuzamos számítási modell
2.1. GPGPU-k specifikációja különböző absztrakciós szinteken
A GPGPU-kat két szinten szokás specifikálni:
• virtuális gép szinten (pseudo ISA szint, pseudo assembly szint, köztes szint), valamint
• az objektum kód szintjén (GPGPU ISA szint).
2.5. ábra -
A GPGPU modell virtuális gép elve
22 Created by XMLmind XSL-FO Converter.
A tananyag további részében a GPGPU-kat a virtuális gép szintjén tárgyaljuk, mivel ez maradandóbb
ismereteket nyújt a GPGPU-król, mint a dinamikusan változó hardver specifikációs szint (tényleges ISA szint).
2.2. GPGPU-k virtuális gép szintű specifikációja
Ez két összetartozó elv leírását igényli, ezek
• egy GPGPU alapú masszívan párhuzamos számítási modell és
• a hozzá tartozó GPGPU pseudo ISA.
A GPGPU alapú masszívan adatpárhuzamos számítási modell képezi a pseudo ISA alapját a vonatkozó
feldolgozási környezet és a működési elvek specifikálásával.
A következőkben előbb a GPGPU alapú masszívan adapárhuzamos számítási modellel foglalkozunk, majd ezt
követően tárgyaljuk a GPGPU-k pseudo ISA szintű leírását a 2.3 fejezetben.
2.3. Az GPGPU alapú masszívan párhuzamos adatfeldolgozási modell
A GPGPU alapú masszívan párhuzamos számítási modell tárgyalását nagyban megnehezíti az a tény, hogy
jelenleg nem létezik egy általánosan elfogadott modell, mivel
• mindkét piacvezető GPGPU gyártó (Nvidia és AMD) eltérő GPGPU alapú masszívan párhuzamos számítási
modellt használ és
• ezen túlmenően számítási modelljeiket folyamatosan fejlesztik, részben azért, hogy kövessék a HLL
környezet fejlődését (pl. az egymást követő CUDA vagy OpenCL verziókat), részben pedig azért, hogy az új
GPGPUk hardver jellemzőit támogassák.
2.4. A GPGPU alapú masszívan párhuzamos számítási modellek térnyerése
Mindkét, a GPGPU-k területén vezető cég (Nvidia, AMD) kidolgozott és közzétett GPGPU alapú masszívan
párhuzamos számítási modelleket, az alábbiak szerint
• A SIMT (Single Instruction Multiple Threads) elnevezést az Nvidia vezette be 2006-ban új G80-as GPGPU-
juk megjelenésével egyidőben.
Az Nvidia ezt az elnevezést egy olyan masszívan adatpárhuzamos számítási modellként értelmezte, melynél a
GPGPU egyidejűleg nagyszámú szálat hajt végre [11].
A GPGPU modell virtuális gép elve
23 Created by XMLmind XSL-FO Converter.
• 2007-ben az AMD is bevezetett egy hasonló masszívan adatpárhuzamos számítási modellt, melyet ATI
Stream Technology-nak nevezett el.
Később, 2010 októberében az AMD ezt az elnevezést AMD Accelerated Parallel Processing Technology
(APP) elnevezésre módosította a HD68xx Northern Islands) grafikus lapkacsaládja bevezetésével
egyidejűleg.
Valójában az AMD számítási modelljének átnevezését elsődlegesen az indokolta, hogy az AMD 2009-ben az
eredeti Brook+HLL programozási környezetet felváltotta az OpenCL környezettel a HD58xx (Evergreen)
grafikus lapkacsalád bevezetésével.
• Itt megjegyezzük még, hogy az OpenCL GPGPU alapú masszívan párhuzamos számítási modellje az SPMD
(Single Program Multiple Data) modell elnevezésből származik,amit 2008 decemberében publikáltak.
2.5. A tárgyalt számítási modell kiválasztása
• Mivel nincs alapos indoka annak, hogy az egyik vagy a másik gyártó számítási modelljét preferáljuk, ezért a
GPGPU alapú masszívan adatpárhuzamos számítási modelleket általánosabb formában fogjuk tárgyalni egy
olyan számítási modell bemutatásával, ami tartalmazza mind Nvidia mind AMD számítási modelljeinek főbb
vonásait.
2.6. A használt terminológia kiválasztása
2.6.1. A GPGPU alapú masszívan párhuzamos adatfeldolgozási modellre SIMT (Single instruction Multiple Threads) számítási modell néven hivatkozunk.
• Ezt a választást az indokolja, hogy a SIMT (Single Instruction Multiple Threads - Egy Utasítás Több Szál)
számítási modell elnevezés, (az Nvidia gyakorlatával összhangban), jól kifejezi mind a többszálúságot, mind
pedig a hasonlóságot a SIMD modellel.
Megjegyezzük, hogy az azonos elnevezés dacára a modellt részben másként értelmezzük, mint Nvidia.
2.6.2. A GPGPU alapú masszívan adatpárhuzamos számítási modellel kapcsolatos kifejezések megválasztása
Az Nvidia és AMD a legtöbb esetben eltérő terminológiát használnak a GPGPU számítási modelljeikkel
kapcsolatban.
Továbbá, amikor az AMD leváltotta a Brook+ HLL programozási környezetét OpenCL-re, akkor az általuk
használt terminológiát is teljesen lecserélték.
Ezen túlmenően, a vonatkozó dokumentációk terminológiája sem konzisztens, a terminológia eltérő attól
függően, hogy az adott dokumentáció milyen felhasználói rétegnek szól, mint például hardver, pseudo assembly
fejlesztők vagy magas szintű programozók. Az eltérő célcsoportoknak íródott dokumentációk azonos elveket
eltérő nevekkel látnak el, amint azt az alábbi táblázat bemutatja.
Ebben a diasorban leginkább az OpenCL-hez köthető terminológiákat fogjuk használni, mivel az jelenleg a
leginkább elterjedő programozási környezet.
2.6. ábra - GPGPU-k és adatpárhuzamos gyorsítók terminológiája
A GPGPU modell virtuális gép elve
24 Created by XMLmind XSL-FO Converter.
3. A SIMT számítási modell
3.1. A SIMT számítási modell főbb komponensei
A SIMT számítási modell a következő három fő absztrakcióból tevődik össze:
2.7. ábra - A SIMT számítási modell tervezési tere
3.2. A számítási feladat modellje
2.8. ábra -
A GPGPU modell virtuális gép elve
25 Created by XMLmind XSL-FO Converter.
3.2.1. A szál modell
2.9. ábra -
3.2.1.1. A grafikai számítási feladat fogalma
A GPU esetében a számítási feladat egy párhuzamos adatfolyamot feldolgozó program (kernel) futtatását jelenti
egy legfeljebb három dimenziós adastruktúrán - vagyis egy N dimenziós tartományon (amit végrehajtási
tartománynak is neveznek) a lenti ábra szerint.
2.10. ábra - Az Ndimenziós tartomány értelmezése [12]
A GPGPU modell virtuális gép elve
26 Created by XMLmind XSL-FO Converter.
3.2.1.2. A szál modell
A szál modell egy hierachikus modell, ami a munkaelemeken (work-item), munkacsoportokon (work-group) és
a hullámfrontokon (wavefront) alapul, ezekről lesz szó a következőkben.
3.2.1.3. Munkaelemek
A munkaelemek jelentik a számítás alapegységét, melyeket az adattér egy adott pontjaként értelmezzük.
Egy adott munkaelemre vonatkozó utasítássorozatot szálnak nevezünk.
2.11. ábra - A munkaelem értelmezése ([12] alapján)
A GPGPU modell virtuális gép elve
27 Created by XMLmind XSL-FO Converter.
3.2.1.4. Munkacsoportok
A végrehajtási tartományokat (N-dimenziós tartomány) a programozó a hatékony végrehajtás érdekében
munkacsoportokra bontja, melyeket szál blokkoknak (thread block) is nevezünk,
Egy munkacsoportot egy azonosító identifikál, és az egy meghatározott számítási egységen (CU) kerül majd
végrehajtásra.
2.12. ábra - A munkacsoport értelmezése [12]
A GPGPU modell virtuális gép elve
28 Created by XMLmind XSL-FO Converter.
Megjegyzés
A munkacsoport terminus technicus különböző dokunentációkban eltérő elnevezésekkel szerepel, mint pl.:
• Szál blokk (Thread blocks) - Nvidia dokumentációkban ill.
• Szál blokk (Thread blocks) (OpenCL előtti kifejezés) vagy
• Munkacsoport (Work Groups, Workgroups) (OpenCL kifejezés) - AMD dokumentációkban.
3.2.1.5. Hullámfrontok - 1
A hatékony végrehajtás érdekében a GPGPU-k a munkacsoportokat hullámfrontokra (warp-okra) bontják,
amelyeknek az elemein az utasítások egyidejűleg (ún. lockstep módban), hajtódnak végre ugyanazon a CU-n.
2.13. ábra - A hullámfrontok értelmezése [12]
Az egyazon munkacsoporthoz tartozó hullámfrontok közösen használhatnak adatokat, és futásuk megfelelő
parancsokkal szinkronizálható, vagyis előírható, az hogy a hullámfrontok a program futásának valamely pontján
bevárják egymást.
3.2.1.6. Hullámfrontok - 2
• A hullámfrontok (wavefront) jelentik azt a legkisebb feladat egységet, melyeknek a a feldolgozó elemeken
történő végrehajtását a CU ütemezi.
• A hullámfrontokat az AMD wavefront-nak nevezi, és warp-nak az Nvidia.
• A hullámfront mérete hardverfüggő.
• Az Nvidia GPGPU-kban a (warp-oknak nevezett) hullámfrontok 32 munkaelemet tartalmaznak.
• Az AMD GPGPU-kban a hullámfrontok mérete különböző;
• A nagyteljesítményű GPGPU kártyák, mint például a Southern Islands termékvonal (HD 7950/70
kártyák) jellemzően 64 méretű hullámfronttal dolgoznak, miközben
• az alacsony teljesítményű kártyák hullámfrontjának mérete 32, 24 vagy akár 16 is lehet.
• Minden hullámfront saját Utasítás számlálóval (Program Counterrel (PC)) rendelkezik, ami a hullámfront
által következőként végrehajtandó utasításra mutat.
A GPGPU modell virtuális gép elve
29 Created by XMLmind XSL-FO Converter.
Amikor a hullámfront létrejön, akkor az a PC a program első utasítására fog mutatni.
• A hullámfrontokat a CU a PE-n való futásra ütemezi.
A hullámfrontok a hatékony végrehajtás miatt csoportosított munkaelemek a CU-n.
3.2.2. A kernel modell
2.14. ábra -
3.2.2.1. A kernel modell - 1
A programozó un. kernelekkel írja le a teljes végrehajtási tartományon végrehajtandó utasítások halmazát.
2.15. ábra - A kernel modell értelmezése
A kerneleket HLL szinten specifikálják, és azokat a fordító a virtuális gép szintjére fordítja le.
3.2.2.2. A kernel modell - 2
A kernel a végrehajtási tartományon (N dimenziós tér) lefuttatott utasítások sorozata.
A kernelek utasításai lehetnek
• vektor utasítások, melyek pl. a CU mind a 16 EU-jára vonatkoznak, vagy
A GPGPU modell virtuális gép elve
30 Created by XMLmind XSL-FO Converter.
• vektor memória utasítások, melyek adatátvitelt (írást és olvasást) írnak elő a GPU memória és a CU-n
található vektor regiszter fájl között, stb.
Megjegyzés
A kernelek számításorientált adatpárhuzamos programok, a shaderek pedig a GPU-n futtatandó grafika orientált
alkalmazások.
3.2.2.3. A kernel modell - 3
Magasszintű nyelvek, mint az OpenCL vagy a CUDA C lehetővé teszik olyan kernelek definiálását, amelyek
meghíváskor párhuzamosan futnak le n különböző szálon, ellentétben a normál C nyelven írt, egyszer lefutó
hagyományos függvényekkel.
3.2.2.4. Kernelek specifikációja
• A kernelt a következőképp lehet definiálni:
• típus jelző vezeti be (pl. _kernel OpenCL-ben, _global_ CUDA C-ben) majd
• definiálni kell a végrehajtandó utasításokat.
3.2.2.5. Kernelek mintakódjai
A következő mintakódok két vektorösszeadást végző kernelt mutatnak be (a két eredeti vektor az „a/A” és a
„b/B”, az eredmény vektor a „c/C”)
2.16. ábra -
Megjegyzés
Futás közben minden szálat egy egyedi azonosítószám identifikál, ami
• CUDA C esetében int I, a threadIdx változón keresztül érhető el,
• OpenCL esetében pedig int id , amit a beépített get_global_id() függvény ad vissza.
3.3. A platform modellje
2.17. ábra -
A GPGPU modell virtuális gép elve
31 Created by XMLmind XSL-FO Converter.
3.3.1. A számítási erőforrások modellje
2.18. ábra -
Az elérhető számítási erőforrásokat virtuális gép szinten specifikálja.
Hierarchikus felépítésű, a lenti ábra szerint.
2.19. ábra - A számítási erőforrások modellje [15]
3.3.1.1. Számítási egységek (Compute Units (CU))
Különböző megvalósításúak lehetnek, pl.:
• 16 VLiW5/VLIW4 ALU az AMD Southern Islands termékvonala előtt vagy
A GPGPU modell virtuális gép elve
32 Created by XMLmind XSL-FO Converter.
• 2x16 FX/FP32+16 L/S+4 SFU (Special Functions Unit) EU az Nvidia Fermi100/110 GPU-kban.
A CU tényleges megvalósítása nem része a számítási erőforrások modelljének, mivel az az adott GPGPU mag
mikroarchitektúrájához tartozik.
3.3.1.2. 1. példa : Az AMD Evergreen sorozatába tartozó Cypress mag felépítése [16]
2.20. ábra -
3.3.1.3. Az AMD továbbfejlesztett VLIW5 Feldolgozó elemének (VLIW5 ALU) felépítése [17]
2.21. ábra -
A GPGPU modell virtuális gép elve
33 Created by XMLmind XSL-FO Converter.
Továbbfejlesztett VLIW5 kialakítás
RV770 mag/HD4870 kártya, (2008)
Evergreen vonal (RV870 mag/HD5870 kártya), (2009)
Óraciklusonként
• 5 FX32 vagy 5 FP32 művelet, vagy
• 1 FP64 művelet vagy
• 1 transzcendentális + 4 FX/FP 32 művelet
végrehajtására képes.
3.3.1.4. 2. példa: Az Nvidia GF100/GF110 magjainak felépítése a Fermi sorozatban [11], [18]
2.22. ábra -
A GPGPU modell virtuális gép elve
34 Created by XMLmind XSL-FO Converter.
3.3.1.5. A GF100 mag CU-jának felépítése [19]
2.23. ábra -
Megjegyzés
Az FX/FP32 EU-kat az Nvidia magnak (core) nevezi.
3.3.1.6. A Compute Unit (számítási egység - CU) különböző megnevezései
Streaming multiprocessor (SM/SMX) (Nvidia),
A GPGPU modell virtuális gép elve
35 Created by XMLmind XSL-FO Converter.
Superscalar shader processor, Compute Unit (CU) (AMD),
Wide SIMD processor, CPU core (Intel).
3.3.2. A memória modell
2.24. ábra -
A memória modell megadja a virtuális gép szintjén elérhető összes tárterületet a jellemzőivel együtt, mint pl. a
hozzáférési mód (olvasás, írás), adatszélesség stb.
A memória modell legfontosabb elemei a következők:
2.25. ábra - GPGPU-kon a virtuális gép szintjén elérhető tárterületek
3.3.2.1. b) Az OpenCL memória modelljének bemutatása [15]
2.26. ábra -
A GPGPU modell virtuális gép elve
36 Created by XMLmind XSL-FO Converter.
3.3.2.2. Memória tárhelyek hozzáférhetősége a host és a kernel számára az OpenCL-ben [15]
2.27. ábra -
Megjegyzések
1. Az AMD csak a 2008-ban megjelent RV770 alapú HD 4xxx termékvonalban vezette be a helyi memóriát,
amit Local Data Store-nak (Helyi adattárolónak) neveztek.
2. A korábbiakban tárgyalt memória tárhelyeken túl léteznek további, a virtuális gép szintjén meghatározott
tártípusok is, mint például az AMD Global Data Share eleme, ami az RV770 alapú HD 4xxx vonalban jelent
meg 2008-ban.
3. Az egyes tárhelyek maximális méretét a közbülső nyelv vonatkozó utasításainak formátuma határozza meg.
4. Egy adott tárhely tényleges mérete megvalósításfüggő.
5. A hagyományos gyorsítótárak nem láthatóak a virtuális gép szintjén, azok tipikusan transzparensek a program
futása közben.
Mindazonáltal a fejlettebb GPGPU-k lehetővé tesznek explicit cache menedzsmentet is a virtuális gép szintjén,
például előlehívás utasítást biztosítva.
Ilyen esetben a memória modellt ki kell egészíteni a rendelkezésre álló gyorsítótárakkal.
3.3.2.3. Példa 1: Az Nvidia PTX 3.1-ben alkalmazott memória modellje (2012) [20]
(Az állandó memória tárhely bár elérhető, az ábrán nem szerepel)
2.28. ábra -
A GPGPU modell virtuális gép elve
37 Created by XMLmind XSL-FO Converter.
3.3.2.4. Az Nvidia PTX 3.1-ben alkalmazott memória modell megvalósítása [20]
2.29. ábra -
3.3.2.5. Az Nvidia memória modellje és a vonatkozó CUDA valamint OpenCL terminológia összevetése [21]
2.30. ábra -
A GPGPU modell virtuális gép elve
38 Created by XMLmind XSL-FO Converter.
3.3.2.6. 2. Példa: Az AMD 2.0-ás verziójú IL-je alatt rendelkezésre álló tárhelyek (egyszerűsítve)
2.31. ábra - Az AMD IL v2.0 alatt rendelkezésre álló tárhelyek [22]
Megjegyzés
• A tárhelyek maximális méretét és az utasítás formátumot a köztes nyelv határozza meg.
• A tárhelyek aktuális mérete megvalósításfüggő.
3.3.2.7. Az AMD Cayman grafikus magjának memória modellje (Northern Islands/HD 69xx) [23]
2.32. ábra -
A GPGPU modell virtuális gép elve
39 Created by XMLmind XSL-FO Converter.
3.4. A végrehajtási modell
A SIMT számítási modell végrehajtási modelljét az alábbi 5 komponens együtteseként értelmezzük:
2.33. ábra - A végrehajtási modell fő komponensei
3.4.1. A SIMT végrehajtás elve
2.34. ábra - A végrehajtás modell fő fogalmai
A SIMT végrehajtás elve az alábbi három fő komponensből tevődik össze:
• a) masszív többszálúság a végrehajtás közbeni várakoztatások (stalls) elrejtésére
• b) SIMD-jellegű végrehajtás az adat párhuzamosság kihasználására és
• c) zéró-büntetésű többszálúság a hullámfrontok hatékony váltása érdekében.
3.4.1.1. a) Masszív többszálúság
A GPGPU modell virtuális gép elve
40 Created by XMLmind XSL-FO Converter.
A hullámfrontok feldolgozásakor a GPGPU hosszú várakozási idővel járó utasításai (mint például a memóriából
történő olvasás) hosszú, 100 óraciklus nagyságrendű várakoztatásokat okoznak.
Ezek a várakoztatások elrejthetőek úgy, hogy a várakozó hullámfront futását az ütemező felfüggeszti és helyére
pedig egy új, futásra kész hullámfrontot allokál.
2.35. ábra - Memóriaolvasás miatti várakozások elrejtését lehetővé tevő hullámfront
ütemezés [24]
A fent leírt működés megvalósítható példáúl úgy, hogy memória olvasás utasítás kiadásakor az ütemező minden
esetben egy másik futtatható hullámfrontra vált át.
Megjegyzés
A fent bemutatott ütemezést durva szemcsézettségű ütemezésnek nevezzük, mivel a hullámfrontok mindaddig
futhatnak, amíg egy esemény nem kényszerítí azokat várakozásra.
Ezzel ellentétben a finom szemcsézettségű ütemezésnél az ütemező minden óraciklusnál új hullámfrontot
jelölhet ki futásra.
Megjegyzés
Ha a rendszerben elegendő számú futatható hullámfront van, akkor masszív többszálúsággal a memória olvasás
miatti várakoztatások hatékonyan elfedhetőek.
Ennek eléréséhez az Nvidia Fermi alapú GPGPU-i CU-nként max. 48 hullámfrontot (warp-ot) képesek kezelni.
Masszív többszálúság esetén a gyorsítótárak iránti igény lecsökken, így a szilícium lapkán a cache által elfoglalt
hely felszabadul, és az a számítási teljesítmény növelésére fordítható, amint azt a lenti ábra szemlélteti.
2.36. ábra - CPUk és GPUk lapkaterületének eltérő kihasználtsága [10]
3.4.1.2. b) SIMD jellegű végrehajtás - 1
A GPGPU modell virtuális gép elve
41 Created by XMLmind XSL-FO Converter.
A masszív többszálúság SIMD utasítás végrehajtáson alapul, a használt platform modellnek megfelelően.
2.37. ábra - A használt platform modell [15]
3.4.1.3. A SIMD végrehajtás elve
SIMD végrehajtás esetén a PE-k SIMD regiszter fájlokat használnak, amelyekben adott számú széles regiszter
található (pl. 16 128 vagy 256 bit hosszúságú regiszter).
Egy SIMD utasítás végrehajtásához az egység a SIMD regiszter fájlból betölti a hivatkozott forrás
operandusokat (FX vagy FP adatvektorokat), a PE-k végrehajták az utasítást és visszaírják az eredményvektort a
SIMD regiszter fájl megadott címére (ld. ábra).
2.38. ábra - A SIMD végrehajtás elve
A GPGPU modell virtuális gép elve
42 Created by XMLmind XSL-FO Converter.
3.4.1.4. b) SIMD jellegű végrehajtás - 2
Ezzel szemben SIMT feldolgozás esetén minden szál saját regiszter fájllal bír (szálankénti RF). A rendelkezésre
álló PE-k SIMD jelleggel végrehajtják az adott kernel utasítást a tekintett hullámfronton.
A PE-k kiolvassák az aktuális kernel utasításhoz tartozó operandusokat a szálakhoz tartozó regiszter fájlokból,
végrehajtják a kívánt műveletet minden szál esetén majd pedig visszaírják az eredményt a szálakhoz tartozó
regiszter fájlokba (RF).
For each kernel instruction the operands are fetched from the actual Per thread Register Files (RF), the same
operation is performed by all PEs available for the execution of the wavefront and the results are written back
into the actual Per thread Register Files (RF).
2.39. ábra - SIMT végrehajtás elve
3.4.1.5. c) Zéró büntetésű többszálúság (Zero penalty multithreading)
Amennyiben minden szálhoz tartozik egy privát regiszter fájl, ami az adattér kontextusnak nevezett állapotát
nyilvántartja, akkor egy másik hullámfrontra történő váltáskor a kontextus váltás egyszerűen elvégezhető az
aktuális regiszter fájlra mutató pointer átírásával, amint ezt az alábbi ábra szemlélteti.
Ebben az esetben a kontextus váltás nem jár óraciklus veszteséggel.
2.40. ábra - A SIMT végrehajtás elve
A GPGPU modell virtuális gép elve
43 Created by XMLmind XSL-FO Converter.
3.4.1.6. A SIMD és a SIMT végrehajtás összevetése
2.41. ábra - A SIMD és a SIMT végrehajtás összevetése
3.4.2. A feladat szétosztása a PE-k felé
2.42. ábra - A végrehajtás modell fő fogalmai
A feladat szétosztása a PE-k felé
a) A programozó munkacsoportokra bontja a végrehajtási tartományt.
b) A globális ütemező a CU-khoz rendeli a munkacsoportokat.
A GPGPU modell virtuális gép elve
44 Created by XMLmind XSL-FO Converter.
c) A GPGPU globális útemezője a munkacsoportokat hullámfrontokra (warp-okra) bontja, melyek a SIMT
magok feldolgozó futószalagjaira kerülnek.
d) A Feldolgozó elem (PE) ütemezője a hullámfrontokat (warp-okat) végrehajtásra ütemezi.
Az első három lépés „a feladat szétosztása a PE-k-felé” a számítési modell része, ezzel szemben a negyedik
lépés (d) megvalósításfüggő, vagyis eltérő GPGPU családok azt eltérően hajtják végre a PE tényleges
megvalósításának megfelelően, így ez a lépés nem része a számítási modellnek.
3.4.2.1. a) A végrehajtási tartomány felbontása munkacsoportokra - 1
A programozó a végrehajtási tartományt azonos méretű szeletekre bontja, amelyeket munkacsoportoknak
(work-group) vagy szál blokkoknak (thread block), nevezzük. Ez lesz az az egységnyi feladat, amit a CU-knak
kell végrehajtaniuk.
2.43. ábra - A végrehajtási tartomány felbontása munkacsoportokra
512x512-es méretű végrehajtási tartomány felbontása négy 256x256-os méretű munkacsoporttá.
3.4.2.2. A végrehajtási tartomány felbontása munkacsoportokra - 2
2.44. ábra - A végrehajtási tartomány felbontása munkacsoportokra
• A munkacsoportokat a rendelkezésre álló CU-k párhuzamosan futtatják.
• A végrehajtási tartomány munkacsoportokra történő bontását a programozó vagy a HLL határozza meg, így
az implementáció függő.
3.4.2.3. b) Munkacsoportok hozzárendelése a CU-khoz
A munkacsoportokat a GPGPU/DPA ütemezője rendeli hozzá végrehajtási egységként az egyes CU-khoz.
A GPGPU modell virtuális gép elve
45 Created by XMLmind XSL-FO Converter.
3.4.2.4. Példa: Munkacsoportok hozzárendelése a CU-khoz az AMD Cayman GPGPU-kban (Northern Islands család) [16]
2.45. ábra -
3.4.2.5. Soros / párhuzamos kernel feldolgozás a CU-n
Ez a funkció megvalósítás függő és nem része a virtuális gép szinten definiált számítási modellnek, viszont a
végrehajtás hatékonyságát alapvetően befolyásolja, ezért itt röviden foglalkozunk vele.
2.46. ábra -
3.4.2.6. 1. Példa: Soros / párhuzamos kernel feldolgozás az Nvidia GPGPU-kban [25], [18]
• A Gigathread ütemezőnek nevezett globális ütemező jelöli ki a feladatokatt a CU-k számára.
• Az Nvidia Fermi előtti GPGPU generációiban (G80-, G92-, GT200-alapú GPGPU-k) a globális ütemező csak
egyetlen kernelből tudott a CU-khoz munkacsoportot hozzárendelni (soros kernel végrehajtás).
A GPGPU modell virtuális gép elve
46 Created by XMLmind XSL-FO Converter.
• Ezzel szemben a Fermi-alapú és a későbbi GPGPU-k globális ütemezője képes legfeljebb 16 kernelt
egyidőben futtatni - de minden CU-n legfeljebb egy kernel futtatható (párhuzamos kernel végrehajtás).
2.47. ábra -
3.4.2.7. 2. Példa: Soros / párhuzamos kernel feldolgozás az AMD GPGPU-kban
• A Cayman alapú rendszerek előtti (Northern Islands család) a GPGPU-k esetében egyetlen kernel futhatott a
GPGPU-n.
Ezekben a rendszerekben a feladat ütemező a munkacsoportokat szétosztja az összes rendelkezésre álló CU-
ra, annak érdekében, hogy a GPGPU minél nagyobb teljesítményt érjen el.
• A Cayman alapú rendszerek (Northern Islands család) (2010) és az azt követő családok viszont már több
kernel egyidejű futását teszik lehetővé a GPGPU-n. Az egyes kernelek ez esetben vagy egy, vagy több CU-n
futhatnak, lehetővé téve ily módon a hardver erőforrások jobb, több párhuzamosságot biztosító
kihasználtságát.
3.4.2.8. 2. Példa: Több kernel egyidejű hozzárendelése a CU-khoz a Cayman alapú magoknál (Northern Islands család)
2.48. ábra -
A GPGPU modell virtuális gép elve
47 Created by XMLmind XSL-FO Converter.
3.4.2.9. c) Munkacsoportok hullámfrontokká (warp-okká) történő szegmentálása
A GPGPU ütemezője a munkacsoportokat hullámfrontokká szegmentálja.
A hullámfrontokat ezután a CU egységként ütemezi végrehajtásra.
A munkacsoportok hullámfrontokká történő szegmentálása a számítási modell része, azonban a hullámfrontok
mérete és a szegmentálás mikéntje implementációfüggő, tehát nem része a számítási modellnek.
A hullámfrontok méretével kapcsolatban a 2.3-as fejezetre hivatkozva a következő megállapításokat tehetjük:
• Az Nvidia GPGPU-iban a (warp-nak nevezett) hullámfrontok 32 munka-elemet tartalmaznak.
• Az AMD GPGPU-i eltérő méretű hullámfrontokkal dolgoznak;
• a nagy teljesítményű GPGPU kártyák, amilyen például a Southern Islands család HD 7950/70 modelljei, a
hullámfrontok jellemzően 64 méretűek, míg az
• alacsonyabb teljesítményű kártyák 32, 24, vagy akár 16 munkaegységből álló hullámfrontokkal dolgoznak.
3.4.3. Az adatmegosztás elve
2.49. ábra - A végrehajtás modell fő fogalmai
• A szálak közötti kommunikáció mikéntjét az adatmegosztás elve határozza meg.
• Ez nem egy új keletű elv, hanem a következő példán bemutatott memória használatból következik.
A GPGPU modell virtuális gép elve
48 Created by XMLmind XSL-FO Converter.
3.4.3.1. Példa: Adatmegosztás az Nvidia PTX rendszerben
(Csak a fontosabb elemeket ábrázoljuk itt [13] alapján)
2.50. ábra -
Megjegyzések
1. A munkacsoportokat blokkok jelölik az ábrán.
2. Az állandó memória nincs jelölve.
Az adatmegosztás felépítése ugyanilyen, viszont az csak olvasható hozzáférést biztosít.
3.4.4. Az adatfüggő végrehajtás elve
2.51. ábra - A végrehajtás modell fő fogalmai
A GPGPU modell virtuális gép elve
49 Created by XMLmind XSL-FO Converter.
SIMT feldolgozás esetén minden szálnak alapvetően ugyanazt a műveletet kell végrehajtania, azonban lehetőség
van a szálak adatfüggő végrehajtására is az alábbiak szerint.
Elágazások esetében a PE egymás után az elágazás mindkét ágát végrehajtja a hullámfront minden elemén,
viszont ténylegesen csak azok a műveletek hajtódnak végre, melyekre a megadott feltétel teljesül (pl. xi > 0).
A következő példa ezt illusztrálja.
3.4.4.1. Példa adatfüggő elágazásfeldolgozásra - 1 [26]
2.52. ábra - Elágazások végrehajtása - 1 [26]
3.4.4.2. Példa adatfüggő elágazásfeldolgozásra - 2 [26]
2.53. ábra - Elágazások végrehajtása - 2 [26]
A GPGPU modell virtuális gép elve
50 Created by XMLmind XSL-FO Converter.
Először minden olyan ALU mely azt érzékeli, hogy a megadott feltétel teljesül, végrehajtja a megadott
műveleteket, míg azon ALUk melyeknél a megadott feltétel nem teljesül NOP utasítást hajtanak végre. majd a
CU áttér az elágazás másik ágának a végrehajtására.
3.4.4.3. Példa adatfüggő elágazásfeldolgozásra - 3 [26]
2.54. ábra - Utasítás folyam végrehajtásának folytatása elágazás után [26]
3.4.5. A szinkronizáció elve
2.55. ábra - A végrehajtás modell fő fogalmai
A GPGPU modell virtuális gép elve
51 Created by XMLmind XSL-FO Converter.
A GPGPU-k sorompó szinkronizációt (barrier synchronization) használnak, a hullámfront alapú működési
elvüknek megfelelően.
A sorompó szinkronizáció azonban vagv a szál futtatás szinkronizációjára vagy a memória írások és olvasások
szinkronizációjára vonatkozhat, a lenti ábra szerint.
2.56. ábra -
3.4.5.1. Szál végrehajtás sorompó szinkronizációja
Segítségével a munkacsoporton belüli hullámfrontok szinkronizációja oldható meg úgy, hogy egy
munkacsoporton belül minden munkaelemnek el kell érnie ugyanahhoz a szinkronizációs ponthoz (amit a
sorompó szinkronizációs utasítás jelöl ki), mielőtt a futtatás folytatódhat.
Megvalósítása:
• Az Nvidia PTX-ben a „bar” utasítással “bar” instruction [27] vagy
• az AMD IL-ben a “fence thread” utasítással [28].
3.4.5.2. Memória írások és olvasások sorompó szinkronizációja
• Ezzel az utasítással biztosítható az, hogy a memória írási és olvasási műveletek sorrendjét a GPGPU ne
módosítsa a sorompón keresztül a megadott adatterületen (Helyi adatterület /Globális memória/ Rendszer
memória).
• Ilyen esetben a szál végrehajtása akkor folytatódik, ha már minden korábbi memória írás befejeződött a
szálakban, és ezáltal az adat elérhetővé vált minden szál számára a megadott tárhelyen.
Megvalósítása:
• Az Nvidia PTX-ben a “membar” utasítással [27]vagy
• az AMD IL-ben a “fence lds”/”fence memory” utasításokkal [28].
4. GPGPU-k pseudo ISA szintű leírása
• A GPGPUk pseudo ISA szintű leírása határozza meg a virtuális gép szinten elérhető utasításkészletet.
• A pseudo ISA a valódi ISA-val együtt fejlődik egymást követő verziók formájában.
• A fejlődés mind a pseudo architektúra kvalitatív (funkcionális) mind pedig kvantitatív jellemzőire vonatkozik.
A GPGPU modell virtuális gép elve
52 Created by XMLmind XSL-FO Converter.
A GPGPU-k fejlesztésében élenjáró két világcég két eltérő pseudo ISA családot fejlesztett ki az alábbiak szerint:
2.57. ábra -
A pseudo ISA-k dinamikusan fejlődnek, követvén mind a HLL szoftver környezet, mind pedig az alatta
található hardver mikroarchitektúra evolúcióját.
A fejlődésük adott GPGPU családokhoz köthető fő verziókra bontható az alábbi ábra szerint.
2.58. ábra -
Megjegyzés
A két gyártóspecifikus pseudo ISA-n túl az OpenCL fejlesztéséért felelős szervezet (Khronos Group) 2012-ben
bemutatott egy szabványos (gyártófüggetlen) köztes leírónyelvet, ami OpenCL programok szabványos leírására
szolgál. A köztes nyelv elnevezése: OpenCL Standard Portable Intermediate Representation (SPIR - OpenCL
szabványos hordozható köztes leírás).
Az SPIR az OpenCL 1.2-n és az LLVM 3.1-en alapul [29].
(Az LLVM a fordító programok széles körben használt nyelvfüggetlen köztes formátuma.)
Jelenleg nem lehet előre látni azt, hogy a GPGPU technológia vezető gyártói milyen fogadtatásban fogják
részesíteni a SPIR-t.
4.1. Pseudo ISA-k leírása
Mivel a pseudo ISA-k egy adott GPGPU implementációhoz köthetőek, ezért célszerűbb azokat egy konkrét
példán keresztül bemutatni mintsem egy gyártó független általános leírást adni.
Az Nvida PTX teljesebb dokumentációval rendelkezik, mint az AMD IL, így a pseudo ISA-k rövid áttekintését
az Nvida PTX példáján keresztül fogjuk bemutatni, főbb jellemzőik fejlődésére fókuszálva.
4.2. Mintapélda: Az Nvidia PTX virtuális gép pseudo ISA szintű leírása
A GPGPU modell virtuális gép elve
53 Created by XMLmind XSL-FO Converter.
Gyakran rövidítik PTX pseudo ISA-ként.
4.3. Mintapélda: Az Nvidia PTX virtuális gép pseudo ISA szintű leírása
A GPGPU-k pseudo ISA szintű leírása
• közel van a „vashoz” (vagyis a GPGPU-k valódi ISA-jához), valamint
• hardverfüggletlen kódformátumot biztosít a CUDA, OpenCL fordítók számára.
2.59. ábra -
A PTX virtuális gép elve vezette be a kétfázisú fordítási eljárást.
1) Először az alkalmazást (pl. CUDA vagy OpenCL programot) pseudo kódra fordítja az adott fordító (ezt a
pseudo kódot nevezik PTX ISA vagy PTX kódnak is).
A PTX kód egy pseudo kód, mivel közvetlenül nem futtatható, hanem azt előbb le kell még fordítani az adott
GPGPU aktuális ISA-jára, hogy végrehajthatóvá váljon.
2.60. ábra -
A GPGPU modell virtuális gép elve
54 Created by XMLmind XSL-FO Converter.
2) Annak érdekében, hogy a PTX kód futtathatóvá váljon, azt előbb az adott GPGPU ISA-jának megfelelő
kódra, az ún. CUBIN fájlra le kell fordítani.
Ezt a fordítást a CUDA meghajtó végzi el a program betöltésekor (Just-In-Time).
2.61. ábra -
4.4. Nvidia számítási képesség (számítási képesség) elve [31], [1]
• Az Nvidia a számítási képességek meghatározásával tartja nyilván eszközeinek és programozási
környezeteinek a fejlődését. A számítási képesség verziószáma mind
A GPGPU modell virtuális gép elve
55 Created by XMLmind XSL-FO Converter.
• a köztes nyelv verziókra (PTX verziók) és
• a valódi architektúrákra (GPGPU ISA)
egyaránt vonatkozik.
• A számítási képesség verziók megjelölése
• GPGPU ISA-k egymás utáni verzióit sm_1x/sm_2x vagy sm_3x névvel jelölik.
• Az első számjegy (1, 2 vagy 3) a főverzió (major version) szám, a második jegy az alverzió (minor
version).
• Az 1.x (vagy 1x) főverziószámok a Fermi előtti , a 2.x (vagy 2x) jelőlésűek a Fermi alapú, a 3.x (vagy 3x)
jelőlésűek pedig a Kepler alapú implementációkra utalnak.
Megjegyzés [1]
A pseudo PTX ISA és a valódi GPGPU ISA számítási képesség verziói közötti összefüggés
Egészen mostanáig a pseudo PTX ISA és a valódi GPGPU ISA verziók között közvetlen megfeleltetés volt,
vagyis ugyanahhoz a fő és alverzióhoz tartozó ISA-k azonos számítási képességgel rendelkeztek.
A számítási képesség verziók jellemzőit a következő táblázatok foglalják össze.
4.5. a) A funkcionális jellemzők, vagyis a számítási képességek összehasonlítása egymást követő Nvidia pseudo ISA (PTX) verziókban [32]
2.62. ábra -
A GPGPU modell virtuális gép elve
56 Created by XMLmind XSL-FO Converter.
4.6. b) Az eszközjellemzők fejlődésének összehasonlítása egymást követő Nvidia pseudo ISA (PTX) számítási képességekben [32]
2.63. ábra -
4.7. c) Számítási képességhez kötött architektúra specifikációk az Nvidia PTX-ben [32]
2.64. ábra -
4.8. d) Natív aritmetikai utasítások végrehajtási sebessége az Nvidia PTX számítási képességeinek egymást követő verzióiban (utasítás / óraciklus/SM) [7]
2.65. ábra -
A GPGPU modell virtuális gép elve
57 Created by XMLmind XSL-FO Converter.
Bizonyos CUDA (és OpenCL) verziók egy adott PTX verzióra vonatkozó PTX kódot generálnak (PTXu.v)
amely egy adott számítási képesség verziót (smx.y) támogat a következő táblázat szerint.
4.9. Egymást követő CUDA SDK-kkal megjelent PTX ISA verziók, valamint az általuk támogatott számítási képesség verziók (sm[xx]) (A táblázatban ez Supported Targets néven szerepel) [20]
2.66. ábra -
A GPGPU modell virtuális gép elve
58 Created by XMLmind XSL-FO Converter.
A számítási képesség verziószám meghatározza az Nvidia GPGPU magjai és kártyái által nyújtott számítási
képességeket, az alábbiak szerint.
4.10. Nvidia GPGPU magjai és kártyái által támogatott számítási képesség verziók [32]
2.67. ábra -
4.11. A PTX kód előre hordozhatósága [31]
A Fermi előtti GPGPU-kra fordított alkalmazások, amelyek tartalmazzák a kerneleik PTX verzióját, változtatás
nélkül futtathatók Fermi GPGPU-kon is.
4.12. Egy megadott GPGPU számítási képesség verzióra fordított objektum fájlra (CUBIN file) vonatkozó kompatibilitási szabályok [31]
Az alapvető szabály főverziókon belül az előre kompatibilitás (pl. az sm_1x vagy sm_2x verziókban) a
főverziók között azonban a kompatibilitás nem létezik.
Ezt a következőképpen kell értelmezni:
Egy megadott GPGPU számítási képesség verzióra fordított, CUBIN fájlnak nevezett objektum fájlokat minden
olyan eszköz támogatja, amely azonos főverzióval, és a célnál magasabb alverziószámmal rendelkezik.
Pl. a számítási képesség 1.0-ra fordított objektum kód minden 1.x eszközön fut, azonban nem támogatott a 2.0-
ás számítási képességgel rendelkező (Fermi) eszközökön.
További részleteket illetően lásd [31].
59 Created by XMLmind XSL-FO Converter.
3. fejezet - GPGPU magok és kártyák áttekintése
1. Általános áttekintés
3.1. ábra - A SIMT végrehajtás megvalósítási alternatívái
1.1. GPGPU magok
A GPGPU kártyák és az adatpárhuzamos gyorsítók egyaránt GPGPU magokon alapulnak.
3.2. ábra - Az Nvidia és AMD/ATI GPGPU vonalainak áttekintése
GPGPU magok és kártyák
áttekintése
60 Created by XMLmind XSL-FO Converter.
3.3. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése
(1)
3.4. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése
(2)
GPGPU magok és kártyák
áttekintése
61 Created by XMLmind XSL-FO Converter.
3.5. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése
(3)
Megjegyzés
1) A Northern Islands családdal kezdődően (HD 6xxx) az AMD megváltoztatta grafikus kártyáinak az
elnevezését az alábbiak szerint:
• az Evergreen családig (HD 5xxx) az AMD az ATI HD xxxx márkanevet használta,
GPGPU magok és kártyák
áttekintése
62 Created by XMLmind XSL-FO Converter.
• a Northern Islands családtól kezdve azonban áttértek az AMD HD xxxx márkanévre.
2) A fenti áttekintés nem tartalmazza a dual-GPU kártyákat. Ezeket a következő két táblázat mutatja be.
1.2. Az Nvidia duál-GPU grafikus kártyáinak főbb jellemzői
3.6. ábra - Main features of Nvidia’s dual-GPU graphics cards [33], [34]
1.3. Az AMD/ATI duál-GPU grafikus kártyáinak főbb jellemzői
3.7. ábra - Az AMD/ATI duál-GPU grafikus kártyáinak főbb jellemzői [35]
1.4. Megjegyzés az AMD alapú grafikus kártyákhoz [36], [37]
A Cypress alapú HD 5xxx sorozattal (Evergreen család) és a 2.0-ás SDK verzióval az AMD HLL programozási
nyelvét megváltoztatta Brook+-ról OpenCL-re.
3.8. ábra -
GPGPU magok és kártyák
áttekintése
63 Created by XMLmind XSL-FO Converter.
Ennek következtében az AMD megváltoztatta
• a GPGPU-ik mikroarchitektúráját (bevezetvén a helyi és globális adatmegosztó memóriát), valamint
• a terminológiáját, bevezetvén az 5.2-es fejezetben tárgyalt OpenCL előtti és OpenCL elnevezéseket.
2. Az Nvidia grafikus magok és kártyák főbb jellemzőinek áttekintése
2.1. Az Nvidia grafikus magok és kártyák főbb jellemzői
3.9. ábra - Az Nvidia Fermi előtti grafikus kártyái [33]
Megjegyzés
A publikációkban eltérő állítások szerepelnek arról, hogy a GT80 képes-e dupla kibocsájtára (pl. egy MAD és
egy Mul művelet kibocsájtására) négy shader ciklus alatt.
GPGPU magok és kártyák
áttekintése
64 Created by XMLmind XSL-FO Converter.
Hivatalos specifikációk [6] szerint a GT80 dupla kibocsájtású, más irodalmi források [38] vagy a részben a
GT80 egyik fő fejlesztője által írt tankönyv [39]) szerint viszont nem.
A helyzet tisztázását végül egy blog tette lehetővé [37], melyből kiderült, hogy az Nvidia specifikációjában
megadott magasabb kibocsájtási értékbe beleszámították a TPU-ban található ALU egységeket is (ld. a
következő oldalon lévő ábrát).
3.10. ábra - A MAD (Multiply-ADD - Szorzás-Összeadás) művelet értelmezése [51]
2.1.1. Egy SM felépítése a G80 architektúrában
3.11. ábra -
Textúra feldolgozó egységek (TPU)
tartalma:
GPGPU magok és kártyák
áttekintése
65 Created by XMLmind XSL-FO Converter.
• TA: Texture Address (textúra cím)
• TF: Texture Filter (textúra szűrő)
FP32 vagy FP16 számításra képesek [40]
Megjegyezzük, hogy a grafikai számításoktól eltekintve (mint például a textúra szűrés) a CUDA nem érheti el
közvetlenül a TPU-kat.
Ennek megfelelően a a maximális számítási teljesítmény megadásakor helyénvaló csupán a MAD utasításokra
vonatkozó számítási teljesítményt figyelembe venni.
3.12. ábra - Az Nvidia Fermi alapú grafikus kártyáinak főbb jellemzői [33]
Megjegyzés a Fermi alapú grafikus kártyákhoz [36], [37]
Az FP64 teljesítmény
• Tesla 20-as sorozatban az FP32 sebességének fele,
• GeForce GTX 470/480/570/580 kártyáknál az FP32 sebesség 1/8,
más GForce GTX4xx kártyák esetében a sebesség 1/12.
ECC
csak a Tesla 20-as sorozatában implementálták.
DMA motorok száma
A Tesla 20-as sorozat két DMA motorral (másoló motorral) rendelkezik. A GeForce kártyákban egy DMA
motor található. Ez azt jelenti, hogy CUDA alkalmazások esetében a számítás és a kommunikáció
párhuzamosan folyhat kétirányú PCI-e kapcsolaton keresztül.
Memória méret
A Tesla 20-as sorozat termékei nagyobb memóriával rendelkeznek (3GB és 6GB).
GPGPU magok és kártyák
áttekintése
66 Created by XMLmind XSL-FO Converter.
Megjegyzés a GDDR memóriákról
1) A GDDR3 memória az adatátvitelt az órajel kétszeresével hajtja végre.
Tényleges adatátviteli ráta = 2 x memória frekvencia
A GDDR5 memória az adatátvitelt az órajel négyszeresével hajtja végre.
Tényleges adatátviteli ráta = 4 x memória frekvencia
2) Mind a GDDR3, mind a GDDR5 32-bites eszköz.
Ennek ellenére a GPGPU-k memória vezérlőjét ki lehet alakítani úgy, hogy a memória csatornák vagy 32-bites
szélességűek, vagy pedig két-két 32-bites csatorna összefogásával 64-bit szélesek legyenek.
3.13. ábra - Az Nvidia Kepler alapú grafikus kártyáinak főbb jellemzői [33]
GPGPU magok és kártyák
áttekintése
67 Created by XMLmind XSL-FO Converter.
2.1.2. Az Nvidia GPGPU kártyáinak pozicionálása a termékspektrumukon belül [41]
3.14. ábra -
GPGPU magok és kártyák
áttekintése
68 Created by XMLmind XSL-FO Converter.
2.2. Példák az Nvidia grafikus kártyáira
2.2.1. Nvidia GeForce GTX 480 (GF 100 alapú) [42]
3.15. ábra -
2.2.2. Párba állított Nvidia GeForce GTX 480 kártyák [42] (GF100 alapú)
GPGPU magok és kártyák
áttekintése
69 Created by XMLmind XSL-FO Converter.
3.16. ábra -
2.2.3. Nvidia GeForce GTX 480 és 580 kártyák [44]
3.17. ábra -
GPGPU magok és kártyák
áttekintése
70 Created by XMLmind XSL-FO Converter.
2.2.4. Nvidia GTX 680 kártya [80] (GK104 alapú)
3.18. ábra -
2.2.5. Nvidia GTX Titan kártya [81] (GK110 alapú)
3.19. ábra -
GPGPU magok és kártyák
áttekintése
71 Created by XMLmind XSL-FO Converter.
3. Az AMD grafikus magok és kártyák főbb jellemzőinek áttekintése
3.1. Az AMD grafikus magok és kártyák főbb jellemzői
3.20. ábra - Az AMD/ATI korai grafikus kártyáinak főbb jellemzői -1 [35]
GPGPU magok és kártyák
áttekintése
72 Created by XMLmind XSL-FO Converter.
3.21. ábra - Az AMD/ATI korai grafikus kártyáinak főbb jellemzői - 2 [35]
3.22. ábra - Az AMD Southern Islands sorozatú grafikus kártyái [35]
GPGPU magok és kártyák
áttekintése
73 Created by XMLmind XSL-FO Converter.
3.23. ábra - Az AMD Northern Islands sorozatú grafikus kártyái [35]
GPGPU magok és kártyák
áttekintése
74 Created by XMLmind XSL-FO Converter.
3.24. ábra - AMD Southern Islands sorozatú (GCN) grafikus kártyái [35]
3.25. ábra - Az AMD Sea Islands sorozatú grafikus kártyáinak főbb jellemzői [45]
GPGPU magok és kártyák
áttekintése
75 Created by XMLmind XSL-FO Converter.
3.2. Példák AMD grafikus kártyákra
3.26. ábra - ATI HD 5870 (RV870 alapú) [43]
GPGPU magok és kártyák
áttekintése
76 Created by XMLmind XSL-FO Converter.
3.2.1. ATI HD 5970 (gyakorlatilag RV870 alapú) [46]
3.27. ábra - ATI HD 5970: 2 x ATI HD 5870 némileg csökkentett memória órajellel
3.2.2. ATI HD 5970 (RV870 alapú) [47]
3.28. ábra - ATI HD 5970: 2 x ATI HD 5870 valamelyest csökkentett memória órajellel
GPGPU magok és kártyák
áttekintése
77 Created by XMLmind XSL-FO Converter.
3.2.3. AMD HD 6990 (Cayman alapú) [48]
3.29. ábra - AMD HD 6990: 2 x ATI HD 6970 valamelyest csökkentett memória és
shader órajellel
3.2.4. AMD Radeon HD 7970 (Tahiti XT, Southern Islands alapú) - Első GCN megvalósítás [49]
3.30. ábra - AMD HD 7970
GPGPU magok és kártyák
áttekintése
78 Created by XMLmind XSL-FO Converter.
3.2.5. GPGPU árak 2012 nyarán [50]
3.31. ábra - GPU árak összehasonlítása 2012 nyarán
GPGPU magok és kártyák
áttekintése
79 Created by XMLmind XSL-FO Converter.
80 Created by XMLmind XSL-FO Converter.
4. fejezet - Az Nvidia Fermi családhoz tartozó magok és kártyák
1. A Fermi család áttekintése
4.1. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése
(2)
A Fermi bejelentése: 2009 09. 30. az Nvidia GTC (GPU Technology Conference) rendezvényén.
Elérhető: 2010 első negyedévében [18]
4.2. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
81 Created by XMLmind XSL-FO Converter.
1.1. A Fermi főbb alcsaládjai
A Fermihez négy alcsalád (magok) tartozik, amelyek a következő tulajdonságokkal bírnak:
4.3. ábra -
2. A Fermi PTX 2.0 legfontosabb újításai
2.1. A PTX 2.0 áttekintése
• A Fermi a második generációs PTX 2.x (Parallel Thread eXecution) ISA-ra alapoz, mely a Fermi
termékvonallal együtt került bevezetésre.
• A PTX 2.x a PTX 1.x ISA jelentős átdolgozásával született, és felépítésében az x86 helyett inkább RISC-
szerű load/store architektúrát valósít meg.
Az Nvidia Fermi családhoz tartozó
magok és kártyák
82 Created by XMLmind XSL-FO Converter.
Az Nvidia állítása szerint a PTX 2.0 egy olyan hosszútávra tervezett ISA lesz a GPU-k tekintetében, mint
amilyen az x86 ISA a CPU-k esetében.
A PTX 2.0-ben bevezetett jelentős újdonságok alapján ill. a cég ezirányú kijelentéseinek figyelembevételével
várható az, hogy Nvidia GPGPU családja a PTX 2.0 megjelenésével egy relatív konszolidált fejlődési szakaszba
lépett.
2.2. A PTX 2.0 pseudo ISA főbb újításai
a) A változók és a pointerek számára biztosított egységesített címtér mely azonos load/store utasításkészlettel
érhető el.
b) 64 bites címzési lehetőség.
c) Új utasítások, amelyek támogatják az OpenCL és DirectCompute API-kat.
d) A predikáció teljeskörű támogatása.
e) A 32- és 64-bites lebegőpontos feldolgozás teljeskörű IEEE 754-3008 támogatása
A GPU-k programozhatósága, pontossága és teljesítménye jelentősen megnövekedik ezen újítások
bevezetésével.
2.2.1. a) A változók és a pointerek számára biztosított egységesített címtér mely azonos load/store utasításkészlettel érhető el - 1 [11]
• A PTX 1.0-ben három különálló címtér (a thread private local, block shared és global) van, melyek
mindegyikéhez saját load/store utasítás készlet tartozik.
• A programok mindhárom címtérben tárolhatják az adataikat (a load és store utasításokkal), olyan címeken,
melyek fordítási időben válnak ismertté.
A C és C++ nyelvekben használt mutatók implementálása komoly nehézségekbe ütközik, mivel azok csak futási
időben válnak ismertté.
4.4. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
83 Created by XMLmind XSL-FO Converter.
2.2.2. a) A változók és a pointerek számára biztosított egységesített címtér mely azonos load/store utasításkészlettel érhető el - 2 [11]
• A PTX 2.0 a fenti három címteret egy folyamatos címtérré egyesíti, melyet egyetlen load/store
utasításkészlettel lehet elérni.
• A PTX 2.0 lehetővé teszi az egységesített mutatók használatát is, amelyek bárhol elhelyezett objektumokra
mutathatnak, a Fermi pedig hardveresen a pointer referenciákat automatikusan a megfelelő memória területre
képezi le.
Az egységesített címtér miatt a Fermi támogatja a C++ programokat.
4.5. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
84 Created by XMLmind XSL-FO Converter.
2.2.3. b) 64-bites címzési lehetőség
• Az Nvidia korábbi GPGPU generációi (G80, G92, GT200) 32 bites címzést biztosítottak a load/store
utasításokhoz,
• a PTX 2.0 a címzést 64 bites lehetőséggel látja el a későbbi fejlődés érdekében, azonban a jelenlegi Fermi
megvalósítások csak 40 bites címzést használnak, így a címtér max. mérete 1 Terabyte.
2.2.4. c) Új utasítások, amelyek támogatják az OpenCL és DirectCompute API-kat
• Új utasítások, amelyek támogatják az OpenCL és DirectCompute API-kat
• Új utasításokat tartalmaz, amelyek ezen API-khoz hardveres támogatást biztosítanak.
2.2.5. d) A predikáció teljeskőrű támogatása [51]
• A PTX 2.0 minden utasítás esetében támogatja a predikációt.
• Ezeket az utasításokat a PE-k vagy végrehajtják vagy kihagyják a feltételkód aktuális értének megfelelően.
• A predikáció lehetővé teszi azt, hogy az egyes szálak eltérő utasításokat hajtsanak végre teljes sebességgel.
• A predikáció hatékonyabb megoldást jelent streaming jellegű alkalmazások futtatására mint a hagyományos
feltételes elágazás utasítások elágazásbecsléssel támogatva.
Megjegyzés
A predikáció elve
• A predikáció egy olyan program konstrukció, ami kiküszöböli a futószalag jellegű végrehajtás
hatékonyságának gátat szabó feltételes elágazásokat.
• A predikáció megvalósítása predikációs regisztereket igényel.
Az Nvidia Fermi családhoz tartozó
magok és kártyák
85 Created by XMLmind XSL-FO Converter.
• A megcímzett predikációs regiszter tartalmát a PE attól függően állítja be, hogy a hozzárendelt feltétel igaz,
vagy hamis (pl. túlcsordulás fordult elő stb.).
• A predikált utasítás akkor kerül végrehajtásra, ha a predikátum értéke igaz.
2.2.6. e) A 32- és 64-bites lebegőpontos feldolgozás teljeskörű IEEE 754-3008 támogatása
• A Fermi FP32 utasítás szemantikája és utasítás feldolgozása a PTX 2.0-tól kezdve támogatja a
• szubnormális számokkal végzett számításokat (a szubnormális számok a nulla és a legkisebb normalizált
szám közötti számok), és
• mind a négy kerekítési módot (legközelebbi, nulla, pozitív végtelen, negatív végtelen).
• A Fermi FMA (Fused Multiply-Add azaz - együttes szorzás-összeadás) utasításokat bocsát aprogramozó
rendelkezésére mind szimpla, mind dupla pontos lebegőpontos számításokhoz, melyek a közbülső számítás
során megőrzik a teljes pontosságot.
A korábbi GPGPU-k MAD (Multiply-Add, azaz szorzás-összeadás) utasításaival szemben ilyenkor ugyanis a
szorzás és az összeadás között nem történik levágás.
2.2.7. A Fermi GPGPU-kra történő programfejlesztések megkönnyítése [11]
• Az Nvidia Nexus néven elérhetővé tett az alkalmazás fejlesztők számára egy programozási környezetet,
amely támogatja a párhuzamos CUDA C, OpenCL és DirectCompute alkalmazásokat.
• A Nexus segítségével közvetlenül a Microsoft Visual Studioban lehet hibajavítást és teljesítmény analizíst
végezni párhuzamos forráskódok esetén.
• A Visual Studiot használó alkalmazás fejlesztők ugyanazokat a hibakereső eszközöket és interfészeket
használhatják a GPU alkalmazások hibáinak feltárásához, amelyeket CPU-ra írott kódok esetében
megszoktak.
• Ezen túlmenően a Nexus kibővíti a Visual Studio funkcionalitását, lehetővé téve a masszív párhuzamosság
támogatását.
3. A Fermi mikroarchitektúrájának főbb újításai és továbbfejlesztései
3.1. Főbb újítások
a) Párhuzamos kernel futtatás
b) Valódi kétszintű cache hierarchia
c) SM-enként konfigurálható osztott memória és L1 cache
d) ECC támogatás
3.2. Főbb továbbfejlesztések
a) Jelentősen megnövelt FP64 teljesítmény
b) Jelentősen csökkentett kontextus váltási idők
c) 10-20-szorosára felgyorsított atomi memória műveletek
3.3. Főbb architekturális újdonságok a Fermiben
Az Nvidia Fermi családhoz tartozó
magok és kártyák
86 Created by XMLmind XSL-FO Converter.
3.3.1. a) Párhuzamos kernel futtatás [52], [18]
• A korábbi generációkban (G80, G92, GT200) a globális ütemező csak egyetlen kernelből tudott feladatot
ütemezni az SM-ek számára (soros kernel futtatás).
• A Fermi globális ütemezője akár 16 eltérő kernelt is képes egyidőben futtatni SM-enként.
• Egy nagy méretű kernel az SM határain is túlnyúlhat.
4.6. ábra -
3.3.2. b) Valódi kétszintű cache hierarchia [11]
• Hagyományos GPU architektúrákban a textúra műveletekhez használt „betöltési útvonal” csak olvasható, a
képpont adatok kimenetének használt „kiírási útvonal” pedig csak írható.
Számítási feladatok esetében azonban ez a megoldás gátolja az írás és olvasási utasítások átrendezését,
mellyel a feldolgozás sebessége növelhető lenne.
• Ezen hiányosság megszüntetése érdekében a Fermi mind az betöltés, mind a kiírás művelethez egységes
hozzáférési útvonalat valósít meg.
• A Fermi mindezek mellett egységes L2 gyorsító tárat biztosít a betöltés, kiírás és textúra kérés sebességének
növelése érdekében.
4.7. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
87 Created by XMLmind XSL-FO Converter.
3.3.3. c) SM-enként konfigurálható osztott memória és L1 cache [11]
• A Fermiben ezen túlmenően SM-enként konfigurálható osztott memória/L1 gyorsítótár van.
Az Nvidia Fermi családhoz tartozó
magok és kártyák
88 Created by XMLmind XSL-FO Converter.
• Az osztott memória/L1 gyorsítótár konfigurálható annak érdekében, hogy optimálisan támogassa mind az
osztott memóriát, mind pedig a lokális és globális memória műveletek sebességének növelését L1 gyorsítótár
segítségével.
Igy például választható 48 KB osztott memória 16 KB L1 gyorsító tárral, vagy fordítva.
• Az optimális konfiguráció az éppen futtatott alkalmazástól függ.
4.8. ábra -
3.3.4. d) ECC támogatás [11]
A Fermi hiba elleni védelemmel látja el a
• It protects
• DRAM memóriát,
• regiszter fájlokat,
• osztott memóriákat,
• L1 és L2 cacheket.
Megjegyzés
ECC támogatást csak a Tesla eszközök nyújtanak.
Az Nvidia Fermi családhoz tartozó
magok és kártyák
89 Created by XMLmind XSL-FO Converter.
3.4. A Fermi főbb architektúrális továbbfejlesztései
3.4.1. a) Jelentősen megnövelt FP64 teljesítmény
A korábbi G80 és GT200 alapú generációkkal összehasonlítva a Fermi jelentős gyorsulást nyújt FP64
teljesítményben a korábbi, csúcssebességű GPGPU kártyákhoz képest.
3.4.1.1. Csúcs Tesla kártyák
4.9. ábra -
3.4.1.2. Csúcs GPGPU kártyák
4.10. ábra -
3.5. Aritmetikai műveletek átviteli sebessége óraciklusonként és SM-enként [13]
4.11. ábra -
3.5.1. b) Jelentősen csökkentett kontextus váltási idők [11]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
90 Created by XMLmind XSL-FO Converter.
• A Fermi az alkalmazások közötti kontextus váltást mintegy 25 µs alatt hajtja végre.
• Ez nagyságrendileg 10-szer gyorsabb, mint a korábbi GT200 esetén (200-250 µs).
3.5.2. c) 10-20-szorosára felgyorsított atomi memória műveletek [11]
• Párhuzamos programozásban igen gyakran használnak atomi műveleteket az osztott adatstruktúrákon végzett
olvasás-módosítás-írás műveletek megfelelő sorrendjének biztosítására.
• A megnövelt számú atomi művelet feldolgozó, valamint az L2 cache miatt a Fermi az atomi műveleteket
közelítőleg 20-szor gyorsabban hajtja végre, mint a GT200 alapú eszközök.
4. A Fermi GF100 mikroarchitektúrája
4.1. A Fermi GF100 felépítése [18], [11]
4.12. ábra -
Fermi: 16 Streaming Multiprocessor (SM)
Mindegyik SM-ben: 32 ALU
512 ALUs
Megjegyzés
A sorozat csúcskártyájában (GTX 480) Nvidia egy SM-et letiltott túlmelegedési problémák miatt. Így a
GTX480-as kártyában csak 15 SM és 480 ALU van [a]
6x Dual Channel GDDR5 (6x 64 = 384 bit)
4.2. A Fermi GT100 magasszintű mikroarchitektúrája
4.13. ábra - A Fermi rendszerarchitektúrája [52]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
91 Created by XMLmind XSL-FO Converter.
4.3. Az Nvidia GPGPU-k magasszintű mikroarchitektúrájának fejlődése [52]
4.14. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
92 Created by XMLmind XSL-FO Converter.
Megjegyzés
A Fermi magas szintű mikroarchitektúrája a korábbi, grafika orientált struktúráktól egy számításorientált
struktúra irányába fejlődött.
4.4. Cuda GF100 SM felépítése [19]
(SM: Streaming Multiprocessor)
4.15. ábra -
4.5. Az Nvidia GPGPU-iban található magok (SM) fejlődése - 1
Az Nvidia Fermi családhoz tartozó
magok és kártyák
93 Created by XMLmind XSL-FO Converter.
GT80 SM [53]
4.16. ábra -
• 16 KB osztott memória
• 8 K regiszter x32-bit/SM
• legfeljebb 24 aktív warp/SM
legfeljebb 768 aktív szál/SM
átlagosan 10 regiszter/SM
GT200 SM [54]
4.17. ábra -
• 16 KB osztott memória
Az Nvidia Fermi családhoz tartozó
magok és kártyák
94 Created by XMLmind XSL-FO Converter.
• 16 K regiszter x32-bit/SM
• legfeljebb 32 aktív warp/SM
legfeljebb 1024 aktív szál/SM
átlagosan 16 regiszter/szál
• 1 FMA FPU (nincs az ábrán)
Fermi GT100/GT110 SM [19]
4.18. ábra -
• 64 KB osztott memória/ L1 Cache
• legfeljebb 48 aktív warp/SM
• 32 szál /warp
legfeljebb 1536 aktív szál/SM
átlagosan 20 regiszter /szál
4.6. Az Nvidia GPGPU-iban található magok (SM) fejlődése - 2
GF104 [55]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
95 Created by XMLmind XSL-FO Converter.
Az elérhető specifikáció szerint:
• 64 KB osztott memória/L1 Cache,
• 32 Kx32-bit regiszter/SM,
• 32 szál/warp,
• Legfeljebb 48 aktív warp/SM,
• Legfeljebb 1536 szál/SM.
4.19. ábra -
4.7. A Fermi GF100 GPGPU felépítése és működése
4.7.1. A Cuda GF100 SM felépítése [19]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
96 Created by XMLmind XSL-FO Converter.
4.20. ábra -
4.7.2. Egy ALU („CUDA mag”)
4.21. ábra - A single ALU [57]
Megjegyzés
Az Nvidia Fermi családhoz tartozó
magok és kártyák
97 Created by XMLmind XSL-FO Converter.
A korábbi generációk MAD (Multiply-Add, azaz szorzás - összeadás) művelete helyett a Fermi a az FMA
(Fused-Multiply-Add) műveletet használja, melynél a szorzás eredménye nem kerül csonkításra, hanem teljes
egészében figyelembe vevődik az összeadáshoz.
4.22. ábra - Multiply-Add (MAD) és Fused-Multiply-Add (FMA) műveletek összevetése
[51]
4.8. SIMT végrehajtás elve soros kernel végrehajtás esetén
4.23. ábra - szálak hierarchiája [58]
4.9. A Fermi GF100 GPGPU működési elve
A működés legfontosabb momentuma a feladat ütemezés.
4.10. Feladat ütemezés alfeladatai
Az Nvidia Fermi családhoz tartozó
magok és kártyák
98 Created by XMLmind XSL-FO Converter.
• Kernelek ütemezése az SM-ekre.
• Azonos kernelhez tartozó szálblokkok ütemezése az SM-ekre.
• Szálblokkok warpokká szegmentálása.
• Warpok ütemezése végrehajtásra az SM-ekre.
4.11. Kernelek ütemezése az SM-ekre [25], [18]
• A Gigathread schedulernek nevezett globális ütemező osztja szét a munkát minden SM számára.
• Korábbi generációkban (G80, G92, GT200) a globális ütemező csak egyetlen kernelből volt képes az SM-ek
számára munkát adni (soros kernel végrehajtás).
• A Fermiben a globális ütemező legfeljebb 16 különböző kernelt tud futtatni, SM-enként egyet.
• Egy nagy kernel több SM-en is futhat egyszerre - a kernel átnyúlhat az SM határokon.
4.24. ábra -
A korábbi generációkkal összehasonlítva a kontextus váltás ideje drasztikusan lecsökkent, az addigi 250 µs
helyett jelenleg 20 µs (ennyi idő szükséges a TLB-k, cachek, regiszterek visszaírásához, ürítéséhez stb.) [52].
4.12. Azonos kernelhez tartozó szálblokkok SM-hez rendelése
• A Gigathread ütemező legfeljebb 8, azonos kernelhez tartozó szálblokkot képes hozzárendelni minden SM-
hez.
(Egy adott SM-hez rendelt szálblokkok azonos kernelhez kell, hogy tartozzanak.)
• Mindazonáltal a Gigathread ütemező különböző kerneleket különböző SM-ekhez képes rendelni, így
legfeljebb 16 kernel futhat 16 SM-en.
4.25. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
99 Created by XMLmind XSL-FO Converter.
4.13. A CUDA szál blokkok fogalma és jellemzői [53]
• A programozó szálblokkokat deklarál:
• blokkok kialakítása lehet: 1D, 2D, vagy 3D,
• blokkméret: 1 - 512 szál,
• blokkok mérete szálanként,
Az Nvidia Fermi családhoz tartozó
magok és kártyák
100 Created by XMLmind XSL-FO Converter.
• a blokkok egymástól függetlenül tetszőleges sorrendben képesek futni.
• A blokk minden szála azonos kernel programot futtat (SPMD).
• A szálak a szál blokkon belül azonosítóval rendelkeznek (thread id).
• A szál program ezt az azonosítót használja a munka kiválasztásához és a közös használatú adatok
megcímzéséhez.
• Különböző blokkokba tartozó szálak nem oszthatják meg adataikat.
4.26. ábra -
4.14. Szál blokkok warp-okká történő szegmentálása [59]
• A szálakat warp-nak nevezett 32-es kötegekben ütemezik.
• Ebből kifolyólag minden szál blokkot tovább kell osztani warp-okká.
• Az SM ütemezője legfeljebb 48 warp-ot képes egyidejűleg nyilvántartani.
Megjegyzés
A warp-ot alkotó szálak száma implementációs döntés, nem része a CUDA programozási modellnek.
Pl. a G80-ban vagy a GT200-ban egy warp 32 szálat tartalmaz.
4.27. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
101 Created by XMLmind XSL-FO Converter.
4.15. Warpok ütemezése végrehajtásra az SM-ekre
Az Nvidia nem hozta nyilvánosságra a Fermi mikroarchitektúrájának részleteit, így a warp ütemezés bemutatása
a megadott forrásokban található feltételezéseken alapul [52], [11].
4.16. A Fermi GF100 mikroarchitektúra blokk diagrammja és működésének leírása
• [52] és [11] irodalmak alapján feltételezhetjük, hogy a Fermi front-endje a következőképpen épül fel:
• A front-end dupla feldolgozó futószalaggal rendelkezik, vagy másképen fogalmazva két szorosan csatolt
keskeny maggal, valamint megosztott erőforrásokkal.
• A vékony magok saját erőforrásokkal is rendelkeznek, ezek az alábbiak:
• warp utasítás várakozósor (Warp Instruction Queue),
• a függőségeket nyilvántartó (scoreboarded) warp ütemező és
• 16 FX32, valamint 16 FP32 ALU.
• A közösen használt erőforrások:
• az utasítás gyorsító tár (Instruction Cache),
Az Nvidia Fermi családhoz tartozó
magok és kártyák
102 Created by XMLmind XSL-FO Converter.
• 128 KB (32 K regiszter x32-bit) regiszter fájl,
• a négy SFU és a
• 64 KB L1D közös használatú (osztott) memória.
4.28. ábra -
Megjegyzés
Az Nvidia Fermi családhoz tartozó
magok és kártyák
103 Created by XMLmind XSL-FO Converter.
Az SM front-endje hasonló az AMD Bulldozer (2011) magjának felépítéséhez, ami szintúgy két szorosan csatolt
keskeny magot tartalmaz [60].
4.29. ábra - A Bulldozer mag felépítése [60]
4.17. Feltételezett működési elv - 1
• A két warp ütemező az ábrának megfelelően egy részleges keresztsínes kapcsolóhálózaton keresztük
csatlakozik az öt feldolgozó egység csoporthoz.
• A kettős utasítás várakozási sorban legfeljebb 48 warp utasítás várakozhat kibocsájtásra.
• A minden szükséges operandussal rendelkező warp utasítások kibocsájtásra kerülhetnek.
• A függőség nyilvántartó (scoreboard) tartja nyilván az operandusok meglétét a kibocsájtott utasítások előre
várható futásideje alapján, valamint kibocsájthatónak jelöli azokat, amelyeknél az az operandusok már
rendelkezésre állnak.
• A Fermi kettős warp ütemezői két megfelelő utasítást választanak ki kibocsájtásra minden második órajelnél
a megadott ütemezési politikának megfelelően.
• Mindegyik warp ütemező egy warp utasítást bocsájt ki egy 16 ALU-ból álló csoportnak (amibe beletartoznak
FP32 és FX32 egységek egyaránt), vagy 4 SFU-nak, vagy 16 load/store egységnek (ezek az ábrán nincsenek
jelölve).
4.30. ábra - A Fermi mag [52]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
104 Created by XMLmind XSL-FO Converter.
4.18. Feltételezett működési elv - 2
• A warp utasításokat a megfelelő feldolgozó egységek fogadják a következők szerint:
• Az FX és FP32 aritmetikai utasítások (ide értve az FP FMA utasításokat is) 16 darab 32 bites ALU-hoz
kerülnek, amelyeket egy FX32 ALU (ALU) és egy FP32 ALU (FPU) alkot.
Az FX utasításokat az FX32, az SP FP utasításokat pedig az SP FP egységek hajtják végre.
Az Nvidia Fermi családhoz tartozó
magok és kártyák
105 Created by XMLmind XSL-FO Converter.
• Az FP64 aritmetikai műveleteket (ide értve a az FP64 FMA utasításokat is) mindkét 16-os FP32 csoport
megkapja egyidejűleg, így tehát a DP FMA műveletek egyszeres kibocsájtásúak.
• Az transzcecndentális FP32 utasításokat az ütemező a 4 SPU egységhez továbbítja.
4.31. ábra - A Fermi mag [52]
4.19. Feltételezett működési elv - 3
Az Nvidia Fermi családhoz tartozó
magok és kártyák
106 Created by XMLmind XSL-FO Converter.
• A warp ütemező több shader ciklus alatt képes kibocsájtani a teljes warpot (32 szál) a rendelkezésre álló
feldolgozó egységeknek.
Az adott csoportban lévő feldolgozó egységek száma határozza meg azt, hogy hány shader óraciklusra van
szükség a végrehajtáshoz, pl:
FX vagy FP32 aritmetikai utasítások: 2 óraciklus
FP64 aritmetikai utasítások: 2 óraciklus
(viszont FP64 utasítások esetén nincs lehetőség dupla kibocsájtásra)
FP32 transzcendentális utasítások: 8 óraciklus
Load/store utasítások: 2 óraciklus.
A további utasítások által igényelt óraciklusok számáról a [13] irodalmi hely ad részletesebb felvilágosítást.
4.32. ábra - A Fermi mag [52]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
107 Created by XMLmind XSL-FO Converter.
4.20. Példa: Aritmetikai műveletek kibocsájtási sebessége (művelet/órajel) SM-enként [13]
4.33. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
108 Created by XMLmind XSL-FO Converter.
4.21. A Fermi GF100 SM warp ütemezési politikája - 1
A hivatalos dokumentációban csak az szerepel, hogy a GF100 többlet ciklusokat nem igénylő prioritásos
ütemezésű dupla kibocsájtású (dual issue zero overhead prioritized scheduling) [11]
4.34. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
109 Created by XMLmind XSL-FO Converter.
4.22. A Fermi GF100 SM warp ütemezési politikája - 2
Official documentation reveals only that Fermi GT100 has dual issue zero overhead prioritized scheduling [11]
További források alapján [61] valamint az Nvidia GPGPU-k egyik tervezőjének (D. Kirk) a GT80 warp
ütemezéséről tartott előadásának diái alapján (ECE 498AL Illinois, [59]) a következő feltételezéssel élhetünk a
Fermi-ben alkalmazott warp ütemezésről:
• Az ütemező azokat a warp-okat tekinti ütemezésre késznek, amelyeknek a következő utasítása futásra kész,
vagyis minden operandusa rendelkezésre áll.
• A végrehajtásra történő kijelölés egy nem publikált prioritásos ütemezésen alapul, ami feltételezhetően a warp
típusát (pl. képpont warp, számítási warp), a műveletek típusát és a warp korát veszi figyelembe.
• Azonos prioritású, futásra kész warp-ok valószínűleg körforgásos kiválasztással ütemeződnek.
• Ugyanakkor nem egyértelmű az, hogy a Fermi durva vagy finom szemcsézettségű ütemezést használ-e.
A GT80 warp ütemezőjét tárgyaló korai publikációk [59] arra engednek következtetni, hogy a GT80 durva
szemcsézettségű ütemezőt használ, ám ezzel szemben ugyanazon publikációban a warp ütemezőjét
szemléltető ábra finom szemcsézettségű ütemezésre utal, amint azt az alábbiakban részletezzük.
(Itt megjegyezzük, hogy durva szemcsézettségű ütemezésnek nevezzük azt az ütemezési politikát, melynél a
hullámfrontok mindaddig futhatnak, amíg azokat valamely esemény nem készteti várakozásra.
Ezzel szemben finom szemcsézettségű ütemezésnél az ütemező mindenóraciklusban újra kiválasztja a futtatandó
hullámfrontot.)
Megjegyzés
D. Kirk, az Nvidia GPGPU-inak egyik tervezője egyik előadásában [59] részletesen ismerteti a G80 warp
ütemezőjét. Azonban előadásában két ellentmondó ábra található, az egyik durva, a másik finom
szemcsézettségű ütemezésre utal, az alábbiak szerint:
a) A G80 SM-jének mikroarchitektúrája
Az Nvidia Fermi családhoz tartozó
magok és kártyák
110 Created by XMLmind XSL-FO Converter.
• A G80 kibocsájtási ciklusonként egy warp utasítást hív le
• az L1 utasítás cache-ből
• bármelyik utasítás pufferbe.
• Kibocsájtási ciklusonként egy futásra kész warp utasítást bocsájt ki
• bármelyik utasítás pufferből.
• Függőség nyilvántartással (scoreboarding) kerüli el a hazárdokat.
• Egy utasítás akkor futásra kész, ha már minden operandusza rendelkezésre áll,
• Egy futásra kész utasítás kibocsájtható.
• A Kibocsájtás sorrendiségét körforgás vagy a warp kora határozza meg.
• Az SM ugyanazt az utasítást továbbítja végrehajtásra a warp mind a 32 szálának.
4.35. ábra - Warp ütemezés a G80-ban [59]
b) Scheduling policy of warps in an SM of the G80 indicating coarse grain warp scheduling
• A G80 külön (decoupled) memória / processzor futószalagokat használ.
Az Nvidia Fermi családhoz tartozó
magok és kártyák
111 Created by XMLmind XSL-FO Converter.
• Az éppen futó szál egészen addig bocsájthat ki utasításokat, míg a függőség nyilvántartó rendszer
(scoreboarding) meg nem akadályozza ebben.
• Az ütemező háttér időben gondoskodik arról, hogy a következő kiválasztott warp végrehajtása azonnal
megkezdődjön, ha az előtte futó utasítás várakozni kényszerül.
4.36. ábra - Warp ütemezés a G80-ban [59]
Megjegyzés
A megadott ütemezési séma durva szemcsézettségre utal.
c) Finom szemcsézettségű warp ütemezésre utaló szövegrész ill. ábra ugyaneben a forrásban [59]
• Az SM mikroarchitektúrája többlet ciklusok nélküli warp ütemezést valósít meg az alábbiak szerint:
• Azok a warp-ok, melyeknek a soron következő utasítása már végrehajtható, futásra készek.
• A futásra kész warp-ok közül az ütemező prioritásos ütemezési politika alapján választja ki a következő
végrehajtandó warp-ot.
• A kiválasztott warp minden szála azonos utasítást hajt végre.
• A G80-ban az SM 4 órajel alatt képes egy warp összes szálának kiküldeni ugyanazt az utasítást, tekintve azt a
tényt, hogy csupán 8 feldolgozó egység áll a warp-ot alkotó 32 szál rendelkezésére.
Megjegyzés
Az előző ábrával szemben az itt megadott ütemezési séma finom szemcsézettségre utal.
4.37. ábra - Warp ütemezés a G80-ban [59]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
112 Created by XMLmind XSL-FO Converter.
4.23. A Fermi GF100 maximális teljesítményének becslése - 1
a) Egy SM maximális FP32 teljesítménye
A warp utasítások maximális száma/óraciklus:
• dupla kibocsájtás
• 2 óraciklus/kibocsájtás
2 x ½ = 1 warp utasítás/óraciklus
b) Egy GPGPU kártya maximális FP32 teljesítménye (P FP32) of a GPGPU card
• 1 warp utasítás/óraciklus
• 32 FMA/warp
• 2 művelet/FMA
• fs shader frekvenciával
Az Nvidia Fermi családhoz tartozó
magok és kártyák
113 Created by XMLmind XSL-FO Converter.
• n SM egység
P FP32 = 1 x 32 x 2 x 2 x fs x n
Pl. a GTX580 esetén
• fs = 1 401 GHz
• n = 15
P FP32 = 2 x 32 X 1401 x 15 = 1344.96 GFLOPS
4.38. ábra - A Fermi magja [52]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
114 Created by XMLmind XSL-FO Converter.
4.24. A Fermi GF100 maximális teljesítményének becslése - 2
c) Egy SM maximális FP64 teljesítménye
A warp utasítások maximális száma/óraciklus:
• szimpla kibocsájtás
• 2 óraciklus/kibocsájtás
Az Nvidia Fermi családhoz tartozó
magok és kártyák
115 Created by XMLmind XSL-FO Converter.
1 x 1/2 = 1/2 warp utasítás/óraciklus
d) Egy GPGPU kártya max. FP64 teljesítménye (P FP64) of a GPGPU card
• 1 warp utasítás/2 óraciklus
• 32 FMA/warp
2 művelet/FMA
• fs shader frekvenciával
• n SM egység
PFP64 = ½ x 32 x 2 x fs x n
Pl. a GTX480 esetén
• fs = 1 401 GHz
• n = 15, de az FP64 ALU-k mindössze 1/4-e aktivált
PFP64 = 32 x 1/4 x 1401 x 15 = 168.12 GFLOPS
(A teljes (4x) sebességet csak a Tesla eszközök nyújtják.)
4.39. ábra - A Fermi magja [52]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
116 Created by XMLmind XSL-FO Converter.
5. A Fermi GF104 mikroarchitektúrája
2010 júliusában vezették be, grafikai felhasználásra.
A fő különbség a GF104 és a GF100 között a magok száma (SM egységek), amíg a GF100 16 maggal (SM
egység) rendelkezik, addig a GF104-ben mindösszesen 8 mag található.
4.40. ábra - GF104 és GF100 felépítésének összehasonlítása [62]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
117 Created by XMLmind XSL-FO Converter.
Megjegyzés
Az Nvidia a GF104 alapú GTX 460-as csúcs-kártyájában az eszköz túlzott melegedése miatt a 8 SM közül csak
hetet aktivált.
5.1. SM-enként rendelkezésre álló feldolgozó egységek a GF104 és a GF100 esetében
4.41. ábra -
Megjegyzés
Az Nvidia Fermi családhoz tartozó
magok és kártyák
118 Created by XMLmind XSL-FO Converter.
A GF104-ben a GF100-hoz képest bevezetett változtatások célja a magok (SM-ek) grafikai teljesítményének
növelése volt az FP64 teljesítményük rovására, egyúttal felezték a magok számát is az ár és a fogyasztás
csökkentése érdekében.
5.2. A GF 104/114 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13]
4.42. ábra -
5.3. Warp kibocsájtás a Fermi GF104-ben
A GF104 SM-jei két keskeny maggal (feldolgozó futószalag) rendelkeznek, mindegyik dupla szélességű
szuperskalár kibocsájtással. [63]
Az Nvidia hivatalosan nem dokumentálta azt, hogy az egyes kibocsájtási pontokat (slot) (1a - 2b) hogyan
rendelik hozzá a feldolgozó egységek csoportjaihoz.
4.43. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
119 Created by XMLmind XSL-FO Converter.
5.4. A Fermi GF104 alapú GTX 460-as kártya maximális számítási teljesítmény adatai
A számítási teljesítmény adatok [13], és az előző ábrák alapján:
Maximális FP32 FMA teljesítmény SM-enként:
Shader ciklusonként 2 x 48 FMA művelet minden SM-en
A GTX 460 maximális teljesítménye FMA warp utasítás végrehajtása közben:
Az Nvidia Fermi családhoz tartozó
magok és kártyák
120 Created by XMLmind XSL-FO Converter.
ahol:
• fs: shader frekvencia
• n: SM egységek száma
A GTX 460 esetében
• fs = 1350 MHz
• n = 7
P FP32 = 2 x 48 x 1350 x 7 = 907.2 MFLOPS
A GTX 460 maximális teljesítménye FMA utasítás végrehajtása közben:
PFP64 = 2 x 4 x 1350 x 7 = 75.6 MFLOPS
6. A Fermi GF110 mikroarchitektúrája
6.1. A Fermi GF110 mikroarchitektúrája [64]
• 2010 novemberében vezették be, általános célú felhasználásra.
• A GF110 a GF100 újratervezett változata alacsonyabb fogyasztással és nagyobb sebességgel.
Míg a GF100 alapú csúcs kártyában (GTX 480) túlmelegedés miatt csak 15 SM lehetett aktív, a GF110
kialakítása miatt az Nvidia az arra épülő csúcs kártyában (GTX 580) már mind a 16 SM-et aktiválta,
miközben az órajelet is megemelték.
A GF100 alapú GTX 480 és a GF110 alapú GTX 580 kártyák közötti legfontosabb különbségek
4.44. ábra -
• A megnövelt shader frekvencia és az SM-ek nagyobb száma miatt a GF110 alapú GTX 580-as kártya mintegy
10%-kal magasabb teljesítményt nyújt, mint a GF100-ra épülő GTX 480, valamivel alacsonyabb fogyasztás
mellett.
6.2. A Fermi GF110 felépítése [65]
Az Nvidia Fermi családhoz tartozó
magok és kártyák
121 Created by XMLmind XSL-FO Converter.
4.45. ábra -
6.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66]
4.46. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
122 Created by XMLmind XSL-FO Converter.
6.4. A GF 100/110 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13]
4.47. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
123 Created by XMLmind XSL-FO Converter.
7. A Fermi GF114 mikroarchitektúrája
7.1. A Fermi GF114 magjának felépítése a GTX 560-as kártyában [67]
4.48. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
124 Created by XMLmind XSL-FO Converter.
7.2. A Fermi GF114 mikroarchitektúrája
• Az Nvidia 2011 januárjában vezette be a GTX 560Ti kártyával együtt, ezt követte az év májusában az
alacsonyabb teljesítményt kínáló, grafikai felhasználásra szánt GTX560.
A GF114 a GF104 újratervezett, alacsonyabb fogyasztás mellett gyorsabb változata.
Míg a GF104-alapú GTX 460 kártyában csak 7 aktivált SM volt, a GF114 kialakítása lehetővé tette mind a 8
SM engedélyezését a megnövelt teljesítményű GTX 560Ti kártya esetében, magasabb shader órajel mellett.
A GF104 alapú GTX 460 és a GF114 alapú GTX 560/560Ti közötti legfontosabb különbségek
4.49. ábra -
A magasabb shader frekvencia és az SM-ek megnövelt száma miatt a GF114 alapú GTX 560Ti kártya nagyjából
10%-kal magasabb csúcs teljesítménnyel rendelkezik, mint a GF104 alapú GTX 460 kártya, némileg
megnövekedett energia fogyasztás mellett [68].
Az Nvidia Fermi családhoz tartozó
magok és kártyák
125 Created by XMLmind XSL-FO Converter.
7.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66]
4.50. ábra -
7.4. A GF 104/114 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13]
4.51. ábra -
Az Nvidia Fermi családhoz tartozó
magok és kártyák
126 Created by XMLmind XSL-FO Converter.
127 Created by XMLmind XSL-FO Converter.
5. fejezet - Az Nvidia Kepler családhoz tartozó magok és kártyák
1. Az Nvidia Kepler családjának áttekintése
5.1. ábra - GPGPU magok, kártyák és az azokat támogató szoftverek áttekintése (3)
1.1. A Kepler alcsaládjai
A Kepler sorozat az alábbi jellemzőkkel bíró két alcsaládra osztható:
5.2. ábra -
1.2. A GK104 Kepler mag [76]
5.3. ábra - A GK104 Kepler magjának blokkdiagrammja
Az Nvidia Kepler családhoz tartozó
magok és kártyák
128 Created by XMLmind XSL-FO Converter.
1.3. A GK110 Kepler mag [70]
5.4. ábra - A GK110 Kepler magjának blokkdiagrammja
1.4. Az Nvidia Kepler GK104 és GK110 magjainak főbb tulajdonságai [70]
5.5. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
129 Created by XMLmind XSL-FO Converter.
2. A Kepler PTX 3.x főbb újításai
A PTX 2.0-val az Nvidia több fontos újítást vezetett be egyúttal azt ígérve, hogy ezzel a verzióval a pseudo ISA
relatíve állandósulni fog.
A PTX 3.0 megfelelt ennek az ígéretnek, mivel e verzió egyetlen fontos változtatása az, hogy ez a verzió
támogatja a kapcsolódó Kepler GK104 grafikus magokat (amelyeket hivatalos dokumentációkban sm_30 target
architektúrának neveznek) [71].
Az ezt követő PTX 3.1 ezen felül támogatja még [20]:
• a kapcsolódó Kepler GK110 magokat (amelyeket cégen belül sm_35 target architektúrának neveznek) és a
• dinamikus párhuzamosságot [20], amit a következő részben mutatunk be.
3. A Kepler mikroarchitektúrájának főbb újításai
a) Dinamikus párhuzamosság
b) A Hyper-Q ütemezési modell
c) A Grid Management Unit
d) A GPU Direct
Megjegyzés
Ezek az újdonságok csak a GK110 alapú eszközökön érhetőek el.
3.1. a) Dinamikus párhuzamosság [70]
• A Fermiben minden feladatot a CPU indít el, ezt követően a folyamatok a GPU-n lefutnak, az eredmény
pedig visszakerül a CPU-ra.
A CPU elemzi a köztes eredményeket, és amennyiben szükséges, az adatok visszakerülnek a GPU-ba további
feldolgozásra.
Az Nvidia Kepler családhoz tartozó
magok és kártyák
130 Created by XMLmind XSL-FO Converter.
• A Keplerben alkalmazott dinamikus párhuzamosság jelentősen leegyszerűsíti ezt az eljárást, felgyorsítva
ezzel a feldolgozást.
• A dinamikus párhuzamosság lehetővé teszi a Kepler GPUn futó minden kernel számára azt, hogy új kernelt
indítson, és szükség szerint folyamatokat, eseményeket hozzon létre, illetőleg azt, hogy a CPU segítsége
nélkül is lekezelhesse a függőségeket, ahogyan azt a következő ábra szemlélteti.
3.1.1. A Kepler GPU-kban használt dinamikus párhuzamosság elve
5.6. ábra - A Kepler GPU-kban használt dinamikus párhuzamosság elve
3.1.2. Dinamikus párhuzamosság előnyei [70]
A dinamikus párhuzamosság lehetővé teszi, hogy program fejlesztők optimalizálják párhuzamos futásra
készített programjaikat, ez főképp rekurzív és adatfüggő alkalmazásokban eredményezhet komoly gyorsulást.
Dinamikus párhuzamosság használata esetén a programok nagyobb része fog a GPU-n futni így a CPU több
munkát tud elvégezni, vagy más nézőpontból értékelve ugyanahhoz a feladathoz egy gyengébb CPU is
elegendővé válik.
3.2. b) A Hyper-Q ütemezési mechanizmus
A Fermi architektúra legfeljebb 16 kernel egyidejű futtatására képes, amelyek eltérő utasításfolyamokból
származhatnak, ahogyan az a következő ábra jobb oldalán látható.
5.7. ábra - Soros és párhuzamos kernel futtatási modell a Fermiben és a Fermi előtti
eszközökben [25], [18]
Az Nvidia Kepler családhoz tartozó
magok és kártyák
131 Created by XMLmind XSL-FO Converter.
Megjegyzés
1) A CUDA esetében az utasításfolyam (stream) alatt azt a parancssorozatot értjük (pl. kernel indítások),
amelyeket egymás után, sorosan kell végrehajtani [72].
2) A Fermi párhuzamos kernel futtatási képessége hatalmas előrelépés volt a Fermi előtti eszközökhöz (pl. a
G80, G92, G200) képest, mivel a Fermi előtti eszközök lobális ütemezője (amelyett Gigathread ütemezőnek
hívnak) csak sorosan képes feladatokat kiosztani az SM-ek számára, vagyis egyetlen kernel futhat egy adott
pillanatban (soros kernel végrehajtás). Az alábbi ábra bal oldala ezt illusztrálja.
5.8. ábra - Soros és párhuzamos kernel futtatási modell a Fermiben és a Fermi előtti
eszközökben [25], [18]
A Fermi végrehajtási modelljének a hátulütője az volt, hogy végeredményben az összes utasításfolyam
ugyanabba a feladatokat feldolgozó hardver munkasorba kerül, amint azt a következő ábra szemlélteti.
5.9. ábra - Egyetlen hardver munkasor használata több kernelfolyam esetén [70]
Az Nvidia Kepler családhoz tartozó
magok és kártyák
132 Created by XMLmind XSL-FO Converter.
Ez a végrehajtási modell az egyes utasításfolyamok között hamis függőségeket vezet be, ami azt eredményezi,
hogy a ténylegesen független utasításfolyamatok kerneleinek meg kell várnia, míg az előttük lévő kernelek
futása befejeződik. [70].
5.10. ábra - Fermi párhuzamos végrehajtási modellje [70]
Az Nvidia Kepler családhoz tartozó
magok és kártyák
133 Created by XMLmind XSL-FO Converter.
A fenti ábra szerint egyetlen hardveres munkasoron csak a (C,P) és az (R,X) futhat egyidejűleg, mivel a szálak
közötti függőség soros végrehajtást kényszerít ki a folyamon belül [70].
Ezzel ellentétben a Kepler Hyper-Q ütemező eljárása legfeljebb 32 hardveresen kezelt munkasor létrehozását
teszi lehetővé a CPU és a CUDA Munkaelosztó között (Work Distributior Logic - WLD) (a Fermiben
megvalósított egyetlen munkasorral), amint ez a lenti ábrán látható.
5.11. ábra - A Hyper-Q ütemezési modell működési elve [70]
Az Nvidia Kepler családhoz tartozó
magok és kártyák
134 Created by XMLmind XSL-FO Converter.
Több hardveres munkasorral minden kernel munkafolyam párhuzamosan futhat az összes többi
munkafolyammal, az alábbi ábra szerint.
5.12. ábra - A Hyper-Q működési modell elve [70]
Az Nvidia Kepler családhoz tartozó
magok és kártyák
135 Created by XMLmind XSL-FO Converter.
A Hyper-Q használata komoly előnyt jelent az MPI alapú párhuzamos számítások esetében, mivel egyidejűleg
32 hardveresen kezelt folyam (MPI feladat) futhat, nem pedig egyetlen MPI feladat, mint a Fermi ütemezője
esetén. Az alábbi ábra ezt szemlélteti.
5.13. ábra - A Kepler Hyper-Q ütemező mechanizmusa, mely egyidejűle több MPI
feladat kiküldédére képes, szemben a Fermi egyetlen MPI feladat kibocsájtási
képességével [73]
MPI: Message Passing Interface, párhuzamos programozás esetén használt szabványos program interfész.
3.2.1. A Hyper-Q ütemező mechanizmus lehetséges gyorsító hatása
Az Nvidia Kepler családhoz tartozó
magok és kártyák
136 Created by XMLmind XSL-FO Converter.
A GPU teljesítményt visszafogó feladatok közötti hamis függőséget elszenvedő alkalmazások a Hyper-Q
használatával 32-szeres sebességgel képesek futni a jelenlegi kód megváltoztatása nélkül [70].
3.3. c) Grid Management Unit
A korábbiakban említettek szerint a Kepler GPU architektúrája két újdonságot hozott, amivel a kernelek
ütemezésének hatékonysága megnövekedhet:
• Egy Kepler GPU-ban bármelyik futó kernel indíthat új kernelt, és létrehozhatja a szükséges utasításfolyamot
(ezt nevezik dinamikus párhuzamosságnak) és
• emellett több hardveres munkasor érhető el (Hyper-Q ütemezési eljárás).
Ezek a fejlesztések a Fermi architektúra ütemezőjének teljes újratervezését tették szükségessé.
Az új kialakítás fontos eleme a Grid kezelő egység (Grid Management Unit), ami a fenti folyamatok kezeléséért
felel.
A következő oldal mutatja be ennek az új, összetett ütemező alrendszernek a blokkdiagrammját.
A részletes működés ismertetése helyett inkább a vonatkozó szakirodalmi hivatkozásokat adjuk meg [70].
5.14. ábra - A Fermi és a Kepler architektúriák ütemező alrendszereinek
összehasonlítása [70]
3.4. d) A GPU Direct
Külső fejlesztők eszközmeghajtói (pl. hálózati kártyák meghajtói) számára teszi lehetővé a közvetlen
hozzáférést a GPU memóriájához, megkönnyítve ezáltal a GPU-k közötti közvetlen adatátvitelt a lenti ábra
szerint.
Az Nvidia Kepler családhoz tartozó
magok és kártyák
137 Created by XMLmind XSL-FO Converter.
5.15. ábra - GPU Direct a Keplerben [70]
Ez a tulajdonság nagyon hasznos GPGPU alapú DPA-kból (adatpárhuzamos gyorsítókból) épített
szuperszámítógépek esetében, amilyen pl. a Titan szuperszámítógép.
Az Oak Ridge National Laboratory-ban (USA) épített Titan szuperszámítógép (Cray XK7) 16 888 csomópontot
tartalmaz, mindegyikben 16 magos AMD Opteron 6274 (Bulldozer alapú Interlagos) szerver processzor
található, valamint egy Tesla K20X adat gyorsító.
A Titan szuperszámítógép 17.59 PetaFLOPS-os teljesítmény rekordot ért el a LINPACK mérőcsomaggal, ezzel
ez a gép lett a világ leggyorsabb szuperszámítógépe 2012 novemberében. [74], [75].
5.16. ábra - Titan (Cray XK7) szuperszámítógép [75]
3.5. A Kepler mikroarchitektúrájának főbb továbbfejlesztései
Az Nvidia Kepler családhoz tartozó
magok és kártyák
138 Created by XMLmind XSL-FO Converter.
a) A feldolgozó egységek működési frekvenciáját (shader frequency) a mag működési frekvenciájára
csökkentették.
b) A hardveres függőség ellenőrzést egyszerűsítették azáltal, hogy a fordító a programban az ütemező számára
értelmezhető kulcsszavakat (ún. compiler hinteket) helyezhet el.
c) SMX-enként négyszeres kibocsájtású warp ütemezőt vezettek be.
d) A szálanként elérhető regiszterek számát megnégyszerezték.
e) Bevezettek egy általános célra használható 48 KB-os, csak olvasható adat gyorsítótárat.
f) A Fermihez képest megduplázták az L2 cache méretét és sávszélességét.
3.5.1. a) A feldolgozó egységek működési frekvenciájának (shader frequency) lecsökkentése a mag frekvenciájára - 1
Általánosságban elmondható, hogy a teljesítmény duplázására két alapvető elv létezik:
• megduplázhatjuk a feldolgozó egységek órajelét az eredeti kétszeresére vagy
• megduplázhatjuk az elérhető feldolgozó egységek számát, és azokat az eredeti órajellel működtetjük.
Az első lehetőséghez a korábbiakkal nagyjából azonos lapkaterület szükséges, azonban a teljesítmény felvétel
megnő. A második esetben a feldolgozáshoz kétszer akkora lapkaterületre van szükség, azonban a fogyasztás
alacsonyabb lesz, mint az első esetben.
Megjegyzés
• Magasabb órajel frekvenciához (fc) magasabb működési feszültség szükséges (V).
• A processzorok dinamikus disszipációja a következőképpen számolható: D = konstans x fc x V2. vagyis a
magasabb frekveciához magasabb fogyasztás tartozik.
• Másrészről a nagyobb lapkaméret magasabb előállítási költséggel jár, tehát a tényleges kompromisszum az
alacsonyabb fogyasztás és a magasabb előállítási költség között van.
3.5.2. a) A feldolgozó egységek működési frekvenciájának (shader frequency) lecsökkentése a mag frekvenciájára - 2
A G80-as Fermi család tervezői a feldolgozó egységek órajel frekvenciájának (vagyis a shader frekvenciának)
duplázása mellett döntöttek a teljesítmény növelése érdekében, amint az az ábrán látszik.
5.17. ábra - Mag és shader frekvenciák összehasonlítása az Nvidia fontosabb GPU
családjaiban
A választott megoldás előnye a kisebb lapkaméret, ami csökkenti a gyártási költségeket, a hátránya azonban a
másik megoldáshoz képest a megnövekedett fogyasztás.
Az Nvidia Kepler családhoz tartozó
magok és kártyák
139 Created by XMLmind XSL-FO Converter.
3.5.3. a) A feldolgozó egységek működési frekvenciájának (shader frequency) lecsökkentése a mag frekvenciájára - 3
Ezzel ellentétben a Keplerrel kezdődően az Nvidia a fogyasztás csökkentésére helyezte a hangsúlyt, és a nyers
számítási teljesítmény helyett a lehető legjobb fogyasztás/teljesítmény arány elérésére törekedett.
Ennek megfelelően tervezéskor áttértek a másik alapvető lehetőségre, vagyis a feldolgozó egységek számát
növelték meg jelentősen, a shader frekvenciát pedig lecsökkentették a működési frekvenciával megegyező
értékre, a lenti táblázatok szerint.
5.18. ábra - Rendelkezésre álló feldolgozási erőforrások a Kepler SMX és a Fermi SM
esetén
3.5.4. a) A feldolgozó egységek működési frekvenciájának (shader frequency) lecsökkentése a mag frekvenciájára - 4
5.19. ábra - Magok és shaderek órajel frekvenciái az Nvidia főbb GPU családjaiban
3.5.5. A Fermi és Kepler feldolgozó egységei lapkaméretének és energia fogyasztásának összehasonlítása [76]
5.20. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
140 Created by XMLmind XSL-FO Converter.
Megjegyzés
Az AMD a GPU-iban a feldolgozó egységek órajelét az alap órajelen tartotta, amint azt a következő táblázat
szemlélteti.
5.21. ábra - Nvidia és AMD GPU kártyák főbb jellemzőinek összevetése [77]
3.5.5.1. A Kepler energia hatékonysága a Fermihez képest
Nvidia a Kepler tervezésekor a wattonkénti teljesítményre optimalizált, így a Fermihez képest jelentősen
nagyobb energia hatékonyságot értek el, ahogyan az az alábbi ábrán látható [76].
Az Nvidia Kepler családhoz tartozó
magok és kártyák
141 Created by XMLmind XSL-FO Converter.
5.22. ábra - Fermi és Kepler kártyák teljesítményhatékonyságának összevetése [76]
3.5.6. b) A hardveres függőség ellenőrzés egyszerűsítése a fordító által az ütemezőnek szolgáltatott kulcsszavak (compiler hints) segítségével
A Fermi mikroarchitektúrájának része egy összetett hardveres ütemező, ami a warp ütemezéshez végez
függőség ellenőrzést az alábbi ábra szerint.
5.23. ábra - A Fermi hardveres függőség ellenőrzője [76]
A Kepler termékvonalban az Nvidia nagyban leegyszerűsítette a hardveres függőség vizsgálatot azáltal, hogy a
fordító kulcsszavakat helyezhet el a programban, melyek az ütemezőnek megadják pl. azt, hogy az utasítások
mikor lesznek futásra készek.
Ez az információ a feldolgozó futószalagok rögzített késleltetései alapján számítható ki, és lényegesen
leegyszerűsítheti az ütemező felépítését (amint az az ábrán látható).
5.24. ábra - A Kepler hardveres függőség ellenőrzésének blokkdiagrammja [76]
3.5.7. c) SMX-enként négyszeres warp ütemező bevezetése
Ahogy azt már korábban említettük, Nvidia a Kepler architektúrában töbszörözte a rendelkezésre álló számítási
erőforrásokat az előző Fermi architektúrához képest, az alábbiak szerint.
Az Nvidia Kepler családhoz tartozó
magok és kártyák
142 Created by XMLmind XSL-FO Converter.
3.5.8. Rendelkezésre álló számítási erőforrások a Kepler SMX és a Fermi SM esetében
5.25. ábra -
A jelentősen megnövekedett számú erőforrás kihasználásához (ld. táblázat) az Nvidia négyszeres kibocsátású
warp ütemezőt vezetett be minden SMX egységhez.
5.26. ábra -
Az SMX négy warp ütemezőjének mindegyike minden óraciklusban kiválaszt kiküldésre egy olyan warp-ot,
melyben két egymástól független utasítás van (ld. lent) [70].
5.27. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
143 Created by XMLmind XSL-FO Converter.
3.5.9. d) A szálanként elérhető regiszterek számának megnégyszerezése
A GKxxx Kepler magjainak szálai 255 regiszterhez férhetnek hozzá, ez négyszer annyi, mint amennyivel a
Fermi magok szálai rendelkeznek (ld. a lenti táblázatot).
5.28. ábra - Számítási verziók főbb eszköz jellemzői [32]
3.5.10. A Kepler magokban bevezetett szálanként elérhető regiszterszám négyszerezésének hatása
A regisztereket erőteljesebben használó programkódokra jótékony hatással lehet a regiszterek megnövelt száma
[70].
3.5.11. e) Egy általános célra használható 48 KB-os, csak olvasható adat gyorsítótár bevezetése
Az Nvidia Kepler családhoz tartozó
magok és kártyák
144 Created by XMLmind XSL-FO Converter.
A GPGPU-k Fermi generációjában már bevezettek egy 48 KB-os csak olvasható gyorsító tárat. Tapasztalt
programozók gyakran használták ezt a gyorsító tárat annak ellenére, hogy ez csak a textúra egységből elérhető.
A Keplerben ez a csak olvasható gyorsító tár már elérhetővé vált általános felhasználásra is (ld. lent)
5.29. ábra - A Kepler cache architektúrája [70]
3.5.12. f) Az L2 cache méret és sávszélesség megduplázása a Fermihez képest
A GK110-ben az Nvidia megduplázta az L2 cache méretét, így a Fermi magokban (GF100/GF110) elérhető
korábbi 768 KB-os L2 gyorsító tárhoz képest itt már 1.5 MB használható [70]. [70].
Megjegyzés
A GK104 továbbra is 512 KB L2 cache-t tartalmaz, ami ugyanannyi, amennyi a korábbi Fermi GF104/GF114
magokban található.
4. Az Nvidia GK104 Kepler magja, és a hozzá tartozó kártyák
4.1. A Kepler alcsaládjai
A Keplerhez két alcsalád tartozik, ezek a következő jellemzőkkel bírnak:
Az Nvidia Kepler családhoz tartozó
magok és kártyák
145 Created by XMLmind XSL-FO Converter.
5.30. ábra -
4.2. GK104 Kepler mag [76]
5.31. ábra - A GK104 Kepler magjának blokkdiagrammja
4.3. Az Nvidia GK104 mag lapkájának képe [78]
5.32. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
146 Created by XMLmind XSL-FO Converter.
4.4. A Kepler GK104 mag SMX-ének blokkdiagrammja [76]
5.33. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
147 Created by XMLmind XSL-FO Converter.
Mind a GeForce GTX 680, mind pedig a K10 8 SMX egységgel rendelkezik.
5.34. ábra - Az Nvidia Kepler-alapú GTX 680 GPGPU kártya [33]
4.5. A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32 és FP64 teljesítménye
4.5.1. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32 teljesítménye - 1
A GeForce GTX 680 grafikus kártya minden SMX egysége 192 FX/FP32 ALU-val rendelkezik (ld. a következő
ábrát).
4.5.2. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32 teljesítménye - 2 [70]
5.35. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
148 Created by XMLmind XSL-FO Converter.
A K20-ban az Nvidia lekapcsolt két, a K20X-ben pedig egy SMX egységet.
4.5.3. a) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP32 teljesítménye - 3
Az ALU-k az FMA utasításokat az fSH shader frekvencián futószalag elven hajtják végre. Ebből következően
egy SMX egység maximális FP32 teljesítménye
PFP32: 2 x nFP32 x fSH
ahol
nFP32: Az SMX-ben található FP32 ALU-k száma
fSH: Shader frekvencia.
A tényleges értékek alapján
FP32= 192 és
fSH= 1006 MHz
Az SMX maximális FP32 teljesítménye
PFP32:= 2 x 192 x 1006 = 386.3 GFLOPS
A GeForce GTX 680 8 SMX egységgel rendelkezik, így egy ilyen kártya maximális FP32 teljesítménye
PFP32:= 2 x 192 x 1006 x 8 = 3090 GFLOPS
4.5.4. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64 teljesítménye - 1
Minden SMX egység a GeForce GTX 680-ban 8 FP64-es ALU-val rendelkezik (ld. ábra).
Az Nvidia Kepler családhoz tartozó
magok és kártyák
149 Created by XMLmind XSL-FO Converter.
4.5.5. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64 teljesítménye - 2 [70]
5.36. ábra -
A K20-ban az Nvidia lekapcsolt két, a K20X-ben pedig egy SMX egységet.
4.5.6. b) A GK104 alapú GeForce GTX 680 grafikus kártya maximális FP64 teljesítménye - 3
A GTX 680 grafikus kártya minden SMX egysége 192 FX/FP32 és 8 FP64 ALU-val rendelkezik, így az FP64
teljesítmény 8/192 = 1/24-ed része ugyanezen kártya FP32-es teljesítményének.
Ebből kiszámítható, hogy a GTX 680 kártya FP64 teljesítménye
PFP64:= 3090 GFLOPS/24 = 128.75 GFLOPS
5. Az Nvidia GK110 Kepler magja, és a hozzá tartozó kártyák
5.1. A Kepler alcsaládjai
A Keplernek két alcsaládja van, a következő jellemzőkkel:
5.37. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
150 Created by XMLmind XSL-FO Converter.
5.2. A GK110 mag
Erre a magra épül a a GTX Titan grafikus kártya és a K20, K20X gyorsító kártya.
Bár a GK110 mag 15 SMX egységgel bír, ahogyan azt korábban már említettük
a GK110 alapú K20-as Tesla esetében az Nvidia két SMX egységet lekapcsolt, így a K20-ban csupán 13 SMX
található, illetőleg 13x192 = 2496 FX/FP32 EU [69],
a GK110 alapú K20X-es Tesla és a GTX Titan esetében az Nvidia egy SMX egységet lekapcsolt, így
mindkettőben csupán 14 SMX található, illetőleg 14x192 = 2688 FX/FP32 EU
5.3. A GK110 Kepler mag [70]
5.38. ábra - A GK110 Kepler magjának blokkdiagrammja
5.3.1. Az Nvidia Kepler GK110 magjának fotója [70]
Az Nvidia Kepler családhoz tartozó
magok és kártyák
151 Created by XMLmind XSL-FO Converter.
5.39. ábra -
5.3.2. Az Nvidia Kepler GK110 magjának felépítése [79]
5.40. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
152 Created by XMLmind XSL-FO Converter.
5.3.3. Az Nvidia GK110 és GK104 magjainak összehasonlítása [79]
5.41. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
153 Created by XMLmind XSL-FO Converter.
5.3.4. A Kepler GK110 SMX-ének blokkdiagrammja [70]
5.42. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
154 Created by XMLmind XSL-FO Converter.
A K20-ban az Nvidia lekapcsolt két, a K20X-ben pedig egy SMX egységet.
5.3.5. a) A GK110 alapú GeForce GTX Titan grafikus kártya maximális FP32 teljesítménye
Az ALU-k az FMA utasításokat az fSH shader frekvencián futószalag elven hajtják végre. Ebből következően
egy SMX egység maximális FP32 teljesítménye:
PFP32: 2 x nFP32 x fSH
ahol
nFP32: Az SMX 32 bites ALU-inak száma
fSH: Shader frekvencia
A tényleges értékek alapján
nFP32= 192 és
fSH= 836 MHz
Így egy SMX maximális FP32 teljesítménye
PFP32:= 2 x 192 x 836 = 321 GFLOPS
A GeForce GTX Titan 14 SMX egységgel rendelkezik, így ezen kártyák maximális FP32 teljesítménye
PFP32:= 2 x 192 x 836 x 14 = 4494 GFLOPS
5.3.6. b) A GK110 alapú GeForce GTX Titan grafikus kártya maximális FP64 teljesítménye
A GTX Titan grafikus kártyában minden SMX egységhez 192 FX/FP32 és 64 FP64 ALU tartozik.
Így tehát az FP64 teljesítménye: 64/192 = 1/3 az FP32 teljesítményéhez képest.
Az Nvidia Kepler családhoz tartozó
magok és kártyák
155 Created by XMLmind XSL-FO Converter.
Ebből adódóan a GTX Titan FP64 teljesítménye:
PFP64:= 4494 GFLOPS/3 = 1498 GFLOPS
Itt jegyezzük meg, hogy a fenti számítással ellentétben a GTX Titan kártyák technológiai dokumentációiban
publikált hivatalos FP64 teljesítménye (PFP64) 1300 GFLOPS.
Az eltérés egyik lehetséges magyarázata az, hogy a GK110 alapú KX20 számítási egység magfrekvenciája
csupán 732 MHz, ebből adódik az 1300 GFLOPS FP64 teljesítmény, viszont a KX20 kártya ára feltételezhetően
sokkal magasabb, mint a GTX Titan kártya ára (≈ 1000 $), ezért Nvidia mesterségesen lecsökkentette a GTX
Titan kártya PFP64 teljesítményét.
6. Az Nvidia mikroarchitektúráinak fejlődése
6.1. a) Az Nvidia Fermi előtti GPGPU-inak FP32 warp kibocsájtási hatékonysága
5.43. ábra -
6.2. b) Az Nvidia Fermi és Kepler GPGPU-inak FP32 warp kibocsájtási hatékonysága
5.44. ábra -
Az Nvidia Kepler családhoz tartozó
magok és kártyák
156 Created by XMLmind XSL-FO Converter.
6.3. c) Az Nvidia Fermi előtti GPGPU-inak FP64 teljesítmény növekedése
A teljesítményt a meglévő FP64 feldolgozó egységek száma és jellemzői határozzák meg.
5.45. ábra -
6.4. d) Az Nvidia Tesla GPGPU-inak FP64 teljesítmény növekedése
A teljesítményt az elérhető DP FP feldolgozó egységek száma korlátozza.
Az Nvidia Kepler családhoz tartozó
magok és kártyák
157 Created by XMLmind XSL-FO Converter.
5.46. ábra -
158 Created by XMLmind XSL-FO Converter.
6. fejezet - Az AMD heterogén rendszerarchitektúrája
1. A HSA elve
Az AMD a Fusion Developer Summit rendezvényén 2011 júniusában mutatta be az FSA (Fusion Systems
Architecture) architektúra működési elvét. Az FSA elnevezést az AMD 2012 januárjában HSA-ra
(Heterogeneous Systems Architecture) módosította, a következő ábra szerint [82], [83].
1.1. A HSA elv első nyivános bemutatása (6/2011) [84], [85]
6.1. ábra -
Megjegyzés
1) 2012 januárjában az AMD a Fusion terméknevet (melyet 2008-ban vezettek be) Heterogeneous Systems
Architecture terméknévre cserélte.
Az AMD terminológiájában a Fusion név jelölte az azonos lapkán CPU-t és GPU-t tartalmazó processzorokat,
mint például az APU vonalba (Accelerated Processing Units) tartozó AMD Llano-alapú A4-A8 processzorok
(2011).
2) AMD-nek a Fusion márkanevet egy bírósági per miatt kellett lecserélnie [86], amelyet az Arctic nevű svájci
alkatrész gyártó cég indított az AMD ellen, mivel e cég bejegyzett védjegye volt a „Fusion”, amit 2006 óta
használtak tápegységeik megnevezésére.
A konfliktus megoldása érdekében az AMD licence használati díjat ajánlott fel, valamint 2012 januárjában
kivezette a Fusion elnevezést.
1.2. A HSA (Heterogeneous Systems Architecture) céljai
Az AMD heterogén
rendszerarchitektúrája
159 Created by XMLmind XSL-FO Converter.
6.2. ábra - Az AMD összefoglaló ábrája a processzorok teljesítményének fejlődédéről a
mikroarchitektúra egymást követő fejlődési szakaszaiban (6/2011) [84]
1.2.1. AMD’s view of the evolution path to heterogeneous computing (6/2011) [84]
6.3. ábra - AMD’s view of the evolution to heterogeneous computing [84]
2. A HSA célkitűzései [85], [87]
• A HSA egy heterogén többmagos processzorokhoz kifejlesztett nyílt architektúra, amellyel a hagyományos
programozási modellek esetén elérhető teljesítménynél magasabb érhető el.
• Egységes számítási keretrendszert biztosít a CPU-k és a GPU-k számára, azonos elvek használatával.
• OpenCL-re optimalizált platform.
• Hardverre és szoftverre vonatkozó részeket is tartalmaz.
A HSA főbb komponensei
Az AMD heterogén
rendszerarchitektúrája
160 Created by XMLmind XSL-FO Converter.
a) A CPU és a GPU számára közös címteret biztosító memória model, mely feleslegessé teszi a külön címterek
esetén a címterek között szükségessé váló adatmásolásokat.
b) Felhasználói szintű parancs várakozósor, a kommunikációs többlet terhelés minimalizálása érdekében.
c) A HAS IL virtuális ISA (HAS IL vagyis HSA Intermediate Language).
d) Az alkalmazásfeldolgozás modellje.
A HSA specifikációit a 2012 júniusában alapított HSA alapítvány gondozza.
2.1. a) A CPU és a GPU számára közös címteret biztosító memória model [87]
• A HSA legfontosabb architektúrális jellemzője a közös címterű (egységes) memória modell, mely mind a
CPU és mind a GPU számára közösen használható virtuális címteret definiál.
A HSA által elérhető összes memória terület erre a virtuális címtérre van leképezve.
• A CPU-k és a GPU által közösen használt memória koherens.
Ez egyszerűsíti az alkalmazásfejlesztést, mivel nincs szükség explicit gyorsítótár koherencia kezelésre.
• Az egységes címtér legfontosabb előnye, hogy nincs szükség explicit adatmozgatásra.
2.2. b) Felhasználói szintű parancs várakozósor [87]
A HSA alkalmazásonkénti parancs kiküldési várakozósort használ, amin keresztül a GPU-nak parancsok
küldhetők ki. Ebbe a parancs várakozósorba közvetlenül is beírhatók utasítások az operációs rendszer kernel
szolgáltatásainak igénybevétele nélkül (ezért nevezzük felhasználói szintű parancs várakoztató soroknak).
Így a GPU számára szóló parancsok kiküldésekor nem kell várakozni az OS kernel szolgáltatásaira, ezáltal
jelentősen lecsökken a GPU parancsok kiküldési ideje.
2.3. c) A HAS IL virtuális ISA (HSA köztes réteg - HSA Intermediate Layer) [87]. [88]
• A HSA IL egy a heterogén rendszerek számára kifejlesztett virtuális ISA.
Ez esetben a feldolgozás két fázisú. Az első fázisban a fordító egy köztes kódot generál (HAS IL), majd a
második fáziban a JIT fordító (Finalizer) ezt a köztes kódot alakítja a GPU vagy a CPU ISA-nak megfelelő
natív kóddá. Ez meggyorsítja a natív GPU architektúrára írt programok fejlesztését.
• A HSA IL kizárólag a számításokra fókuszál, nem tartalmaz grafikus utasításokat [88].
• A HSA IL várhatóan nem fog módosulni egymást követő GPU implementációk során.
2.4. d) Az alkalmazásfeldolgozás modellje [88]
6.4. ábra -
Az AMD heterogén
rendszerarchitektúrája
161 Created by XMLmind XSL-FO Converter.
2.5. Az alkalmazásfeldolgozás elve a HSA-ban [87]
Áttekintés
• A HSA szoftver platfom többféle magas szintű párhuzamos nyelvet támogat, mint például az OpenCL,
C++AMP, C++, C#, OpenMP, Python stb.
• A HSA alkalmazásfeldolgozás két fázisból áll:
• egy fordítási és
• egy futtatási fázisból.
A fordítási fázis
Két komponenst tartalmaz
• a fordító front-endje és
• a fordító back-endje.
A fordító front-endje a magas szintű nyelvet konvertálja a széles körben használt köztes reprezentációs nyelvre,
az LLVM IR-re.
A fordító back-endje alakítja át az LLVM IR-t HSAIL-lé.
LLVM: Low Level Virtual Machine Intermediate Representation, vagyis alacsony szintű virtuális gép köztes
réteg
6.5. ábra - A fordítási fázis
Az AMD heterogén
rendszerarchitektúrája
162 Created by XMLmind XSL-FO Converter.
2.6. A futtatási fázis [87]
• A HSA futtató (HSA Runtime) az aktuális környezet részeként működik.
Pl. a HSA futtatót hívja meg az OpenCL Language Runtime.
• A HSA Runtime küldi a feladatot a HSA CPU és GPU eszközök számára.
Kiküldéskor a Finalizer futásidőben átfordítja a HSAIL kódot olyan nyelvre, melyet a GPU ISA értelmezni
képes.
A HSA Runtime küldhet feladatot a HSA CPU-ra is, ilyenkor az operációs rendszer szolgáltatásai hívódnak
meg.
6.6. ábra - A futtatási fázis
Az AMD heterogén
rendszerarchitektúrája
163 Created by XMLmind XSL-FO Converter.
Megjegyzés az LLVM IL-hez [89]
Egy klasszikus három fázisú moduláris fordító felépítése az alábbi ábrán látható.
6.7. ábra - Klasszikus három fázisú moduláris fordító felépítése [89]
Az AMD heterogén
rendszerarchitektúrája
164 Created by XMLmind XSL-FO Converter.
Példa: A GCC fordító (jelenlegi nevén “GNU Compiler Collection”)
Több nyelvi front-end-et és architektúrára szabott back-end-et tartalmaz, valamint széleskörű közösségi
támogatással rendelkezik.
Az LLVM fordító szintén három fázisú kialakítású, a jól specifikált köztes reprezentációs formátumot pedig
LLVM IR-nek nevezik.
6.8. ábra -
Az LLVM IR egy alacsony szintű RISC szerű virtuális utasítás készlet, amelybe olyan egyszerű utasítások
tartoznak, mint az összeadás, kivonás, összehasonlítás és elágazás.
Az LLVM másik fontos jellemzője az, hogy a GCC-re jellemző monolitikus parancssoros fordító helyett ezt
könyvtár gyűjteménynek tervezték.
Adaptálhatósága és teljesítménye miatt az utóbbi néhány évben az LLVM egy akadémiai projektből (a
fejlesztést az Urbana-Champaign-i University of Illinois kezdte) kinőtte magát és C, C++ valamint Objective C
fordítók univerzális back-end-jévé vált.
2.7. Heterogeneous Sytem Architecture Foundation (HSAF - Heterogén Rendszer architektúra alapítvány)
Az AMD 2012 júniusában hozta létre HSAF-et, ami egy nonprofit szervezet az Egyesült Államokban.
A HSAF céljai
A szervezet célja nyílt szabványok és eszközök definiálása és kidolgozása hardverek és szoftverek számára,
amelyekkel a nagy teljesítményű párhuzamos számítási eszközök (mint például a GPGPU-k) a lehető legkisebb
energia felhasználásával hatékonyan használhatóak.
Alapító tagok
AMD, ARM, Imagination Technologies, MediaTek, Qualcomm, Samsung, és a Texas Instruments.
2.8. Az AMD útiterve a HSA implementációjára [90]
6.9. ábra -
Az AMD heterogén
rendszerarchitektúrája
165 Created by XMLmind XSL-FO Converter.
2.9. Az AMD útiterve a HSA implementációjára - részletezés [85]
6.10. ábra -
166 Created by XMLmind XSL-FO Converter.
7. fejezet - Az AMD Southern Islands családhoz tartozó magok és kártyák
1. Az AMD Southern Islands családjának áttekintése
1.1. Az AMD útiterve a HSA implementációjára (Financial Analyst Day 2012 február) [90]
7.1. ábra -
Megjegyzés
Az AMD útiterve alapján már a 2012-es Southern Islands család GPU-inak hozzá kellett volna férnie a CPU
memóriájához.
Ugyanez a tervezési cél szerepel, az „AMD Graphics Cores Next (GCN) Architecture” című dokumentumában
is [91].
Mindezek ellenére a Southern Islands család (vagyis a GCN) elsőként debütáló kártyája, az AMD HD 7970
specifikációjában, semmiféle említés nincs erről.
Ezzel kapcsolatban különböző internetes forrásokból [pl. 93] arról lehet értesülni, hogy AMD a virtuális
memória támogatást először csak a 2013-ban bejelentett Sea Islands családban fogja megvalósítani.
1.2. Az AMD új GPU mikroarchitektúrája: a Graphics Core Next (GCN) Következő Grafikus Mag)
A GCN mikroarchitektúrát az AMD a Fusion Developer Summit rendezvényén jelentette be 2011 júniusában.
AMD eddig a GCN mikroarchitektúrát a
Az AMD Southern Islands családhoz
tartozó magok és kártyák
167 Created by XMLmind XSL-FO Converter.
• Southern Islands családban (Tahiti magok/7950/7970 GPGPU kártyák) és a
• Sea Islands családban (Venus magok/8950/8970 GPGPU kártyák)
implementálta (ld. a következő ábrát).
1.3. A GCN mikroarchitektúra bejelentése és megvalósítása
7.2. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése
(3)
1.4. Az AMD útiterve, mely a GCN mikroarchitektúra megjelenését jelzi a Southern Islands grafikai családban (2012 február) [94]
7.3. ábra -
2. A Southern Islands mikroarchitektúra főbb újításai
• Az AMD az eddigi VLIW4 alapú GPU kialakítás helyett e családdal kezdődően SIMD alapú GPU-kat
vezetett be.
• Az AMD egyúttal bevezette a ZeroCore Power technológiát is.
2.1. VLIW4 alapú GPU-k helyett SIMD alapú GPU bevezetése
Az AMD Southern Islands családhoz
tartozó magok és kártyák
168 Created by XMLmind XSL-FO Converter.
7.4. ábra - Az ATI és az AMD GPU-k mikroarchitektúra fejlődésének főbb állomásai
[95]
2.1.1. Az ATI (melyet AMD 2006-ban felvásárolt) és az AMD GPU-k mikroarchitektúra fejlődésének főbb állomásai [95]
Amint azt a fenti ábra szemlélteti, az AMD GPU-it hagyományosan VLIW alapú ALU-kra alapozta, eleinte
VLIW5-ös, majd VLIW4-es ALU-kat használva.
2.1.2. VLIW alapú ALU-k használata GPU-kban
Az Nvidia-val ellentétben AMD a GPU-it VLIW5 ALU-kra alapozta. Ezekben 5 feldolgozó egység (EU) és egy
elágazás kezelő (Branch Unit) van, szemben az Nvidia által használt SIMD alapú ALU-kkal.
7.5. ábra - Egy VLIW5 ALU blokkdiagrammja [17]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
169 Created by XMLmind XSL-FO Converter.
2.1.3. VLIW-alapú ALU-k
• A fenti ábrán láthatóan AMD a VLIW5-ös ALU-t 6-szoros kibocsájtású VLIW utasításokkal vezérli, melyek
mindegyik EU számára meghatározzák az elvégzendő műveletet.
• A VLIW utasításban egyidejűleg kibocsájtott múveleteknek viszont függőségektől mentesnek kell lennie.
• A fordító feladata olyan VLIW utasítás folyam generálása, amelyben minél több függőségektől mentes
művelet van (statikus függőség feloldás).
2.1.4. Hullámfront sorozat átkódolása VLIW4 utasításokká [96]
Tegyük fel, hogy a fordítónak az alábbi hullámfront sorozatot kell átkódolnia VLIW4 utasításokká.
Mindegyik hullámfrontban 64 munkaelem van, a hullámfrontok között fennálló függőségeket az ábra jelzi.
7.6. ábra -
VLIW4 utasítások használatakor a fordító 4 különböző hullámfrontból helyez végrehajtandó müveleteket a
VLIW4 utasítás 4 kibocsájtási helyére (slot).
A 4 kibocsájtási helyen specifikált műveletet egy 16-széles SIMD egyik feldolgozó egysége fogja végrehajtani.
7.7. ábra - VLIW4 ALU blokkdiagrammja (a Northern Islands család (HD6900-as
kártyájában)) [17]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
170 Created by XMLmind XSL-FO Converter.
7.8. ábra - 16-széles SIMD egység egyszerűsített blokkdiagrammja ([95])
2.1.5. Hullámfrontok ütemezése VLIW4 kódolást feltételezve [96]
7.9. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
171 Created by XMLmind XSL-FO Converter.
Létező függőségek meggátolják a fordítót abban, hogy minden ciklusban mind a négy helyet betöltse (ld. ábra).
A hullámfront sorozat VLIW4 utasításokká történt átkódolásának eredményét az ábra szemlélteti.
Vegyük észre, hogy a hullámfront 64 munka-elemének ütemezése a 16-széles futószalagot tartalmazó SIMD
egységen 4 óraciklust vesz igénybe.
Összességében a teljes hullámfront sorozat ütemezése 6x4 ciklust igényel.
2.1.6. Grafikus feldolgozás és VLIW alapú ALU-k
Ahogyan azt már említettük, a korai GPU-k a grafikai feldolgozásra helyezték a hangsúlyt.
A grafikai feldolgozás lényegében fix algoritmusok végrehajtását jelenti, így a fordítók jó eséllyel voltak
képesek a rendelkezésre álló kibocsájtási helyek nagy arányú feltöltésére, azaz magas hatásfokot értek el.
Másképp fogalmazva a grafikai alkalmazások nagyon jól illeszkednek a VLIW alapú GPU architektúrákhoz
[95].
2.1.7. Az AMD motivációja a korábbi GPU-kban használt VLIW alapú ALU-k használatára
• A VLIW alapú, statikus függőség feloldást használó GPU architektúra alacsonyabb komplexitású, mint egy
hardveres dinamikus függőség feloldást használó tradicionális SIMD alapú GPU architektúra, emiatt AMD
korábban ezt a megoldást preferálta.
• A gyakorlatban ez annyit jelent, hogy azonos mennyiségű tranzisztor esetén a VLIW alapú GPU-k több
tranzisztort használhatnak feldolgozó egységként, mint a dinamikus függőség feloldást használó SIMD alapú
GPU-k, tehát VLIW alapú GPU-kban jellemzően több EU található, mint a SIMD alapú GPU-kban.
A következő táblázatban az Nvidia dinamikus függőség feloldást használó SIMD alapú GPU-it és az AMD
statikus függőség feloldást használó VLIW-alapú GPU-it hasonlítjuk össze.
Az AMD Southern Islands családhoz
tartozó magok és kártyák
172 Created by XMLmind XSL-FO Converter.
2.1.8. Feldolgozó egységek (EU) száma Nvidia és AMD GPU-k esetében
7.10. ábra -
2.1.9. Az AMD motivációja első GPU-iban VLIW5 alapú ALU-k használatára [97]
Az AMD eredetileg VLIW5 kialakítást választott a feldolgozó egységei számára.
Döntésük a DX9-hez kapcsolódott, ugyanis ott a VLIW5 ALU lehetővé tette a 4 tényezős skalár szorzás (pl.
RGBA szín reprezentáció) mellett egy további skaláris komponens (pl. megvilágítás) párhuzamos kiszámítását,
ami a DX9-ben a vertex shaderek esetén szükséges volt.
2.1.10. Az AMD VILW5 ALU-jának kialakítása
Az AMD a 2007-ben bevezetett R600 GPU magban már a VLIW5 kialakítást használta, bár egy kicsit más
formában, mint a későbbi GPU megvalósításokban (ld. ábra).
7.11. ábra - Feldolgozó egységek (EU) száma Nvidia és AMD GPU-k esetében
Az AMD Southern Islands családhoz
tartozó magok és kártyák
173 Created by XMLmind XSL-FO Converter.
Megjegyzés
A VLIW5 kialakítást egészen az ATI első DX9-et támogató 2002-ben megjelent GPU kártyájáig, az R300
magra épülő Radeon 9700-ig lehet visszavezetni [101].
Az R300 a programozható vertex shader futószalagnál használta ki a VLIW5 előnyeit [102].
7.12. ábra - A vertex shader futószalag az ATI első DX 9.0 támogatású GPU-jában (az
R300 magban) (2002) [102]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
174 Created by XMLmind XSL-FO Converter.
2.1.11. A továbbfejlesztett VLIW5 ALU bevezetése
A 2008-ban bevezetett RV770 GPU magban (Evergreen vonal) az AMD leváltotta a VLIW5 kialakítást egy
továbbfejlesztett VLIW5 kialakításra, ami már támogatta az FP64 MAD utasítást.
7.13. ábra - Az AMD VLIW alapú shader ALU-inak fejlődési lépései
2.1.12. A VLIW4 bevezetése a továbbfejlesztett VLIW5 kialakítás helyett - 1
7.14. ábra - Az AMD VLIW alapú shader ALU-inak fejlődési lépései
A 2010-ben megjelenő Cayman GPU magokban (Northern Islands vonal) az AMD lecserélte a továbbfejlesztett
VLIW5 felépítést VLIW4 felépítésre.
2.1.13. A VLIW4 bevezetése a továbbfejlesztett VLIW5 kialakítás helyett - 2
Az AMD Southern Islands családhoz
tartozó magok és kártyák
175 Created by XMLmind XSL-FO Converter.
A váltás okát az AMD a Cayman (HD 6900/Northern Islands vonal) 2010 decemberi bevezetésekor indokolta. E
szerint VLIW5 architektúrájuk átlagos kihasználtsága DX10/11-es játékok shadereinek futásakor csupán 3.4
volt az ötből, vagyis az 5. EU többnyire kihasználatlan volt [17].
Az új VLIW4 kialakításban az AMD
• eltávolította a T-egységet (Transzcendentális egység),
• az EU-k közül hármat úgy fejlesztett tovább, hogy azok közösen képesekké váltak órajel ciklusonként 1
transzcendentális utasítás végrehajtására és
• mind a 4 EU-t továbbfejlesztette annak érdekében, hogy közösen órajel ciklusonként képesek legyenek egy
FP64 művelet elvégzésére.
7.15. ábra - A Northern Islands vonalban (HD6900) bevezetett VLIW4 ALU
blokkdiagrammja [17]
2.1.14. Az AMD továbbfejlesztett VLIW5 és VLIW4 megvalósításainak összehasonlítása [17]
7.16. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
176 Created by XMLmind XSL-FO Converter.
Megjegyzés
A VLIW4 ALU előnyei a VLIW5-tel szemben - 1 [103]
Amint azt az előbbiekben már tárgyaltuk, az új VLIW4 kialakításban az AMD
• eltávolította a T-egységet (Transzcendentális egység),
• az EU-k kózül továbbfejlesztett közül hármat úgy, hogy azok közösen képesekké váltak óraciklusonként 1
transzcendentális utasítás végrehajtására és
• mind a 4 EU-t továbbfejlesztette, hogy közösen órajel ciklusonként képesek legyenek egy FP64 művelet
elvégzésére.
Az új felépítésű ALU által óraciklusonként elvégezhető műveletek:
• 4 FX32 vagy 4 FP32 művelet vagy
• 1 FP64 művelet vagy
• 1 transzcendentális + 1 FX32 vagy 1 FP32 művelet,
míg
a korábbi kialakítás képességei:
• 5 FX32 vagy 5 FP32 művelet vagy
• 1 FP64 művelet vagy
• 1 transzcendentális + 4 FX/FP 32 művelet
órajelciklusonként.
A VLIW4 ALU előnyei a VLIW5-tel szemben - 2 [103]
• A korábbi generációkhoz szükséges lapkaméretnek nagyjából a 10%-át sikerült megtakarítani azzal, hogy a
T-egységet AMD eltávolította, miközben a feldolgozó egységek közül hármat alkalmassá tett
Az AMD Southern Islands családhoz
tartozó magok és kártyák
177 Created by XMLmind XSL-FO Converter.
transzcendentális függvények végrehajtására, ill. a 4 feldolgozó egységet együttesen arra, hogy órajel
ciklusonként képes legyen egy FP64 utasítást feldolgozni.
• A szimmetrikus ALU kialakítás egyúttal nagyban leegyszerűsíti a VLIW fordító ütemezési feladatait is.
• A VLIW4 ALU további előnye az, hogy FP64 számításokat az FP32 számítások sebességének ¼-edével
képes elvégezni, a korábbi 1/5-ös aránnyal szemben.
2.1.15. A numerikus számítások fontosságának növekedése és ezzel összefüggésben a GCN microarchitektúra bevezetése
• Amint azt korábban már említettük, az AMD első GPU-i esetében a fő cél a grafikai alkalmazások támogatása
volt.
• Mivel a fix grafikai algoritmusokhoz a VLIW architektúra igen jól illeszkedik, ezért AMD eleinte VLIW-
alapú ALU-kat használt (ami a korábbi ATI megvalósításokon alapult).
• Az idő múlásával azonban a számításigényes alkalmazások (HPC) egyre nagyobb teret nyertek, és a GPU-k,
valamint az adatpárhuzamos gyorsítók egyre több alkalmazási területen váltak fontossá, mint pl. a fizikai
alkalmazások, pénzügyi és üzleti alkalmazások, bányászat stb.
• Ezen túlmenően, a numerikus számítást végző grafikus kártyák és gyorsítók jelentősen nagyobb haszonnal
voltak forgalmazhatók és lényegesen nagyobb fejlődési potenciállal rendelkeznek, mint a hagyományos
grafikai kártyák [95].
• A fentiek miatt Nvidia, AMD és az Intel egyre nagyobb hangsúlyt fektet számításorientált eszközeinek
fejlesztésére, így például Nvidia a Tesla vonalára, AMD a FireStream/FirePro családjaira, vagy Intel a
Larrabee projektjére (melyet időközben leállított), majd később MIC ill. Xeon Phi családként megújítva a
piacra hozott.
• Mindeközben világossá vált, hogy a VLIW-alapú GPU-k kevésbé alkalmasak számítási feladatok
elvégzésére, mivel a fordítók igen eltérő jellegű algoritmusok esetén általában nem képesek a VLIW
kibocsájtási helyeket megfelelő mértékben feltölteni végrehajtandó műveletekkel [95], ezért az AMD
következő lépésként a GPU-iban használt VLIW4 ALU-kat lecserélte az új GCN architektúrájú ALU-kra (a
South Islands családjában), amint ezt a következő ábra szemlélteti.
2.1.16. A VLIW4 alapú ALU-k leváltása SIMD alapú GCN architektúrájú ALU-kra [91]
2.1.16.1. Az AMD GPU mikroarchitektúráinak fejlődése
7.17. ábra -
2.2. Az AMD ZeroCore technológiája [49]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
178 Created by XMLmind XSL-FO Converter.
• a processzorok tervezői jelentős erőfeszítéseket tesznek a processzorok mind aktív mind passzív (idle)
állapotban megjelenő fogyasztásának csökkentésére.
Az aktív fogyasztás csökkentésére több széles körben elterjedt eljárás szolgál, mint pl. az órajel kapuzás
(clock gating), funkcionális egységek kapuzása (power gating) vagy a frame buffer tömörítés.
• A passzív (idle) állapot rövid vagy hosszú ideig maradhat fent.
Az előzetesen beállított értéknél hosszabb passzív állapotokban (long idle periods) a képernyőt kikapcsolják.
Ebben az állapotban viszont a teljes grafikai kártya általában nem kapcsolható le, mivel az operációs
rendszernek és a BIOS-nak érzékelni kell tudnia a kártya jelenlétét.
• Az AMD ezt a problémát orvosolja a ZeroCore technológiával.
A ZeroCore technológia segítségével az AMD táplálási szigeteket (power islands) vezetett be, melyek
egymástól függetlenül kapnak tápfeszültséget.
Hosszú passzív állapot esetén egy olyan táplálásí szigeten kívül, mely a kártyát mind az operációs rendszer,
mind a BIOS számára továbbra is elérhetővé teszi, a teljes GPU lekapcsolható.
2.2.1. A ZeroCore technológia segítségével elérhető passzív állapotú energia fogyasztás [104]
7.18. ábra -
Megjegyzés
Az AMD ZeroCore technológiája mellett a Southern Islands családban az AMD PowerTune technológiát is
használ, melyet a Northern Islands családban vezetett be (a HD 6000/Cayman grafikai kártyákban).
2.2.2. Az AMD PowerTune technológiája
• Azok az alkalmazások, amelyek a GPU-t teljes terheléssel üzemeltetik, könnyedén előidézhetik a kártya
túlmelegedését. Ilyen alkalmazások például a terhelés tesztelésre szolgáló célszoftverek, mint pl. a Futurmark
vagy az OCCT SC8.
A PowerTune nélküli kártyák esetében a túlmelegedést úgy kerülik el, hogy jelentős teljesítmény tartalékot
hagynak a kártyában, így az eszköz nem melegszik túl, és nem károsodik.
Ez a megoldás végeredményben csökkentett órajelet jelent.
Az AMD Southern Islands családhoz
tartozó magok és kártyák
179 Created by XMLmind XSL-FO Converter.
• A PowerTune technológia használata esetén egy mikrovezérlő (microcontroller) folyamatosan ellenőrzi a
lapka hőmérsékletét és az energia fogyasztást.
• Amennyiben a hőmérséklet túlságosan megemelkedik, akkor a megfelelő algoritmus lecsökkenti az órajelet,
így lecsökken a lapka hőmérséklete is, és a károsodás elkerülhető (ld. a következő ábrát).
Következésképpen, a PowerTune technológia alkalmazásával a maximális órafrekvencia magasabb lehet,
mint anélkül.
2.2.3. A Northern Islands családban bevezetett PowerTune technológia (HD 6900/Cayman), 2010 december) [106]
7.19. ábra -
2.2.4. A PowerTune technológia használatának előnye [105]
7.20. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
180 Created by XMLmind XSL-FO Converter.
3. Az AMD Southern Islands kártyacsaládja
3.1. A Southern Islands család áttekintése
E család alternatív elnevezése a GCN (Graphics Core Next) család.
• A Southern Islands család az AMD első HSA felé mutató GPU családja
• 2011 júniusában jelentették be
• 2011 novemberében vezették be
3.1.1. Az AMD GCN bejelentése és megvalósítása
7.21. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek
áttekintése (4)
Az AMD Southern Islands családhoz
tartozó magok és kártyák
181 Created by XMLmind XSL-FO Converter.
Megjegyzés
Az első kártyák után (HD 7950/70) az AMD bevezetett magasabb órajelen üzemelő verziókat is HD7970 GE
(Gigahertz Edition), valamint HD 7950 Boost néven.
3.1.2. A Southern Islands család főbb jellemzői
• Új alap architektúra (GCN)
• Ehhez kapcsolódó új ISA (GCN ISA)
• AMD ZeroCore energia csökkentő technológia
• Az első 28 nm-es technológiával készített GPU
• Windows 8 támogatás
• PCIe 3.0 első hivatalos támogatása
• DX11.1 első hivatalos támogatása
• OpenCL 1.2 támogatás
• Három eltérő teljesítményű alcsalád
3.1.3. Southern Islands család alcsaládjai - 1 [107]
7.22. ábra - Southern Islands család alcsaládjai [107]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
182 Created by XMLmind XSL-FO Converter.
3.1.4. A Southern Islands család alcsaládjai - 2 [108]
7.23. ábra -
3.1.5. Az AMD és Nvidia grafikus magjai lapkaméreteinek összehasonlítása [95]
7.24. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
183 Created by XMLmind XSL-FO Converter.
Megjegyzés
A Southern Islands család bemutatásakor csak a legnagyobb teljesítményű alcsaládra koncentrálunk (Tahiti/HD
79xx vonal).
3.1.6. AMD GCN bejelentése és megvalósítása
7.25. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek
áttekintése (3)
3.2. A Radeon HD7970 grafikus kártya Tahiti XT magjának mikroarchitektúrája
3.2.1. A Tahiti XT mag mikroarchitektúrájának áttekintése [95]
7.26. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
184 Created by XMLmind XSL-FO Converter.
3.2.2. A 7950 (Tahiti Pro) és a 7970 (Tahiti XT) magokat használó kártyák közötti különbségek
A HD 7970 32 számítási egységgel (CU - Compute Units) rendelkezik (az ábrán ez GCN néven szerepel), míg a
HD 7950 magjában AMD négy CU-t letiltott.
7.27. ábra - HD 5950 (Tahiti Pro) blokkdiagrammja [109]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
185 Created by XMLmind XSL-FO Converter.
3.2.3. A számítási egységek (CU - Compute Unit) architekturális áttekintése - egyszerűsített blokkdiagramm [95]
7.28. ábra -
3.2.4. Egy számítási egység (CU) részletes blokkdiagrammja [108]
7.29. ábra -
3.2.5. Egy számítási egység (CU) fő egységei
Amint azt az előző ábrán látható részletes blokkdiagram szemlélteti, a CU-k a következő egységeket
tartalmazzák:
• Előfeldolgozó egység, mely az utasítások lehívására és dekódolására szolgál
• négy 16-széles SIMD egység
• egy skalár egység
• 16 KB L1 utasítás cache, amelyen 4 CU osztozik
• 16 KB L1 adat cache minden CU-n
• 64 KB LDS (Local Data Share - Közös használatú Lokális Tár) CU-nként, melyet mind a négy SIMD egység
közösen használ
• 32 KB skaláris csak olvasható állandó cache, amelyet mind a négy CU közösen használ
Az AMD Southern Islands családhoz
tartozó magok és kártyák
186 Created by XMLmind XSL-FO Converter.
3.2.6. A CU négy 16-széles SIMD egysége [110] (nagymértékben egyszerűsített leírás)
Elsődlegesen kernelek végrehajtására szolgál.
Az előző ábra szerint mind a négy 16-széles SIMD egység (SIMD0 - SIMD3) tartalmaz egy-egy 64 KB register
fájlt és egy Vector MP ALU-t, melyhez 16 feldolgozó egység (EU) tartozik.
7.30. ábra - A 16-széles SIMD egység egyszerűsített blokkdiagrammja ([95] alapján)
• Minden EU futószalag elven működik és 32- vagy 64-bites műveleteket képes elvégezni FX, FP vagy boolean
adattípusokon.
• Minden EU általában a hozzá tartozó 64 KB méretű regiszter fájlból veszi az operandusokat.
• Minden EU képes új 32-bites FX, FP (akár MAD) ill. boolean művelet fogadására minden óraciklusban.
• Minden EU képes egy új 64-bites FP művelet (akár FP MAD művelet) fogadására minden 4. óraciklusban.
• A futószalag elven működő EU-k négy óraciklus késleltetéssel szolgáltatnak eredményt.
3.2.7. A CU skalár egysége [110]
• A skalár egység integer műveleteket hajt végre, és elsődleges feladata a program végrehajtása.
• Óraciklusonként egyetlen műveletet végez el.
• A skalár egység az operandusait jellemzően a hozzá tartozó 8 KB méretű regiszter fájlból veszi.
Megjegyzés
A SIMD és a skalár egységek működésének részletes leírása a [110] hivatkozásban található.
3.2.8. A HD 7970 (Tahiti XT) grafikai kártya maximális FP32 és FP64 teljesítménye
3.2.8.1. a) A maximális FP32 teljesítmény
CU-nként 4 SIMD egységgel, SIMD egységenként 16 EU-val a GPU-ban 32 CU-val számolva egy GPU-ban
összesen 2048 EU van.
925 MHz-es mag frekvenciát alapul véve az elérhető csúcs teljesítmény:
Az AMD Southern Islands családhoz
tartozó magok és kártyák
187 Created by XMLmind XSL-FO Converter.
925 x 106 x 2048 = 1.8944 x 1012 MAD utasítás/sec
MAD utasításonkénti 2 művelettel számolva a maximális FP32 teljesítmény:
Maximális FP32 teljesítmény: 2x 1.8944 x 1012 = 3.7888 TFLOPS
A maximális FP64 teljesítmény
3.2.8.2. b) A maximális FP64 teljesítmény
A maximális FP64 teljesítmény a maximális FP32 teljesítmény negyede, azaz
Maximális FP64 teljesítmény: 3.7888 TFLOPS/4 = 0.9472 TFLOPS
3.2.9. A HD 7970 (Tahiti XT) cache hierarchiája [95]
7.31. ábra -
3.2.10. CPU-nkénti és GPU-nkénti elérhető tárhelyek a HD 7970-ben (Tahiti XT) [110]
7.32. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
188 Created by XMLmind XSL-FO Converter.
Megjegyzés
Az OpenCL négy memória tartományt definiál: ezek a private, local, global és constant memóriák. Ezen
túlmenően a GPU-k elérik még a host (CPU) memóriáját is a következők szerint [16]:
private memory: egy munkaelemhez tartozik, más munkaelemek nem érhetik el,
local memory: egy munkacsoporthoz tartozik, az adott munkacsoportba tartozó munkaelemek érik el,
global memory: egy adott kontextusban futó összes munkaelem, valamint a host számára is elérhető,
constant memory: csak olvasható régió a host által allokált és inicializált objektumok számára, amelyek a kernel
végrehajtása közben nem változnak,
host (CPU) memory: a gazdagép számára elérhető régió az alkalmazás adatstruktúráinak és programjának
tárolására.
3.2.11. A HD 7970 (Tahiti XT) magban található memóriák méretei, valamint azok olvasási sebessége [16]
7.33. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
189 Created by XMLmind XSL-FO Converter.
A Stream mag itt EU-t jelent.
Minden méret KByte-ban van megadva (amit itt k-val jelölnek, vagyis pl. a 64k jelentése 64 KB)!
3.3. Működési elvük (Ismétlés a 3.2-es fejezetből)
3.3.1. Számítási feladatok
A GPU esetében a számítási feladat egy párhuzamos adatfolyamot feldolgozó program futtatását (kernelt) jelenti
legfeljebb három dimenziós adastruktúrán - vagyis az egy N dimenziós tartományon (amit végrehajtási
tartománynak is neveznek) végzett számításokat jelent, amint azt a lenti ábra szemlélteti.
7.34. ábra - Az N dimenziós végrehajtási tartomány értelmezése [12]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
190 Created by XMLmind XSL-FO Converter.
3.3.2. Munkaelemek
A munkaelemek a számítás alap egységei. Jellemzően az adattér index értékkel rendelkező elemeit értjük alatta.
A munkaelem, vagy pontosabban a munkaelem feldolgozása az utasítás folyamban meghatározott sorrendben
szálként is értelmezhető.
7.35. ábra - A munkaelem értelmezése ([12] alapján)
Az AMD Southern Islands családhoz
tartozó magok és kártyák
191 Created by XMLmind XSL-FO Converter.
3.3.3. A kernel
A kernel az N-dimenziós tartományon végrehajtandó adatpárhuzamos program. Különféle utasításokat
tartalmazhat, például
• vektor utasításokat, amelyek egy SIMD egység mind a 16 EU-ját vezérlik,
• skalár utasításokat, amelyek a skalár egységeket vezérlik,
• vektor memória utasításokat, amelyek adatátvitelt hajtanak végre (adat olvasását vagy írását) a GPU memória
és a SIMD egység vektor regiszter fájlja (VGPR) között.
Megjegyzés
A számítás orientált adatpárhuzamos programokként értelmezett kernelekkel ellentétben a shaderek grafikai célú
programok, amelyeket a GPU hajt végre.
3.3.4. Munkacsoportok
Az N-dimenziós tartományokat a programozó munkacsoportokra bontja fel a hatékony végrehajtás érdekében.
(ld. a lenti ábrát).
Egy munkacsoport végrehajtását az ütemező egy CU-ra allokálja.
7.36. ábra - A munkacsoport értelmezése [12]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
192 Created by XMLmind XSL-FO Converter.
3.3.5. Hullámfrontok - 1
A hatékony feldolgozás érdekében a munkacsoportokat az Ultra-Threaded Dispatcher hullámfrontokra bontja,
amelyek azonos CU-n lesznek végrehajtva.
7.37. ábra - A hullámfrontok értelmezése [12]
Az azonos munkacsoporthoz tartozó hullámfrontok egymás közt adatokat oszthatnak meg, és a futásuk
szinkronizálható az S_BARRIER utasítással, amely az összes hullámfrontot arra kényszeríti, hogy várják meg,
míg a többi hullámfront is eljut ugyanaddig az utasításig.
3.3.6. Hullámfrontok - 2
• A hullámfront jelenti a legkisebb, CU-n végrehajtásra ütemezhető egységnyi feladatot.
• A hullámfrontok mérete az adott hardver megvalósításától függ.
Az AMD Southern Islands családhoz
tartozó magok és kártyák
193 Created by XMLmind XSL-FO Converter.
A Southern Islands család nagy teljesítményű modelljei, például a HD 7950/70 (Tahiti Pro/XT), valamint
néhány újabb modell esetében a hullámfront mérete 64 munkaelem, míg az alacsonyabb kategóriás, vagy
régebbi modellek, például a HD 54xx 32 munkaelemből álló hullámfrontokat futtatnak.
• Minden hullámfront egy önálló utasítás számlálóval (Program Counter (PC)) rendelkezik, amelyik a
következőként végrehajtandó utasítás memória címét tartalmazza.
Amikor a hullámfront létre jön, a PC a program első utasítására mutat.
3.3.7. Működési elv
A HD 7970 (Tahiti XT) működési elvét a következő, South Islands sorozatú processzor blokkdiagrammját
tartalmazó ábra mutatja be.
7.38. ábra - Southern Islands sorozatú processzor blokkdiagrammja [110]
3.3.8. Számítási feladatok elindítása a GPU-n
• Mielőtt egy alkalmazás kiküldi a GPU-ra a számítási feladatot, először le kell fordítania a kernelt, és be kell
töltenie azt a memóriába.
• A forrás és az eredmény adatokhoz puffereket kell hozzárendelnie.
• Végül létre kell hoznia egy parancs várakozási sort a parancs pufferben, ami leírja a GPU számára a számítási
feladat végrehajtásának módját.
• Az alkalmazások ezt jellemzően API hívások segítségével oldják meg.
3.3.9. Számítási feladatok végrehajtása - 1
• Az utasítás feldolgozó (Command Processor) a végrehajtás indítására szolgáló utasítás beérkezése után
elkezdi egymás után értelmezni a parancs várakozási sorban található utasításokat.
• Az összetartozó parancsokat továbbküldi az Ultra-Threaded Dispatch Processor (többszálú parancskiküldő
processzor) részére.
Az AMD Southern Islands családhoz
tartozó magok és kártyák
194 Created by XMLmind XSL-FO Converter.
• Az Ultra-Threaded Dispatch Processor lefoglalja a kernel futtatásához szükséges erőforrásokat, az N
dimenziós tartományt 64 munkaelemet tartalmazó hullámfrontokra bontja (a HD 7970 esetében), és kiküldi a
CU egységre a munkacsoportokat és a hullámfrontokat.
• A kernel bekerül a feladat megoldására kiválasztott CU, vagy CU-k utasítás gyorsítótáraiba. (Jegyezzük meg,
hogy 4 CU közösen használ egy 16 KB-os utasítás gyorsítótárat.)
• Ezt követően az CU-k megkezdik az utasítások lehívását az utasítás gyorsítótárból az utasítás pufferükbe,
ahonnan az utasításokat kiküldik a megfelelő feldolgozó egységek számára (SIMD egységek, skaláris
egységek, memória rendszer).
3.3.10. Számítási feladatok végrehajtása - 2
Egy CU mind a négy SIMD egysége képes párhuzamosan több, azonos munkacsoportba tartozó hullámfront
feldolgozására.
Ebből következően minden CU négy aktív program számlálóval (PC) rendelkezik (ld. ábra).
7.39. ábra - CU blokkdiagrammja [110]
Összességében a CU 4x10 utasítás puffert biztosít, az ábrának megfelelően.
3.3.11. Számítási feladatok végrehajtása - 3
A 16 EU-t tartalmazó SIMD egységnek nyilvánvalóan négy óraciklusra van szüksége, hogy a hullámfront mind
a 64 munkaelemét fogadja.
A 16 EU-t tartalmazó SIMD egységnek nyilvánvalóan négy óraciklusra van szüksége, hogy a hullámfront mind
a 64 munkaelemét fogadja.
Új FX32 vagy FP32 típusú művelet minden óraciklusban küldhető az EU futószalagjára, míg az EU FP64 típusú
adatokat csak minden 4. ciklusben képes fogadni.
A hullámfrontok végrehajtása mindaddig folytatódik, míg a végrehajtás el nem ér a kernel végére, ekkor annak
végehajtása befejeződik és a CU egy új hullámfront végrehajtását kezdi el.
3.4. A HD 7970 (Tahiti XT) teljesítmény adatai és fogyasztása [110]
Az AMD Southern Islands családhoz
tartozó magok és kártyák
195 Created by XMLmind XSL-FO Converter.
3.4.1. a) A kártya teljesítménye játékokban
2012 végén az AMD és az Nvidia legerősebb grafikus kártyáinak (Southern Islands/GCN az AMD esetében és a
Kepler-alapú GTX 680 az Nvidia-nál) teljesítménye játékok futtatásakor közel azonos, amint azt a következő
két ábra szemlélteti.
3.4.2. a) Nagy teljesítményű grafikus kártyák teljesítménye játékokban - 1 [50]
7.40. ábra -
A GE jelzés nagyjából 15%-kal megemelt órajel frekvenciát jelent.
3.4.3. a) Nagy teljesítményű grafikus kártyák teljesítménye játékokban - 2 [50]
7.41. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
196 Created by XMLmind XSL-FO Converter.
3.4.4. b) Nagy teljesítményű grafikus kártyák teljesítménye számítási feladatokon mérve [50]
7.42. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
197 Created by XMLmind XSL-FO Converter.
Ahogyan az az ábrán is látszik, 2012 végén az AMD és az Nvidia legerősebb grafikus kártyái közel egyenlő
számítási teljesítményre voltak képesek.
3.4.5. c) Terhelés alatti energia fogyasztás (teljes terhelésen) [50]
7.43. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
198 Created by XMLmind XSL-FO Converter.
Az ábrából látszik, hogy az Nvidia GTX 680 kevesebbet fogyaszt teljes terhelésen, mint az AMD HD 7970.
3.4.6. d) Üresjárati fogyasztás [50]
A bevezetett AMD ZeroCore Power technológiának köszönhetően az AMD HD 7970 passzív fogyasztása
lecsökkent nagyjából az Nvidia GTX 680 fogyasztásának szintjére.
7.44. ábra -
Az AMD Southern Islands családhoz
tartozó magok és kártyák
199 Created by XMLmind XSL-FO Converter.
200 Created by XMLmind XSL-FO Converter.
8. fejezet - Az AMD Sea Islands családja
• Ez az AMD második HSA-t használó architektúrája.
1. A Sea Islands család helye az AMD 2013-as útitervében [111]
8.1. ábra -
2. A Sea Islands család fő jellemzői
Az útitervek 2012 februári közzétételekor az AMD nem jelezte egyértelműen, hogy a Sea Islands család a HSA
mely jellemzőit támogatja [112].
8.2. ábra -
Az AMD Sea Islands családja
201 Created by XMLmind XSL-FO Converter.
3. Az AMD 2. generációs GCN-jének, a Sea Islands családnak a tervezett bevezetése
8.3. ábra - GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése
(4)
Megjegyzés
Az AMD az első megvalósított 2. generációs GCN kártyát (HD 7950/70) követően bevezette a magasabb
órajelű változatokat, a HD7970 GE-t (Gigahertz Edition) és a HD 7950 Boost-ot.
4. A HD 8950/70 grafikus kártyák fő paraméterei
Az AMD által eddig publikált főbb paramétereket a 3.3-as fejezetben már összefoglaltuk.
202 Created by XMLmind XSL-FO Converter.
9. fejezet - Kitekintés
A GPGPU-k ismertetésének e részében az AMD és az Nvidia grafikai vonalainak jövőbeli fejlesztési útiterveit
mutatjuk be, valamint áttekintést nyújtunk az Intel újonnan bevezetett Xeon Phi családjáról (ezt korábban MIC-
nek (Many Integrated Cores) nevezték, és kifejezetten HPC alkalmazások futtatására tervezték).
1. Nvidia útiterve 2014-re és tovább
9.1. ábra -
1.1. A Maxwell CPU + GPU
Az Nvidia 2014-re ütemezi.
Fő jellemzői [115]:
• A Maxwell nem csupán egy GPU, hanem egy GPU és egy CPU integrált együttese egy lapkán.
A CPU egy ARM v8-kompatibilis 64-bites mag (Denvernek hívják), ennél többet azonban nem árultak el
róla.
• A Maxwell egységes virtuális memória támogatással rendelkezik.
Mind a GPU, mind a CPU elérheti a rendszer memóriát.
A megoldás hasonlít az AMD HSA (Heterogeneous System Archtecture - heterogén rendszer architektúra)
mikroarchitektúrájában bevezetett egységes memóriához és nagyban megkönnyíti a GPU programozását.
Ahogyan azt a 6. fejezetben tárgyaltuk, az AMD az egységes virtuális memóriát 2013-ban tervezi bevezetni.
Az Nvidia szerint a Maxwell processzor három fontos szempontból nyújt előrelépést:
• Megnövelt grafikus teljesítmény,
• egyszerűsített programozás és
• energia hatékonyság.
Kitekintés
203 Created by XMLmind XSL-FO Converter.
1.2. A Volta CPU + GPU
A hivatkozott útiterv szerint Nvidia a következő processzorát Volta-nak fogja nevezni, és rétegezett (stacked)
DRAM-mal fogja ellátni, a következő ábra szerint.
1.3. Volta processzor rétegezett DRAM-mal [113]
9.2. ábra -
Megjegyzés
1) Itt jegyeznénk meg, hogy az AMD már 2011-ben bemutatott egy rétegezett memóriájú prototípust, a
kereskedelmi bevezetésre alkalmas változatról azonban eddig még nem érkezett semmilyen információ. [114].
2) Másrészről az Intel az Atom termékcsaládjában rétegezett memóriát használt, először a 2012 decemberében
bemutatott Clover Trail tábla platformjukon, ahol ezt a megoldást PoP (Package-on-Package) memóriának
nevezték. [116].
E platform esetén Intel az LPDDR2 memória chipet az SoC lapka következő rétegeként valósította meg,
ahogyan az a lenti ábrán látható.
A memória chipet a SoC tetejére helyezték, egy köztes rétegre forrasztva.
Ezáltal lerövidítették az elérési időt, és megnövelték a sávszélességet.
9.3. ábra - Az Intel Package-on-Package memória rétegezett megoldása a Clover Trail
tábla platformon [116]
2. AMD grafikai útiterve 2013-ra
Kitekintés
204 Created by XMLmind XSL-FO Converter.
A diasor készítésekor az interneten nem volt fellelhető 2014-re vonatkozó grafikai útiterv.
A legkésőbbi terv 2013-ról szól, és a Sea Islands (HD 8000) grafikai kártya családon túl nem tartalmaz újabb
grafikai kártya családot, a lenti ábrának megfelelően.
9.4. ábra - Az AMD asztali gépekbe szánt grafikai kártyáinak 2013-as útiterve [117]
3. Az AMD asztali gépekbe szánt grafikai kártyáinak 2013-as útiterve
9.5. ábra -
4. Az Intel Xeon Phi családja
Az Intel 2010 májusában vezette be MIC (Many Integrated Core) DPA (Data Parallel Accelerator) néven [118].
Főképp az Intel nem túl sikeres Larrabee projektjén alapul, figyelembe vették az SCC (Single Cloud Computer)
fejlesztésük tapasztalatait is.
9.6. ábra -
Kitekintés
205 Created by XMLmind XSL-FO Converter.
A termékcsaládot Intel kizárólag HPC alkalmazások futtatására tervezte, és PCIe add-on kártyaként
implementálta.
4.1. A Knights Ferry protípusa
Az Intel 2010 májusában mutatta be MIC családjának prototípusát, melyet Knight Ferry társprocesszornak
neveztek el, és elérhetővé tették fejlesztők számára [119].
9.7. ábra -
4.2. Az MIC elnevezés módosítása Xeon Phi-re, és a nyílt forráskódú szoftverek támogatása
2012 júniusában az Intel a DPA társprocesszor jelleget hangsúlyozandó MIC családját átnevezte Xeon Phi-re,
ezzel egyben világossá téve azt is, hogy milyen típusú processzor társaként tervezték azt.
Ugyanekkor az Intel nyílt forráskódú szoftver támogatást biztosított a Xeon Phi családjához, amint azt a
következő ábra szemlélteti.
Kitekintés
206 Created by XMLmind XSL-FO Converter.
9.8. ábra - Az Intel Xeon Phi család áttekintése (a korábbi MIC család)
4.3. A Knights Corner processzor
2010 májusában az Intel bejelentette a Knights Corner otthoni felhasználásra szánt processzorát, amit végül
2012 novemberében dobott piacra [119]
9.9. ábra -
4.4. A Xeon Phi család főbb jellemzői [120]
Megcélzott alkalmazási terület
Masszívan párhuzamos HPC alkalmazások
Programozási környezet
Általános célú programozási környezet
Kitekintés
207 Created by XMLmind XSL-FO Converter.
• Linux alatt fut
• Képes futtatni Fortranban, C-ben, C++-ban, OpenCL 1.2-ben (2013 februári beta verzió) készített
alkalmazásokat.
• Támogatja az x86 memória modellt.
• Rendelkezésre állnak az x86-on megszokott fejlesztői eszközök (programkönyvtárak, fordítók, Intel VTune,
debuggerek stb.).
4.5. A Xeon Phi társprocesszor család elsőként megjelenő tagjai és főbb jellemzőik [121]
9.10. ábra -
Megjegyzés
Az Intel az SE10P/X alcsaládot egyedi megoldások alapjául szánja, amilyenek például a szuperszámítógépek.
Az egyik első ilyen megoldás a TACC Stampede, built in Texas Advanced Computing Center (2012).
9.11. ábra - Intel Xeon Phi családjának fő jellemzői [122], [123]
Kitekintés
208 Created by XMLmind XSL-FO Converter.
4.6. A Knights Corner (KCN) DPA felépítése [120]
9.12. ábra -
4.7. A Knights Corner mikroarchitektúrája [120]
A Knights Corner az elődeinek számító Larrabee és Knights Ferry kialakításához hasonlatosan egy kétirányú,
gyűrű topológián alapuló architektúra, amelyben a korábbiakhoz képest megemelt számú (60/61), jelentősen
továbbfejlesztett Pentium mag található, valamint minden maghoz tartozik egy saját 256 kB méretű koherens L2
gyorsítótár.
Kitekintés
209 Created by XMLmind XSL-FO Converter.
9.13. ábra - A Knights Corner mikroarchitektúrája [120]
4.8. A lapka dupla gyűrűs összeköttetéseinek kialakítása [122]
9.14. ábra -
4.9. A Knights Corner magjának blokk diagrammja [120]
9.15. ábra -
Kitekintés
210 Created by XMLmind XSL-FO Converter.
4.10. A vektor feldolgozó egység blokkvázlata és futószalag alapú működése [120]
9.16. ábra -
EMU: Extended Math Unit - Kiterjesztett matematikai egység
Transzcendentális műveletek (pl. reciprok, négyzetgyök és log) műveletek végrehajtására alkalmas, így ezek a
műveletek vektoros formában is végrehajthatóvá váltak [120]
4.11. A Xeon Phi társprocesszor rendszer-architektúrája [122]
9.17. ábra -
Kitekintés
211 Created by XMLmind XSL-FO Converter.
Megjegyzés
A System Management Controller (SMC - Rendszer Management Vezérlő) egység három I2C interfésszel
rendelkezik, ezekkel látja el a hőmérséklet vezérlést, valamint a státusz információ továbbítását.
Ennek részletei a vonatkozó adatlapban megtalálhatóak [122].
4.12. The Xeon Phi 5110P társprocesszor [124]
9.18. ábra -
Kitekintés
212 Created by XMLmind XSL-FO Converter.
4.13. A Xeon Phi társprocesszor nyáklap (hátoldal) [122]
9.19. ábra -
4.14. Az aktív hűtéssel ellátott Xeon Phi 3100 szerelési ábrája [122]
9.20. ábra -
Kitekintés
213 Created by XMLmind XSL-FO Converter.
4.15. Az Intel többmagos, sokmagos és cluster architektúráinak közös fejlesztési platformja [125]
9.21. ábra -
4.16. Az Intel Knight Corner és a versenytársai teljesítmény hatékonyságának összehasonlítása [120]
9.22. ábra -
Kitekintés
214 Created by XMLmind XSL-FO Converter.
4.17. A Xeon Phi 5110P, SE10P/X és a 2-processzoros Intel Xeon szerver maximális teljesítményének összehasonlítása [126]
9.23. ábra -
A referencia rendszer egy 2-processzoros Xeon server, melyben két Intel Xeon E5-2670 processzor van (8 mag,
20 MB L3 cache, 2.6 GHz órajel, 8.0 GT/s QPI sebesség, DDR3 - 1600 MT/s).
4.18. Xeon 5110P és egy 2-processzoros Sandy Bridge alapú Xeon szerver teljesítményének [126]
9.24. ábra -
Kitekintés
215 Created by XMLmind XSL-FO Converter.
4.19. A Xeon Phi 5110P sebességének összehasonlítása egy 2-processzoros Xeon szerverrel
A fenti ábrán látható átlagos 2 - 4-szeres gyorsulás HPC esetében nem túlságosan meggyőző.
Megjegyzés
A referencia rendszer egy 2-processzoros Xeon server, amiben két Intel Xeon E5-2670 processzor van (8 mag,
20 MB L3 cache, 2.6 GHz órajel, 8.0 GT/s QPI sebesség, DDR3 - 1600 MT/s).
4.20. Az Intel Xeon Phi családjának útiterve [127]
9.25. ábra -
Kitekintés
216 Created by XMLmind XSL-FO Converter.
4.21. Assessing the peak FP64 performance of the Knights Corner coprocessor with that of Nvidia’s and AMD’s recent devices
A Knights Corner társprocesszor és az AMD, valamint az Nvidia legfrissebb modelljei FP64 teljesítményének
összehasonlítása
4.22. a) Intel Knights Corner családjának FP64 teljesítménye [126]
9.26. ábra -
Kitekintés
217 Created by XMLmind XSL-FO Converter.
4.23. b) Az Nvidia Tesla GPGPU-inak FP64 teljesítménye
9.27. ábra -
Kitekintés
218 Created by XMLmind XSL-FO Converter.
4.24. c) AMD csúcskategóriás GPU-inak FP64 teljesítménye
9.28. ábra -
Ahogy azt az összehasonlító ábrák mutatják, mindhárom gyártó csúcskategóriás kártyája egyaránt közel
1TFLOP FP64-es teljesítményt nyújt, így jelenleg aligha indokolt egy teljesítménysorrendet megállapítani
közöttük.
219 Created by XMLmind XSL-FO Converter.
10. fejezet - Hivatkozások
[1] Wikipedia: Dolphin triangle mesh, http://en.wikipedia.org/wiki/File:Dolphin_triangle_mesh.png
[2] Wikipedia, DirectX, http://en.wikipedia.org/wiki/DirectX
[3] Patidar S. & al., Exploiting the Shader Model 4.0 Architecture, Center for Visual Information Technology,
IIIT Hyderabad, March 2007, http://research.iiit.ac.in/~shiben/docs/SM4_Skp-Shiben-Jag-
PJN_draft.pdf
[4] Dietrich S., Shader Model 3.0, April 2004, Nvidia, http://www.cs.umbc.edu/~olano/s2004c01/ch15.pdf
[5] Microsoft DirectX 10: The Next-Generation Graphics API, Technical Brief, Nov. 2006, Nvidia,
http://www.nvidia.com/page/8800_tech_briefs.html
[6] Nvidia GeForce 8800 GPU Architecture Overview, Vers. 0.1, Nov. 2006, Nvidia,
http://www.nvidia.com/page/8800_tech_briefs.html
[7] CUDA C Programming Guide, Nvidia.com, http://docs.nvidia.com/cuda/cuda-c-programming-
guide/index.html
[8] Chu M. M., GPU Computing: Past, Present and Future with ATI Stream Technology, AMD, March 9 2010,
http://developer.amd.com/gpu_assets/GPU%20Computing%20-
%20Past%20Present%20and%20Future%20with%20ATI%20Stream%20Technology.pdf
[9] Hwu W., Kirk D., Nvidia, Advanced Algorithmic Techniques for GPUs, Berkeley, Jan. 24-25 2011,
http://iccs.lbl.gov/assets/docs/2011-01-24/lecture1_computational_thinking_Berkeley_2011.pdf
[10] Nvidia CUDA Compute Unified Device Architecture Programming Guide, Version 2.0, June 2008, Nvidia,
http://developer.download.nvidia.com/compute/cuda/2_0/docs/NVIDIA_CUDA_Programming_Guide
_2.0.pdf
[11] Whitepaper, NVIDIA’s Next Generation CUDA Compute Architecture: Fermi, V1.1, 2009,
http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_Whi
tepaper.pdf
[12] Rubin N., HSAIL, AMD Fusion Developer Summit, 2012 Nvidia CUDA C Programming Guide, Version
3.2, October 22 2010,
http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUDA_C_Programming_Guide.
[13] Nvidia CUDA C Programming Guide, Version 3.2, October 22 2010,
http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUDA_C_Programming_Guide.
[14] OpenCL Introduction and Overview, Chronos Group, June 2010,
http://www.khronos.org/developers/library/overview/opencl_overview.pdf
[15] The OpenCL Specification, V1.1, Document Revision: 44, Jan. 6 2011,
http://developer.amd.com/wordpress/media/2012/10/opencl-1.1.pdf
[16] AMD Accelerated Parallel Processing OpenCL Programming Guide, Rev. 1.2, AMD, Jan. 2011,
http://developer.amd.com/gpu/amdappsdk/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Pr
ogramming_Guide.pdf
[17] Goto H., AMD GPU VLIW Evolution, 2010,
http://pc.watch.impress.co.jp/video/pcw/docs/532/796/p17.pdf
[18] Next Gen CUDA GPU Architecture, Code-Named “Fermi”, Press Presentation at Nvidia’s 2009 GPU
Technology Conference, (GTC), Sept. 30 2009,
http://www.nvidia.com/object/gpu_tech_conf_press_room.html
Hivatkozások
220 Created by XMLmind XSL-FO Converter.
[19] Kirsch N., NVIDIA GF100 Fermi Architecture and Performance Preview, Legit Reviews, Jan 20 2010,
http://www.legitreviews.com/article/1193/2/
[20] Parallel Thread Execution, ISA Version 3.1, Nvidia Compute, Sept. 13 2012, Stich T., OpenCL on
NVIDIA GPUs, Nvidia, http://sa09.idav.ucdavis.edu/docs/SA09_NVIDIA_IHV_talk.pdf
[21] Stich T., OpenCL on NVIDIA GPUs, Nvidia,
http://sa09.idav.ucdavis.edu/docs/SA09_NVIDIA_IHV_talk.pdf
[22] Hensley J., Yang J., Compute Abstraction Layer, AMD, Febr. 1 2008,
http://coachk.cs.ucf.edu/courses/CDA6938/s08/UCF-2008-02-01a.pdf
[23] Reference Guide: AMD HD 6900 Series Instruction Set Architecture, Revision 1.0, Febr. 2011,
http://developer.amd.com/gpu/AMDAPPSDK/assets/AMD_HD_6900_Series_Instruction_Set_Archite
cture.pdf
[24] Balfour J., CUDA Threads and Atomics, April 25 2011, http://mc.stanford.edu/cgi-
bin/images/3/34/Darve_cme343_cuda_3.pdf
[25] Kogo H., RV770 Overview, PC Watch, July 02 2008,
http://pc.watch.impress.co.jp/docs/2008/0702/kaigai_09.pdf
[26] Fatahalian K., “From Shader Code to a Teraflop: How Shader Cores Work,”Workshop: Beyond
Programmable Shading: Fundamentals, SIGGRAPH 2008 Nvidia Compute PTX: Parallel Thread
Execution, ISA, Version 2.3, March 2011,
http://developer.download.nvidia.com/compute/cuda/4_0_rc2/toolkit/docs/ptx_isa_2.3.pdf
[27] Nvidia Compute PTX: Parallel Thread Execution, ISA, Version 2.3, March 2011,
http://developer.download.nvidia.com/compute/cuda/4_0_rc2/toolkit/docs/ptx_isa_2.3.pdf
[28] Compute Abstraction Layer (CAL) Technology – Intermediate Language (IL), Version 2.0, AMD, Oct.
2008 SPIR 1.0 Specification for OpenCL, Aug. 24 2012,
http://www.khronos.org/registry/cl/specs/spir_spec-1.0-provisional.pdf
[29] SPIR 1.0 Specification for OpenCL, Aug. 24 2012, http://www.khronos.org/registry/cl/specs/spir_spec-1.0-
provisional.pdf
[30] Nvidia OpenCL Overview, 2009 http://gpgpu.org/wp/wp-content/uploads/2009/06/05-
OpenCLIntroduction.pdf
[31] Nvidia CUDA TM Fermi TM Compatibility Guide for CUDA Applications, Version 1.0, February 2010,
http://developer.download.nvidia.com/compute/cuda/3_0/docs/NVIDIA_FermiCompatibilityGuide.pdf
[32] Wikipedia, CUDA, http://en.wikipedia.org/wiki/CUDA http://en.wikipedia.org/wiki/CUDA
[33] Wikipedia, Comparison of Nvidia graphics processing units,
http://en.wikipedia.org/wiki/Comparison_of_Nvidia_graphics_processing_units
[34] SLI Minimum System Requirements, Geforce.com,
http://www.geforce.com/hardware/technology/sli/system-requirements
[35] Wikipedia, Comparison of AMD graphics processing units,
http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units
[36] Wasson S., Nvidia's GeForce GTX 580 graphics processor Tech Report, Nov 9 2010,
http://techreport.com/articles.x/19934/1
[37] NVIDIA Forums: General CUDA GPU Computing Discussion, 2008
http://forums.nvidia.com/index.php?showtopic=73056
[38] NVIDIA G80: Architecture and GPU Analysis, Beyond3D, Nov. 8 2006,
http://www.beyond3d.com/content/reviews/1/11
Hivatkozások
221 Created by XMLmind XSL-FO Converter.
[39] D. Kirk and W. Hwu, Programming Massively Parallel Processors, 2008 Chapter 3: CUDA Threads,
http://courses.engr.illinois.edu/ece498/al/textbook/Chapter3-CudaThreadingModel.pdf
[40] Shrout R., Nvidia GeForce 8800 GTX Review – DX10 and Unified Architecture, PC Perspective, Nov 8
2006 http://swfan.com/reviews/graphics-cards/nvidia-geforce-8800-gtx-review-dx10-and-unified-
architecture/g80-architecture
[41] GeForce Graphics Processors, Nvidia, http://www.nvidia.com/object/geforce_family.html
[42] Wasson S., Nvidia's GeForce GTX 480 and 470 graphics processors Tech Report, March 31 2010,
http://techreport.com/articles.x/18682
[43] Wasson S., AMD's Radeon HD 5870 graphics processor, Tech Report, Sept 23 2009,
http://techreport.com/articles.x/17618/1
[44] Hoenig M., Nvidia GeForce 580 Review, HardwareCanucks, Nov. 8, 2010,
http://www.hardwarecanucks.com/forum/hardware-canucks-reviews/37789-nvidia-geforce-gtx-580-
review-5.html
[45] Wikipedia, Radeon HD 8000 Series, http://en.wikipedia.org/wiki/Sea_Islands_%28GPU_family%29
[46] Tom’s Hardware Gallery, http://www.tomshardware.com/gallery/Bare-Radeon-HD-5970,0101-230349-
7179-0-0-0-jpg-.html
[47] Tom’s Hardware Gallery, http://www.tomshardware.com/gallery/two-cypress-gpus,0101-230369-7179-0-
0-0-jpg-.html
[48] Angelini C., AMD Radeon HD 6990 4 GB Review, Tom’s Hardware, March 8, 2011,
http://www.tomshardware.com/reviews/radeon-hd-6990-antilles-crossfire,2878.html
[49] Walton S., AMD Radeon HD 7970 Review, Techspot, Dec. 27 2011, http://www.techspot.com/review/481-
amd-radeon-7970/page2.html
[50] Smith R., AMD Radeon HD 7970 GHz Edition Review: Battling For The Performance Crown,
AnandTech, June 22 2012, http://www.anandtech.com/show/6025/radeon-hd-7970-ghz-edition-review-
catching-up-to-gtx-680
[51] Glaskowsky P. N., Nvidia’s Fermi: The First Complete GPU Computing Architecture Sept 2009,
http://www.nvidia.com/content/PDF/fermi_white_papers/P.Glaskowsky_NVIDIA's_Fermi-
The_First_Complete_GPU_Architecture.pdf
[52] Kanter D., Inside Fermi: Nvidia's HPC Push, Real World Technologies Sept 30 2009,
http://www.realworldtech.com/includes/templates/articles.cfm?ArticleID=RWT093009110932&mode
[53] Kirk D. & Hwu W. W., ECE498AL Lectures 4: CUDA Threads – Part 2, 2007-2009, University of Illinois,
Urbana-Champaign,
http://courses.engr.illinois.edu/ece498/al/lectures/lecture4%20cuda%20threads%20part2%20spring%2
02009.ppt
[54] Tom’s Hardware Gallery, http://www.tomshardware.com/gallery/SM,0101-110801-0-14-15-1-jpg-.html
[55] Hoenig M., NVIDIA GeForce GTX 460 SE 1GB Review, Hardware Canucks, Nov 21 2010,
http://www.hardwarecanucks.com/forum/hardware-canucks-reviews/38178-nvidia-geforce-gtx-460-se-
1gb-review-2.html
[56] NVIDIA GF100 Architecture Details, Geeks3D, 2008-2010, http://www.geeks3d.com/20100118/nvidia-
gf100-architecture-details/
[57] Wasson S., Inside Fermi: Nvidia's 'Fermi' GPU architecture revealed, Tech Report, Sept 30 2009,
http://techreport.com/articles.x/17670/1
Hivatkozások
222 Created by XMLmind XSL-FO Converter.
[58] Kanter D., “NVIDIA’s GT200: Inside a Parallel Processor,” Real World Technologies, Sept. 8 2008,
http://www.realworldtech.com/page.cfm?ArticleID=RWT090808195242
[59] Kirk D. & Hwu W. W., ECE498AL Lectures 7: Threading Hardware in G80, 2007, University of Illinois,
Urbana-Champaign, http://courses.ece.uiuc.edu/ece498/al1/ectures/lecture7-threading%20hardware.ppt
[60] Butler, M., Bulldozer, a new approach to multithreaded compute performance, Hot Chips 22, Aug. 24 2010
http://www.hotchips.org/index.php?page=hot-chips-22
[61] Voicu A., NVIDIA Fermi GPU and Architecture Analysis, Beyond 3D, 23rd Oct 2010,
http://www.beyond3d.com/content/reviews/55/1
[62] Chester E., Nvidia GeForce GTX 460 1GB Fermi Review, Trusted Reviews, July 13 2010,
http://www.trustedreviews.com/graphics/review/2010/07/13/Nvidia-GeForce-GTX-460-1GB-Fermi/p1
[63] Smith R., NVIDIA’s GeForce GTX 460: The $200 King, AnandTech, July 11 2010,
http://www.anandtech.com/show/3809/nvidias-geforce-gtx-460-the-200-king/2
[64] Angelini C., GeForce GTX 580 And GF110: The Way Nvidia Meant It To Be Played, Tom’s Hardware,
Nov 9 2010, http://www.tomshardware.com/reviews/geforce-gtx-580-gf110-geforce-gtx-
480,2781.html
[65] Angelini C., GF110: Nvidia Gives Fermi A Facelift, Tom’s Hardware, Nov. 9 2010,
http://www.tomshardware.com/reviews/geforce-gtx-580-gf110-geforce-gtx-480,2781-2.html
[66] Angelini C., Nvidia GeForce GTX 560 Ti Review: GF114 Rises, GF100 Rides Off, Tom’s Hardware, Jan.
25 2011, http://www.tomshardware.com/reviews/nvidia-geforce-gtx-560-ti-gf114,2845.html
[67] Woligroski D., The Nvidia GeForce GTX 560 Review: Take Off Your Ti, Tom’s Hardware, May 17 2011,
http://www.tomshardware.com/reviews/geforce-gtx-560-amp-edition-gtx-560-directcu-ii-
top,2944.html
[68] Wasson S., Nvidia's GeForce GTX 560 Ti graphics processor, Tech Report, Jan. 25 2011,
http://techreport.com/review/20293/nvidia-geforce-gtx-560-ti-graphics-processor
[69] Demerjian C., Nvidia Tesla K20 specs gives hints about 28nm yields, Semi Accurate, Nov. 2 2012,
http://semiaccurate.com/2012/11/02/nvidia-tesla-k20-specs-gives-hints-about-28nm-
yields/#.UTCRPK7Qgcs
[70] Whitepaper, NVIDIA’s Next Generation CUDA Compute Architecture: Kepler GK110, V1.0, 2012,
http://www.nvidia.com/content/PDF/kepler/NVIDIA-Kepler-GK110-Architecture-Whitepaper.pdf
[71] Parallel Thread Execution, ISA Version 3.0, Nvidia Compute, Febr. 8 2012, http://hpc.oit.uci.edu/nvidia-
doc/sdk-cuda-doc/C/doc/ptx_isa_3.0.pdf
[72] NVIDIA CUDA Programming Guide, Version 3.0, Febr. 9 2010,
http://zega.web.elte.hu/jegyz/gpu_prog/NVIDIA_CUDA_Programming_Guide_3.0.PDF
[73] NVIDIA Kepler GK110 Next-Generation CUDA Compute Architecture, May 12,
http://www.nvidia.com/content/PDF/kepler/NV_DS_Tesla_KCompute_Arch_May_2012_LR.pdf
[74] NVIDIA Unveils World's Fastest, Most Efficient Accelerators, Powers World's No.1 Supercomputer,
Nvidia.com, Nov. 12 2012, http://nvidianews.nvidia.com/Releases/NVIDIA-Unveils-World-s-Fastest-
Most-Efficient-Accelerators-Powers-World-s-No-1-Supercomputer-8b6.aspx
[75] ORNL Debuts Titan Supercomputer, OLCF, http://www.olcf.ornl.gov/wp-
content/themes/olcf/titan/Titan_Debuts.pdf
[76] Whitepaper, NVIDIA GeForce GTX 680. V1.0, 2012,
http://www.geforce.com/Active/en_US/en_US/pdf/GeForce-GTX-680-Whitepaper-FINAL.pdf
Hivatkozások
223 Created by XMLmind XSL-FO Converter.
[77] Geforce GTX 480 and GTX 470 reviewed: Fermi performance benchmarks, PC Games Hardware, March
27 2010, http://www.pcgameshardware.com/aid,743498/Geforce-GTX-480-and-GTX-470-reviewed-
Fermi-performance-benchmarks/Reviews/
[78] Smith R., NVIDIA GeForce GTX 680 Review: Retaking The Performance Crown, AnandTech, March 22
2012, http://www.anandtech.com/show/5699/nvidia-geforce-gtx-680-review
[79] Paul D., More details of NVIDIA Tesla cGPU K20 “GK110″, TechNews, May 17 2012,
http://technewspedia.com/more-details-of-nvidia-tesla-cgpu-k20-gk110/
[80] More Trot, Less Slot: ASUS GeForce GTX 680 DirectCU II 4GB Two-Slot Revision!, Nov. 9 2012,
http://rog.asus.com/177262012/graphics-cards-2/more-trot-less-slot-asus-geforce-gtx-680-directcu-ii-
4gb-two-slot-revision/
[81] Norem J., Nvidia Unleashes the Titan, Maximum PC, Febr. 19 2013,
http://www.maximumpc.com/article/news/nvidia_unleashes_titan2013
[82] AMD Fusion System Architecture is now Heterogeneous Systems Architecture, Jan. 18 2012,
http://blogs.amd.com/fusion/2012/01/18/amd-fusion-system-architecture-is-now-heterogeneous-
systems-architecture/
[83] Halfacree G., AMD ditches Fusion branding, Bit-Tech, Jan. 19 2012, http://www.bit-
tech.net/news/hardware/2012/01/19/amd-ditches-fusion-branding/1
[84] Rogers P., The Programmer’s Guide to the APU Galaxy, AMD Fusion Developer Summit, June 2011,
http://amddevcentral.com/afds/assets/keynotes/Phil%20Rogers%20Keynote-FINAL.pdf
[85] Rogers P., Heterogenenous System Architecture and the Software Ecosystem, AMD 2012 Financial
Analyst Day, Febr. 2 2012
[86] Halfacree G., AMD targeted by Arctic over Fusion brand, Bit-Tech, Jan. 23 2012, http://www.bit-
tech.net/news/bits/2012/01/23/amd-arctic-fusion-brand/1
[87] Kyriazis G., Heterogeneous System Architecture: A Technical Review, Rev. 1.0, Aug. 30 2012,
http://developer.amd.com/wordpress/media/2012/10/hsa10.pdf
[88] Heterogeneous System Architecture and the HSA Foundation, AMD Fusion Developer, Summit, June 2012
[89] Lattner C., The Design of LLVM, Dr. Dobb’s, May 29 2012, http://www.drdobbs.com/architecture-and-
design/the-design-of-llvm/240001128?pgno=1
[90] Shimpi A.L., AMD Outlines HSA Roadmap: Unified Memory for CPU/GPU in 2013, HSA GPUs in 2014,
AnandTech, Febr. 2 2012, http://www.anandtech.com/show/5493/amd-outlines-hsa-roadmap-unified-
memory-for-cpugpu-in-2013-hsa-gpus-in-2014
[91] White Paper, AMD Graphics Cores Next (GCN) Architecture, June 2012,
http://www.amd.com/jp/Documents/GCN_Architecture_whitepaper.pdf
[92] Wikipedia, Radeon HD 7000 Series, http://en.wikipedia.org/wiki/Southern_Islands_%28GPU_family%29
[93] Valich T., AMD Next-Generation Roadmap Revealed: 2013 APUs, CPUs, GPUs, BSN, Febr. 2 2012,
http://www.brightsideofnews.com/news/2012/2/2/amd-next-generation-roadmap-revealed-2013-
apus2c-cpus2c-gpus.aspx
[94] Lowe A., AMD's 2012-2013 roadmap, 2013 is all about 28nm, Hexus, Febr. 3 2012,
http://hexus.net/tech/news/industry/34769-amds-2012-2013-roadmap-2013-28nm/
[95] Smith R., AMD Radeon HD 7970 Review: 28nm And Graphics Core Next, Together As One, AnandTech,
Dec. 22 2011, http://www.anandtech.com/show/5261/amd-radeon-hd-7970-review/2
[96] Woligroski D., Wallossek I., Graphics Core Next: The Southern Islands Architecture, Tom’s Hardware,
Dec. 22 2011, http://www.tomshardware.com/reviews/radeon-hd-7970-benchmark-tahiti-gcn,3104-
2.html
Hivatkozások
224 Created by XMLmind XSL-FO Converter.
[97] Smith R., AMD's Radeon HD 6970 & Radeon HD 6950: Paving The Future For AMD, AnandTech, Dec.
15 2010, http://www.anandtech.com/show/4061/amds-radeon-hd-6970-radeon-hd-6950/4
[98] Doggett M., Radeon HD 2900, Graphics Hardware Conf., Aug. 2007,
http://www.graphicshardware.org/previous/www_2007/presentations/doggett-radeon2900-gh07.pdf
[99] Smalley T., ATI Radeon HD 5870 Architecture Analysis, Bit-tech, Sept 30 2009, http://www.bit-
tech.net/hardware/graphics/2009/09/30/ati-radeon-hd-5870-architecture-analysis/8
[100] Hoenig M., AMD Radeon HD 6970 and HD 6950 Review, Hardware Canucks, Dec. 14 2010,
http://www.hardwarecanucks.com/forum/hardware-canucks-reviews/38899-amd-radeon-hd-6970-hd-
6950-review-3.html
[101] Smith R., AMD's Graphics Core Next Preview: AMD's New GPU, Architected For Compute, AnandTech,
Dec. 21 2011, http://www.anandtech.com/show/4455/amds-graphics-core-next-preview-amd-
architects-for-compute/2
[102] Smipi A.L., ATI’s Radeon 9700 (R300) – Crowning the New King, AnandTech, July 18 2002,
http://www.anandtech.com/show/947/6
[103] Kanter D., AMD's Cayman GPU Architecture, Real World Technologies, Dec. 14 2010,
http://www.realworldtech.com/page.cfm?ArticleID=RWT121410213827&p=3
[104] Kirsch N., AMD Radeon HD 7970 3GB Video Card Review, Legit Reviews, Dec. 21 2011,
http://www.legitreviews.com/article/1805/13/
[105] Shrout R., AMD Radeon HD 7970 3GB Graphics Card Review - Tahiti at 28nm, PC Perspective, Dec. 22
2011, http://www.pcper.com/reviews/Graphics-Cards/AMD-Radeon-HD-7970-3GB-Graphics-Card-
Review-Tahiti-28nm/Power-Management-Eyef
[106] AMD Radeon HD 6900 Series Graphics, Dec. 2010, Hot Hardware,
http://hothardware.com/image_popup.aspx?image=big_powertune.jpg&articleid=1602&t=a
[107] Chiappetta M., AMD Radeon HD 7970: 28nm Tahiti GPU Review, Hot Hardware, Dec. 22 2011,
http://hothardware.com/Reviews/AMD-Radeon-HD-7970-28nm-Tahiti-GPU-Review/
[108] Mantor M., AMD Radeon HD 7970 with Graphics Core Next (GCN) Architecture, Aug. 28 2012
[109] Tahiti Pro, Radeon HD 7950 Benchmark Crossfire, http://www.tomshardware.com/gallery/tahiti-
pro,0101-324491-0-2-3-1-jpg-.html
[110] Reference Guide: Southern Islands Series Instruction Set Architecture, Rev. 1.0, Aug. 2012,
http://developer.amd.com/wordpress/media/2012/10/AMD_Southern_Islands_Instruction_Set_Archite
cture.pdf
[111] Vilches J., AMD Radeon HD 8000 series could be delayed until Q2 2013, TechSpot, Dec. 3 2012,
http://www.techspot.com/news/50975-amd-radeon-hd-8000-series-could-be-delayed-until-q2-
2013.html
[112] Shimpi A.L., AMD's 2012 - 2013 Client CPU/GPU/APU Roadmap Revealed, AnandTech, Febr. 2 2012,
http://www.anandtech.com/show/5491/amds-2012-2013-client-cpugpuapu-roadmap-revealed
[113] Urbach J., Trank J., Connecting People With Ideas, Nvidia GPU Technology Conference,
http://nvidianews.nvidia.com/imagelibrary/downloadmedia.ashx?MediaDetailsID=2211&SizeId=-
1&SizeID=-1
[114] Demerjian C., Nvidia GPU roadmaps aren’t an improvement with Volta, Semi Accurate, May 20 2013,
http://semiaccurate.com/2013/05/20/nvidias-volta-gpu-raises-serious-red-flags-for-the-company/
[115] Shilov A., Nvidia: Denver Is Custom ARMv8 64-Bit Processor with Secret Sauce, Xbit Labs, Nov. 8
2012,
http://www.xbitlabs.com/news/cpu/display/20121108215621_Nvidia_Denver_Is_Custom_ARMv8_64
_Bit_Processor_with_Secret_Sauce.html
Hivatkozások
225 Created by XMLmind XSL-FO Converter.
[116] Zahir R., Ewert M., Seshadri H., The Medfield Smartphone: Intel Architecture in a Handheld Form
Factor, IEEE Micro, March 11 2013
[117] AMD Product and Technology Roadmaps, 2013
[118] Skaugen K., Petascale to Exascale, Extending Intel’s HPC Commitment, ISC 2010,
http://download.intel.com/pressroom/archive/reference/ISC_2010_Skaugen_keynote.pdf
[119] Timeline of Many-Core at Intel, intel.com, http://download.intel.com/newsroom/kits/xeon/phi/pdfs/Many-
Core-Timeline.pdf
[120] Chrysos G., Intel Xeon Phi coprocessor (codename Knights Corner), Hot Chips, Aug. 28 2012,
http://www.hotchips.org/wp-content/uploads/hc_archives/hc24/HC24-3-ManyCore/HC24.28.335-
XeonPhi-Chrysos-Intel.pdf
[121] Intel Xeon Phi Coprocessor: Pushing the Limits of Discovery, 2012,
http://download.intel.com/newsroom/kits/xeon/phi/pdfs/Intel-Xeon-Phi_Factsheet.pdf
[122] Intel Xeon Phi Coprocessor Datasheet, Nov. 2012,
http://www.intel.com/content/dam/www/public/us/en/documents/product-briefs/xeon-phi-datasheet.pdf
[123] The Intel Xeon Phi Coprocessor 5110P, Highly-parallel Processing for Unparalleled Discovery, Product
Brief, 2012
[124] Hruska J., Intel’s 50-core champion: In-depth on Xeon Phi, ExtremeTech, July 30 2012,
http://www.extremetech.com/extreme/133541-intels-64-core-champion-in-depth-on-xeon-phi/2
[125] Reinders J., An Overview of Programming for Intel Xeon processors and Intel Xeon Phi, coprocessors,
2012, http://software.intel.com/sites/default/files/article/330164/an-overview-of-programming-for-
intel-xeon-processors-and-intel-xeon-phi-coprocessors.pdf
[126] Intel Xeon Phi Product Family Performance, Rev. 1.1, Febr. 15 2013,
http://www.intel.com/content/dam/www/public/us/en/documents/performance-briefs/xeon-phi-product-
family-performance-brief.pdf
[127] Wee W.C., Leaked Roadmap Reveals Intel's 14nm Skylake Platform and Knights Landing Chip,
Hardware Zone, July 5 2013, http://www.hardwarezone.com.sg/tech-news-leaked-roadmap-reveals-
intels-14nm-skylake-platform-and-knights-landing-chip
[128] Rattner J., „Single-chip Cloud Computer”, An experimental many-core processor from Intel Labs, 2009,
http://download.intel.com/pressroom/pdf/rockcreek/SCC_Announcement_JustinRattner.pdf
Created by XMLmind XSL-FO Converter.
II. rész - GPGPU-k és programozásuk
227 Created by XMLmind XSL-FO Converter.
Tartalom
1. Bevezetés ................................................................................................................................... 231 1. Bevezetés (1) .................................................................................................................... 231
1.1. GPU-k számítási kapacitása ................................................................................ 231 2. Bevezetés (2) .................................................................................................................... 231
2.1. Valós alkalmazások ............................................................................................. 231 2.2. Grafikus Feldolgozó Egységek ............................................................................ 232
2.2.1. Shaderek .................................................................................................. 232 2.3. Unified Shader Model ......................................................................................... 232 2.4. GPGPU fogalom megjelenése ............................................................................. 233 2.5. GPGPU helye és szerepe ...................................................................................... 234 2.6. CPU-GPGPU összehasonlítás ............................................................................. 234 2.7. Memória szerkezete ............................................................................................. 235 2.8. SIMT végrehajtás ................................................................................................ 236
2. Programozási modell ................................................................................................................. 238 1. CUDA környezet alapjai .................................................................................................. 238
1.1. CUDA környezet ................................................................................................. 238 1.2. Szükséges komponensek ..................................................................................... 238 1.3. CUDA környezet áttekintése ............................................................................... 239 1.4. CUDA környezet részei ....................................................................................... 240 1.5. CUDA szoftver rétegek ....................................................................................... 240 1.6. CUDA alapú fejlesztés lépései ............................................................................ 241
2. Fordítás és szerkesztés ..................................................................................................... 242 2.1. CUDA fordítás lépései ......................................................................................... 242
2.1.1. Bemenet .................................................................................................. 242 2.1.2. Kimenet ................................................................................................... 243
2.2. nvcc fordító alapvető paraméterei ........................................................................ 244 2.2.1. Fordítás céljának meghatározása ............................................................. 244
2.3. nvcc fordító alapvető paraméterei (2) .................................................................. 244 2.4. nvcc fordító alapvető paraméterei (3) .................................................................. 245 2.5. nvcc fordító alapvető paraméterei (4) .................................................................. 245 2.6. Példa parancssori fordításra ................................................................................. 245 2.7. Fordítás áttekintése .............................................................................................. 246
3. Platform modell ................................................................................................................ 246 3.1. CUDA platform modell ....................................................................................... 246 3.2. CUDA platform modell (2) ................................................................................. 249 3.3. Hozzáférés az eszközökhöz ................................................................................. 250
3.3.1. CUDA eszköz kiválasztása ..................................................................... 251 3.4. Eszközök adatai ................................................................................................... 251 3.5. Eszközök adatainak lekérdezése .......................................................................... 251
3.5.1. Feladat 2.3.1 ............................................................................................ 252 4. Memória modell ............................................................................................................... 252
4.1. CUDA memória modell ....................................................................................... 252 4.1.1. Kapcsolat a hoszttal ................................................................................. 252
4.2. CUDA memória modell – globális memória ....................................................... 253 4.3. CUDA memória modell – konstans memória ...................................................... 254 4.4. CUDA memória modell – textúra memória ......................................................... 255 4.5. CUDA memória modell – megosztott memória .................................................. 256 4.6. CUDA memória modell – regiszterek ................................................................. 257 4.7. CUDA memória modell – lokális memória ......................................................... 258
4.7.1. Deklaráció .............................................................................................. 258 4.8. Memória modell fizikai leképezése ..................................................................... 259 4.9. Memory handling ................................................................................................ 261 4.10. Memória területek elérhetőség szerint ............................................................... 261 4.11. Dinamikus memóriakezelés – foglalás .............................................................. 262
4.11.1. Memória felszabadítás .......................................................................... 262 4.12. Memória területek közötti másolás .................................................................... 262
GPGPU-k és programozásuk
228 Created by XMLmind XSL-FO Converter.
4.13. Rögzített memória (pinned memory) ................................................................. 263 4.14. Másolás nélküli memória (zero-copy memory) ................................................. 264
5. Végrehajtási modell ......................................................................................................... 264 5.1. CUDA végrehajtási modell - szálak .................................................................... 264 5.2. CUDA blokkok .................................................................................................... 265 5.3. Blokkok azonosítása ............................................................................................ 265 5.4. Globális – lokális index ....................................................................................... 266
5.4.1. Lokális azonosító .................................................................................... 266 5.4.2. Globális azonosító ................................................................................... 267
5.5. Néhány alapvető összefüggés .............................................................................. 267 5.6. CUDA végrehajtási modell – kernel .................................................................... 267 5.7. CUDA végrehajtási modell – kernel indítása ...................................................... 268 5.8. Kernel indítással kapcsolatos típusok .................................................................. 268 5.9. Kernel implementálása ........................................................................................ 269 5.10. Kernel elindítás példa ........................................................................................ 269 5.11. Blokkokat kezelő kernel implementálása .......................................................... 270 5.12. Blokkokat kezelő kernel indítás példa ............................................................... 270 5.13. Teljes alkalmazás elkészítése ............................................................................. 270
5.13.1. Feladat 2.5.1 .......................................................................................... 271 3. Programozási környezet ............................................................................................................. 272
1. Visual Studio használata .................................................................................................. 272 1.1. Visual Studio lehetőségek .................................................................................... 272
1.1.1. New project wizard ................................................................................. 272 1.2. New project wizard .............................................................................................. 272 1.3. Custom build rules ............................................................................................... 273 1.4. CUDA-val kapcsolatos project beállítások .......................................................... 274
2. Számítási képességek ....................................................................................................... 275 2.1. Számítási képességek (1) ..................................................................................... 275 2.2. Számítási képességek (2) ..................................................................................... 276 2.3. Számítási képességek (3) ..................................................................................... 276 2.4. Compute capability (4) ......................................................................................... 277 2.5. Néhány Nvidia GPU számítási képessége ........................................................... 277 2.6. Néhány Nvidia GPU számítási képessége ........................................................... 277
3. CUDA nyelvi kiterjesztés ................................................................................................ 278 3.1. CUDA language extensions ................................................................................. 278 3.2. Mindkét oldalon elérhető típusok ........................................................................ 278
3.2.1. dim3 típus ............................................................................................... 278 3.3. Mindkét oldalon elérhető függvények ................................................................. 278 3.4. Csak eszköz oldalon elérhető változók ................................................................ 279 3.5. Csak eszköz oldalon elérhető függvények ........................................................... 279 3.6. Csak hoszt oldalon elérhető függvények ............................................................. 280
4. Aszinkron konkurens végrehajtás .................................................................................... 281 4.1. Stream-ek ............................................................................................................. 281 4.2. Stream-ek létrehozás és megszüntetése ............................................................... 281 4.3. Stream-ek használata ........................................................................................... 282 4.4. Példa a stream-ek használatára ............................................................................ 283 4.5. Stream szinkronizáció .......................................................................................... 283 4.6. Szinkronizációt magukba foglaló műveletek ....................................................... 283 4.7. Stream időzítés [12] ............................................................................................. 284 4.8. Konkurens végrehajtás támogatása ...................................................................... 284 4.9. Példa blokkolt sorra ............................................................................................. 285 4.10. Példa blokkolt sorra (2) ..................................................................................... 285
5. CUDA események ............................................................................................................ 286 5.1. Események létrehozása és megszüntetése ........................................................... 286 5.2. Esemény rögzítése ............................................................................................... 286 5.3. Esemény szinkronizálása ..................................................................................... 287 5.4. Esemény ellenőrzése ............................................................................................ 287 5.5. Szinkronizáció eseményekkel .............................................................................. 288 5.6. Szinkronizáció eseményekkel (példa) ................................................................. 288 5.7. Események között eltelt idő számítása ................................................................ 289
GPGPU-k és programozásuk
229 Created by XMLmind XSL-FO Converter.
5.8. Eltelt idő számítása (példa) .................................................................................. 289 6. Egyesített Virtuális Címtér ............................................................................................... 289
6.1. CUDA Unified Virtual Address Management ..................................................... 289 6.2. Egyesített Virtuális Címtér (UVA) ...................................................................... 290 6.3. Egyesített Virtuális Címtér – elérhetőség ............................................................ 290 6.4. Peer to peer kommunikáció az eszközök között .................................................. 291 6.5. UVA és a P2P átvitel ........................................................................................... 292 6.6. P2P memória átvitel GPU-k között ..................................................................... 292 6.7. P2P memória másolás GPU-k között ................................................................... 293 6.8. P2P memória hozzáférést bemutató kernel .......................................................... 293 6.9. CUDA UVA összegzés ........................................................................................ 294
4. Optimalizációs technikák ........................................................................................................... 295 1. Megosztott memória használata ....................................................................................... 295
1.1. Optimalizációs stratégiák ..................................................................................... 295 1.2. Mátrix szorzó alkalmazás elkészítése .................................................................. 295
1.2.1. Feladat 4.1.1 ............................................................................................ 295 1.3. Többdimenziós mátrix a memóriában ................................................................. 296 1.4. Többdimenziós mátrix a memóriában ................................................................. 297 1.5. Több dimenziós mátrix a GPU memóriában ........................................................ 297 1.6. Igazított elhelyezés .............................................................................................. 298 1.7. Igazított memóriakezelés ..................................................................................... 299 1.8. Igazított memória másolása ................................................................................. 299 1.9. Mátrix szorzó alkalmazás elkészítése igazított memóriával ................................ 300
1.9.1. Feladat 4.1.2 ............................................................................................ 300 1.10. Kernel igazított memóriakezeléssel ................................................................... 300 1.11. Kernel hívása igazított tömbök esetén ............................................................... 301 1.12. Megosztott memória kezelése ............................................................................ 301 1.13. Ötlet a mátrix szorzás gyorsítására (csempe technika) ...................................... 302 1.14. Mátrix szorzó alkalmazás elkészítése (megosztott memóriával) ....................... 302
1.14.1. Feladat 4.1.3 .......................................................................................... 302 1.15. Mátrix szorzás gyorsítása .................................................................................. 303 1.16. Mátrix szorzás gyorsítása (2) ............................................................................. 303 1.17. Mátrix szorzás gyorsítása (3) ............................................................................. 304 1.18. Mátrix szorzás gyorsítása (4) ............................................................................. 305 1.19. Mátrix szorzás gyorsítása (5) ............................................................................. 306 1.20. Optimalizált mátrix szorzás kernel .................................................................... 307 1.21. Összehasonlító vizsgálat .................................................................................... 308
2. Atomi műveletek használata ............................................................................................ 308 2.1. Atomi műveletek szükségessége ......................................................................... 308 2.2. CUDA atomi műveletek ...................................................................................... 308 2.3. CUDA atomi műveletek - aritmetika ................................................................... 309 2.4. CUDA atomi műveletek – aritmetika (2) ............................................................. 309 2.5. CUDA atomi műveletek – logikai függvények ................................................... 310
2.5.1. Feladat 4.2.1 ............................................................................................ 310 2.6. Vektor legkisebb elemének értéke ....................................................................... 310
2.6.1. Feladat 4.2.2 ............................................................................................ 310 2.7. Memóriahozzáférések csökkentése – megosztott memória ................................. 310
2.7.1. Összehasonlító vizsgálat ......................................................................... 311 2.8. Blokkon belüli párhuzamosítás ............................................................................ 312
2.8.1. Feladat 4.2.3 ............................................................................................ 312 2.9. Párhuzamos minimum - betöltés .......................................................................... 312 2.10. Párhuzamos minimum – blokk minimuma ........................................................ 313 2.11. Párhuzamos minimum - kernel .......................................................................... 314 2.12. Párhuzamos minimum – kernel (2) .................................................................... 314 2.13. Összehasonlító vizsgálat .................................................................................... 314 2.14. Összehasonlító vizsgálat .................................................................................... 315
3. Kihasználtság ................................................................................................................... 315 3.1. A végrehajtás áttekintése ..................................................................................... 315 3.2. Kihasználtság ....................................................................................................... 316 3.3. Kihasználtság és a regiszterek kapcsolata ............................................................ 316
GPGPU-k és programozásuk
230 Created by XMLmind XSL-FO Converter.
3.4. Kihasználtság és megosztott memória ................................................................. 317 3.5. Kihasználtság és blokk méret .............................................................................. 317 3.6. CUDA Occupancy calculator .............................................................................. 318 3.7. CUDA Occupancy calculator - példa .................................................................. 318 3.8. CUDA Occupancy calculator – változó blokk méret hatása ................................ 319 3.9. CUDA Occupancy calculator – változó regiszter szám hatása ............................ 319 3.10. CUDA Occupancy calculator – változó megosztott memória hatása ................ 320 3.11. Blokk mérettel kapcsolatos javaslatok [18] ....................................................... 320
4. Parallel Nsight .................................................................................................................. 321 4.1. Parallel Nsight ..................................................................................................... 321 4.2. Kernel nyomkövetés ............................................................................................ 322 4.3. GPU memória régiók megtekintése ..................................................................... 322 4.4. CUDA Debug Focus ............................................................................................ 323 4.5. CUDA Device Summary ..................................................................................... 323 4.6. CUDA Device Summary - rács ........................................................................... 324 4.7. CUDA Device Summary - warp .......................................................................... 324 4.8. PTX code nyomkövetése ..................................................................................... 325 4.9. Memória ellenőrzés használata ............................................................................ 326 4.10. CUDA memória ellenőrző minta eredmény ...................................................... 326 4.11. Lehetséges hibakódok és jelentésük .................................................................. 327
5. CUDA könyvtárak ..................................................................................................................... 329 1. CUBLAS könyvtár ........................................................................................................... 329
1.1. CUBLAS Library ................................................................................................ 329 1.2. CUBLAS alapú alkalmazások fejlesztése ............................................................ 329 1.3. CUBLAS függvények visszatérési értéke ............................................................ 329 1.4. CUBLAS segítő függvények ............................................................................... 330 1.5. CUBLAS memória kezelés .................................................................................. 330 1.6. BLAS függvények áttekintése ............................................................................. 331 1.7. Néhány CUBLAS 1. szintű függvény .................................................................. 331 1.8. Néhány CUBLAS 2. szintű függvény .................................................................. 332 1.9. Néhány CUBLAS 3. szintű függvény .................................................................. 332
6. CUDA verziók ........................................................................................................................... 334 1. CUDA 4 újdonságok ........................................................................................................ 334
1.1. CUDA 4.0 újdonságai .......................................................................................... 334 1.2. Aktuális eszköz kiválasztása ................................................................................ 334 1.3. Aktuális eszköz – stream, események .................................................................. 334 1.4. Több-GPU példa .................................................................................................. 335 1.5. Több CPU szál használata ................................................................................... 335 1.6. Vektor szorzás több-GPU-s környezetben - kernel .............................................. 336 1.7. Vektor szorzás több-GPU-s környezetben – memória foglalás ........................... 336 1.8. Vektor szorzás több-GPU-s környezetben – kernel hívás ................................... 337 1.9. Vektor szorzás több-GPU-s környezetben – kernel hívás ................................... 337
2. CUDA 5 újdonságok ........................................................................................................ 338 2.1. CUDA 5.0 újdonságok [26] ................................................................................. 338 2.2. Dinamikus párhuzamosság .................................................................................. 338
7. Felhasznált irodalom .................................................................................................................. 340 1. Felhasznált irodalom ........................................................................................................ 340 2. Gyakran előforduló kifejezések fordításai ........................................................................ 341
231 Created by XMLmind XSL-FO Converter.
1. fejezet - Bevezetés
1. Bevezetés (1)
1.1. GPU-k számítási kapacitása
• A GPU-k igen jelentős számítási kapacitással bírnak napjainkban (főleg az egyszeres pontosságú aritmetika
területén)
1.1. ábra - [11]
2. Bevezetés (2)
2.1. Valós alkalmazások
• Számos GPU alapú alkalmazást készítettek már a CUDA architektúra segítségével programozók, kutatók és
tudósok világszerte
• Számos példa található a CUDA Community Showcase oldalon
1.2. ábra -
Bevezetés
232 Created by XMLmind XSL-FO Converter.
2.2. Grafikus Feldolgozó Egységek
• Alapvető feladatuk a képernyőn megjelenítendő tartalom kezelésével kapcsolatos feladatok átvétele a CPU-
tól [1].
• A modern GPU-k meglehetősen nagy teljesítményű 3D grafikai feldolgozásra alkalmasak, ezek a funkciók
általában valamilyen szabványos API-n keresztül érhetők el, pl.:
• OpenGL (www.opengl.org)
• Direct3D (www.microsoft.com)
2.2.1. Shaderek
• A 3D grafikai feldolgozást az úgynevezett shaderek hajtják végre, ezek fő típusai az alábbiak [2]
• Vertex shader – feladata a 3D térben lévő koordináták leképezése a képernyő síkjára
• Pixel shader – feladata a megjelenítendő alakzatok egyes pontjainak a színének a kiszámítása (textúra,
világítás, árnyékolás stb.)
• Geometry shader – feladata az alakzatok geometriájának változtatása
2.3. Unified Shader Model
Terhelés eloszlásának problémái
• A kezdeti megvalósításokban a különféle shader egységek különböző hardver elemeket jelentettek
• Ezek számának megtervezése azonban nehézségekbe ütközik, ugyanis különféle feladatokhoz ezek különböző
arányára lenne szükség
• 1. feladat:
a geometria meglehetősen egyszerű
a pixelek színezése sok erőforrást igényel
• 2. feladat:
Bevezetés
233 Created by XMLmind XSL-FO Converter.
a geometria leképezése erőforrásigényes
a pontok színezése egyszerű
1.3. ábra - [3]
Unified Shader
• A GPU-k fejlődése során a különböző shaderek megvalósítása egyre közelebb került egymáshoz (lásd
különböző shader modellek)
• Végül a gyártók megvalósították, hogy a GPU már csak egyféle, minden feladatot végrehajtani képes
shadereket [4] tartalmaz, így ezek tetszőlegesen csoportosíthatók a különféle feladatokra
2.4. GPGPU fogalom megjelenése
Közvetlenül programozható egységek
• Az egységes shader modell tulajdonképpen egyszerű, kevés utasítással rendelkező általános célú
végrehajtóegységeket hozott magával
• Ez az egyszerűség elősegíti a végrehajtóegységek számának növelését, így a manapság elérhető GPU-k már
több száz ilyen egységet tartalmaznak
• Ennek köszönhetően a GPU-k hatalmas számítási teljesítménnyel rendelkeznek, amit célszerű lehet a grafikai
megjelenítésen túl is kiaknázni:
GPGPU: General-Purpose Computing on Graphics Processor Units
Fejlesztői környezetek megjelenése
• Kezdetben ezen eszközök programozása meglehetősen nehézkes volt, mivel a grafikus kártyákat továbbra is
csak a megszokott módokon lehetett elérni, ezeken keresztül kellett valahogy a saját programkódokat
lefuttatni
• Hamarosan a gyártók is felismerték az új piaci szegmensben rejlő lehetőségeket, emiatt kiadtak saját
programozási környezeteket:
• Nvidia CUDA
• ATI Stream
• OpenCL
Bevezetés
234 Created by XMLmind XSL-FO Converter.
2.5. GPGPU helye és szerepe
GPU előnyei
• Hagyományos eszközökhöz képest kiemelkedő csúcsteljesítmény
• Nagyon jó ár/teljesítmény arány
• Jól skálázható, a piacon sokféle grafikus kártya kapható, és ezekből akár több is elhelyezhető egy megfelelő
alaplapban
• Dinamikus fejlődés, ami a jövőben is biztosítottnak tűnik a fizetőképes keresletnek köszönhetően (játékipar)
GPU hátrányai
• Szekvenciális programok futtatása a GPU-n általában nem hatékony
→ ki kell dolgoznunk egy párhuzamos változatot, ami gyakran nem triviális
• A végrehajtóegységek egymástól kevésbé függetlenek mint a CPU magok
→ a csúcsteljesítmény csak speciális (tipikusan adatpárhuzamos) feladatok végrehajtása során érhető el,
csak ilyenkor célszerű használni GPUt
• A grafikus kártyák általában saját memóriaterületen dolgoznak, ezért a tényleges feldolgozást mindig
memória mozgatások előzik meg/követik
→ optimalizálni kell ezen mozgatások számát, de még így is előfordulhat, hogy az egész GPU alapú
megvalósítást el kell vetni emiatt
• Új terület lévén az ismeretek és az eszközök még kevésbé kiforrottak, emiatt a fejlesztés költségesebb
2.6. CPU-GPGPU összehasonlítás
Gyorsítótár – párhuzamosság
• Az ábrán látható, hogy a CPU esetében az eszköz felületének nagy részét a gyorsítótár foglalja el, míg a GPU
esetében ez szinte teljesen hiányzik, helyette a végrehajtó egységek foglalnak el nagy helyet
• Működés közben a memória olvasással kapcsolatos várakozásokat a CPU a gyorsítótárral próbálja
csökkenteni, a GPU pedig a gyors kontextusváltás segítségével éri el ugyanezt (ha egy szál futása közben
várni kell a memóriára, akkor a GPU átütemezi a végrehajtóegységeket más szálakhoz)
→ szálak száma legyen jóval nagyobb, mint a végrehajtóegységek száma
1.4. ábra - [5]
Bevezetés
235 Created by XMLmind XSL-FO Converter.
2.7. Memória szerkezete
Összetett memória hierarchia
• CPU-k esetében általában csak a központi memóriát és a regisztereket különböztetjük meg
• CPU-k esetében általában nem a programozó feladata a gyorsítótár kezelése, ezt a CPUra bízhatjuk
• GPU-k esetében ennél jóval összetettebb memória felépítéssel találkozhatunk, amelyek kezelése a
programozó feladata
→ célszerű a gyakran szükséges adatokat betölteni a gyorsabb memóriaterületekre („manuálisan” elvégezni
a gyorsítótár kezelést)
1.5. ábra - [3]
Bevezetés
236 Created by XMLmind XSL-FO Converter.
2.8. SIMT végrehajtás
• Párhuzamosság forrásai (SIMD < SIMT < SMT) [25]
• SIMD esetén vektorok elemei párhuzamosan dolgozódnak fel
• SMT esetén, szálak utasításai párhuzamosan futnak le
• SIMT valahol a kettő között található, egy érdekes hibrid a vektor feldolgozás és a tényleges párhuzamos
szál futtatás között
• SIMD utasítások során a programozó biztosítja, hogy az operandusok a megfelelő helyen és formában
legyenek, a SIMT utasítások során az egyes végrehajtóegységek különböző címtartományokban dolgoznak
Bevezetés
237 Created by XMLmind XSL-FO Converter.
• Van lehetőség feltételes végrehajtásra a SIMT esetében, azonban az ágak szekvenciálisan lesznek
végrehajtva:
→ Próbáljuk elkerülni az elágazásokat és a ciklusokat a GPU kódban
1.6. ábra - [7]
238 Created by XMLmind XSL-FO Converter.
2. fejezet - Programozási modell
1. CUDA környezet alapjai
1.1. CUDA környezet
CUDA – Compute Unified Device Architecture
• A CUDA egy párhuzamos számítások implementálására alkalmas rendszer, amelyet az Nvidia cég fejleszt.
Szabadon elérhető minden fejlesztő számára, illetve a segítségével készített programkódok is korlátozás
nélkül futtathatók. Hasonlít a C/C++ környezetekhez.
Fejlesztésének főbb lépései
• 2007. február – CUDA 1.0
• 2008. február – CUDA 2.0
• 2010. március – CUDA 3.0
• 2011. május – CUDA 4.0
• 2012. október – CUDA 5.0
Támogatott GPU-k
• Nvidia GeForce sorozat
• Nvidia GeForce mobile sorozat
• Nvidia Quadro sorozat
• Nvidia Quadro mobile sorozat
• Nvidia Tesla sorozat
1.2. Szükséges komponensek
• CUDA kompatibilis grafikus meghajtó
• CUDA fordító
A .cu programok fordításához
• CUDA debugger
Nyomkövetéshez
• CUDA profiler
Teljesítmény méréshez
• CUDA SDK
Minta alkalmazások
2.1. ábra -
Programozási modell
239 Created by XMLmind XSL-FO Converter.
CUDA letöltése
• A CUDA környezet letölthető az alábbi helyről:
• https://developer.nvidia.com/cuda-downloads
1.3. CUDA környezet áttekintése
CUDA környezet legfontosabb jellemzői
• a fejlesztés alapvetően C/C++ nyelv segítségével történik mind a hoszt, mind pedig az eszköz oldalon, de
lehetőség van más nyelvek igénybevételére is (pl. Fortran)
• A környezet eleve tartalmaz számos függvénykönyvtárat, amelyek elősegítik a gyors alkalmazásfejlesztést
(FFT, BLAS)
• A környezet felépítéséből adódóan a fejlesztés nem egy konkrét hardverre történik, hanem egy afelett álló
absztrakciós réteg számára. Ez egyszerűbbé teszi a fejlesztés a jövőben megjelenő GPU-kra.
Kódok szétválasztása
• A forráskód tartamazza a hoszt és az eszköz kódját is, ezt a fordító választja szét fordításkor
• A CPU számára generált kód így egy külső, tetszőleges C fordító segítségével fordul le
• A programozó választhat, hogy milyen hoszt oldali fordítót használjon
2.2. ábra - [5]
Programozási modell
240 Created by XMLmind XSL-FO Converter.
1.4. CUDA környezet részei
C nyelvi kiterjesztések
• Különféle kiegészítések a C nyelvhez, amelyek lehetővé teszik a forráskód GPU-n való futtatását
• Függvény módosítók amelyek lehetővé teszik annak meghatározását, hogy az egyes függvények a hoszton
vagy a GPU-n fussanak le, és honnan legyenek meghívhatók
• Változó módosítók amelyek meghatározzák, hogy egy változó pontosan melyik memóriaterületen
foglaljanak helyet
• Új direktíva amelyik jelzi, hogy a kernelt a GPU-n kell elindítani
• Beépített változók amelyek lehetővé teszik a rács és a blokk adatainak lekérdezését, továbbá a rács és szál
indexet is elérhetővé teszik
Futásidejű könyvtár
• A futásidejű könyvtár az alábbi részekből áll:
• Hoszt oldali komponens, amely a hoszton fut és különféle függvényeket biztosít az eszközök kezeléséhez
és eléréséhez
• Eszköz oldali komponens, amely a GPU-n fut és az ott elérhető speciális függvényeket tartalmazza
• Általános komponens, amely tartalmaz beépített típusokat, függvényeket, amelyek mindkét oldalon
elérhetők
1.5. CUDA szoftver rétegek
CUDA API felépítése
Programozási modell
241 Created by XMLmind XSL-FO Converter.
• A CUDA környezet által szolgáltatott szoftverrétegeket egy veremként lehet elképzelni, amely az ábrán
látható három szintből áll
• Az egyes szintek egymásra épülnek, a programozónak lehetősége van bármelyik szinten hozzáférni a
rendszerhez (egyszerre azonban csak egy használata javasolt)
• Minél alacsonyabb szintet választunk, annál több lehetőséggel fogunk rendelkezni az eszköz programozását
tekintve
• A gyakorlatokon a „CUDA Runtime” köztes szintet fogjuk használni, ahol a grafikus kártya lehetőségei már
jól kihasználhatók, de a programozás még meglehetősen egyszerű
2.3. ábra - [5]
1.6. CUDA alapú fejlesztés lépései
Feladat elemzése
• A hagyományos programozási környezetektől eltérően nem csak a feladat megoldásának algoritmusát kell
kidolgozni, hanem ebből ki kell keresni a jól párhuzamosítható területeket is
• A párhuzamosítható/nem párhuzamosítható részek aránya gyakran jól jelzi, hogy érdemes-e nekifogni az
átírásnak
• Gyakran érdemes az első kidolgozott algoritmust átdolgozni aszerint, hogy a feladat még jobban
párhuzamosítható legyen, illetve minél kevesebb memória másolást/kernel hívást igényeljen
Programozási modell
242 Created by XMLmind XSL-FO Converter.
Implementing the C/C++ code
• Bár fizikailag ezek egy forrás állományban találhatók, gyakorlatilag egymástól függetlenül kell elkészíteni a
• kód szekvenciális, CPU-n futó részleteit
• kód párhuzamos, GPU-n futó részleteit
Fordítási folyamat
• Maga a fordítás a különféle segédprogramoknak köszönhetően már nem különbözik jelentősen a
hagyományos C programokban megszokottól (mindezt megoldja az nvcc segédprogram)
2. Fordítás és szerkesztés
2.1. CUDA fordítás lépései
2.1.1. Bemenet
• Egy forrás állomány tartalmazhat CPU, illetve GPU által futtatandó kódokat is (mi esetünkben C/C++ kódot)
2.4. ábra - [2]
Programozási modell
243 Created by XMLmind XSL-FO Converter.
Fordítási folyamat
• Az EDG előfeldolgozó egyszerűen szétválasztja a forrás különböző platformoknak szánt részeit
• A CPU rész fordításához meghívja valamelyik általános C fordítási környezetet (esetünkben VC fordító, de
lehet a GNU C fordító is)
• A GPU rész a CUDA környezet által nyújtott fordító segítségével fordítható le a GPU által futtatható kóddá
2.1.2. Kimenet
Programozási modell
244 Created by XMLmind XSL-FO Converter.
• Az így létrejött állományok kezelhetőek külön, vagy egy futtatható állományon keresztül
2.2. nvcc fordító alapvető paraméterei
Fordítóprogram alapvető használata
• Alapértelmezett helye (Windows 64 bit esetében):
c:\CUDA\bin64\nvcc.exe
• Fordítás indítása:
nvcc [opcionális fordítási paraméterek] bemenet
2.2.1. Fordítás céljának meghatározása
• --compile(-c)
A felsorolt .c, .cc, .cpp, .cxx, .cu állományokat lefordítja object állománnyá
• --link(-link)
A lefordított object állományokból futtatható állományt szerkeszt
• --lib(-lib)
A lefordított object állományokból egy osztálykönyvtárat szerkeszt
• --run(-run)
Futtatható állományt szerkeszt, és azt el is indítja
• --ptx(-ptx)
Csak az eszköz számára írt kódokat fordítja le .ptx állománnyá
2.3. nvcc fordító alapvető paraméterei (2)
Útvonal információk meghatározása
• --output-directory <directory>(-odir)
A kimenő állomány helyének meghatározása
• --output-file <file>(-o)
A kimenő állomány nevének meghatározása
• --compiler-bindir <directory> (-ccbin)
A hoszt kódot kezelő fordító helyének meghatározása. Ez tipikusan lehet
• Microsoft Visual Studio C fordítója (cl.exe)
• valamilyen gcc változat
• --include-path <include-path>(-I)
Az „include” direktíván keresztül elérhető állományok helye
• --library <library>(-l)
A használni kívánt osztálykönyvtárak nevei
Programozási modell
245 Created by XMLmind XSL-FO Converter.
• --library-path <library-path>(-L)
A használni kívánt osztálykönyvtárak helye
2.4. nvcc fordító alapvető paraméterei (3)
Architektúra meghatározása
• --gpu-name <gpu architecture name> (-arch)
A fordítás során milyen hardver számára készüljön az eszköz kód. Ez lehet egy fizikai Nvidia GPU
megjelölés, vagy pedig valamelyik virtuális ptx architektúra.
Lehetséges értékek: 'compute_10', 'compute_11', 'compute_12', 'compute_13',
'sm_10','sm_11','sm_12','sm_13'
Alapértelmezett érték: 'sm_10'
• --gpu-code <gpu architecture name> (-code)
A kód generálás során milyen hardver számára készüljön az eszköz kód. Lehetséges értékei azonosak az –
arch paraméternél megadottakkal, és az ottani választással értelemszerűen összhangban kell lenniük
• --device-emulation(-deviceemu)
A fordító az emulátor számára futtatható kódot készítsen
2.5. nvcc fordító alapvető paraméterei (4)
Egyéb lényeges paraméterek
• --debug (-g)
A hoszt kód tartalmazzon nyomkövetési információkat is
• --optimize<level>(-O)
A hoszt kód optimalizációs szintjének meghatározása (hasonlóan a C fordítóknál megszokott szintekhez)
• --verbose(-v)
A fordítás során láthatóak legyenek a végrehajtott fordítási parancsok
• --keep (-keep)
A fordítást követően a fordító ne törölje le az ideiglenes állományokat (pl. a lefordított .ptx állományokat)
• --host-compilation <language>
Meghatározza a hoszt kódban használt programozási nyelvet.
Lehetséges értékei: 'C','C++','c','c++'
Alapértelmezett érték: 'C++'.
2.6. Példa parancssori fordításra
2.5. ábra -
Programozási modell
246 Created by XMLmind XSL-FO Converter.
2.7. Fordítás áttekintése
2.6. ábra -
3. Platform modell
3.1. CUDA platform modell
Eszközök meghatározása
• A 2.3.1 ábrán látható módon a CUDA környezet feltételezi, hogy az általa kezelt szálak egy független
egységen futnak le
• Ennek megfelelően meg kell különbözteti a gazdagépet (hoszt), amely a szálak, memória műveletek
kezeléséért felelős, illetve magát az eszközt (device), amely a CUDA szálak végrehajtásáért felelős
Asynch execution
Programozási modell
247 Created by XMLmind XSL-FO Converter.
• Bár az ábrán ezek egymást követő atomi lépésekként jelennek meg, a gyakorlatban általában lehetőség van
arra, hogy a két végrehajtó egység egyidőben futtasson programokat
2.7. ábra - [5]
Programozási modell
248 Created by XMLmind XSL-FO Converter.
Programozási modell
249 Created by XMLmind XSL-FO Converter.
3.2. CUDA platform modell (2)
Az eszközök felépítése
• A 2.3.2-es ábra mutatja egy CUDA kompatibilis eszköz elvi felépítését
• Minden eszköz tartalmaz egy, vagy több multiprocesszort, amelyek tartalmaznak egy, vagy több SIMT
végrehajtóegységet
Multiprocesszorok felépítése
• SIMT végrehajtóegységek
• A processzorok saját regiszterei
• Az egyes processzorok által közösen kezelhető megosztott memória
• Csak olvasható konstans, illetve textúra gyorsítótár
2.8. ábra - [5]
Programozási modell
250 Created by XMLmind XSL-FO Converter.
3.3. Hozzáférés az eszközökhöz
Number of CUDA compatible devices
• A cudaGetDeviceCount nevű eljárás segítségével lehet lekérdezni a CUDA alkalmazások futtatására alkalmas
eszközök számát
2.9. ábra -
Programozási modell
251 Created by XMLmind XSL-FO Converter.
• Az eljárás a cím szerint átadott deviceCount változóba helyezi el a CUDA kompatibilis eszközök
darabszámát
1. int deviceCount;
2. cudaGetDeviceCount(&deviceCount);
3.3.1. CUDA eszköz kiválasztása
• Az első eszközöket érintő művelet előtt ki kell választani egy eszközt, ezt a cudaSetDevice függvény
segítségével lehet elérni, aminek paramétere a kiválasztani kívánt eszköz sorszáma (0 – első eszköz)
2.10. ábra -
• Amennyiben explicit módon nem történik meg az eszközök kiválasztása, a keretrendszer automatikusan a 0
sorszámú eszközt fogja használni
• A kiválasztás a műveletet lefuttató hoszt szálra globálisan érvényes lesz
3.4. Eszközök adatai
• A CUDA osztálykönyvtár tartalmaz egy cudaDeviceProp nevű struktúrát, amely egy eszköz részletes adatait
tárolja. Ennek főbb mezői az alábbiak:
2.11. ábra -
3.5. Eszközök adatainak lekérdezése
Az eszközök adataihoz való hozzáférés
A cudaGetDeviceProperties nevű eljárás segítségével lehet lekérdezni egy megadott eszköz részletes adatait.
Programozási modell
252 Created by XMLmind XSL-FO Converter.
Az eljárás első paramétere egy előző oldalon megismert cudaDeviceProp struktúra címszerinti
paraméterátadással átadva, a második paramétere pedig az eszköz sorszáma, amelyről az adatokat le kell
kérdezni (a számozás 0-tól indul)
2.12. ábra -
3.5.1. Feladat 2.3.1
Írjuk ki a képernyőre az elérhető eszközök számát, illetve egy listában ezen eszközök neveit. A felhasználó
választhasson ezek közül egyet, majd listázzuk ki a képernyőre a kiválasztott eszköz részletes adatait (órajel,
memóriaméret, blokkméret stb.)
4. Memória modell
4.1. CUDA memória modell
Rendelkezésre álló memóriaterületek
• Szál szinten
• Saját regiszterek (Írható/Olvasható)
• Lokális memória (Írható/Olvasható)
• Blokk szinten
• Megosztott memória (Írható/Olvasható)
• Konstans memória (Olvasható)
• Rács szinten
• Globális memória (Írható/Olvasható)
• Textúra memória (Olvasható)
4.1.1. Kapcsolat a hoszttal
• A felsorolt memóriaterületek közül a hoszt csak a globális, a konstans és a textúra memóriához fér hozzá.
Tehát ezeken keresztül kell megoldani az eszközzel való kommunikációt (bemenő adatok, kimenő adatok
másolása)
2.13. ábra - [5]
Programozási modell
253 Created by XMLmind XSL-FO Converter.
4.2. CUDA memória modell – globális memória
Jellemzői
• Élettartama megegyezik az alkalmazás élettartamával
• Minden blokk minden száljából elérhető
• Accessible for the host
• Elérhető a hoszt számára is
• Elérhető a hoszt számára is
• Írható, olvasható
• Nagy méretű
• Meglehetősen lassú
Deklaráció
• Egy változó globális memóriába való elhelyezéséhez a __device__ kulcsszó használata szükséges
• Példa
2.14. ábra -
Programozási modell
254 Created by XMLmind XSL-FO Converter.
2.15. ábra - [5]
4.3. CUDA memória modell – konstans memória
Jellemzői
• Élettartama megegyezik az alkalmazás élettartamával
• Minden blokk minden száljából elérhető
• Elérhető a hoszt számára is
• Hoszt számára írható, olvasható
• Szálak számára csak olvasható
• Gyorsítótár miatt gyorsan kezelhető
Deklaráció
• Egy változó konstans memóriába való elhelyezéséhez a __constant__ kulcsszó használata szükséges
• Példa
2.16. ábra -
Programozási modell
255 Created by XMLmind XSL-FO Converter.
2.17. ábra - [5]
4.4. CUDA memória modell – textúra memória
Jellemzői
• Élettartama megegyezik az alkalmazás élettartamával
• Minden blokk minden száljából elérhető
• Elérhető a hoszt számára is
• Hoszt számára írható, olvasható
• Szálak számára csak olvasható
• Kezelése nem a szokásos bájt tömb alapú, hanem grafikai műveletekhez optimalizált
Deklaráció
• Részletesen nem tárgyaljuk
2.18. ábra - [5]
Programozási modell
256 Created by XMLmind XSL-FO Converter.
4.5. CUDA memória modell – megosztott memória
Jellemzői
• Élettartama megegyezik az őt tartalmazó blokk élettartamával
• Csak az őt tartalmazó blokk száljaiból érhető el
• Csak egy szálak közti szinkronizáció után garantálható a helyes tartalma
• Írható és olvasható
• Nagy sebességű hozzáférést tesz lehetővé
• Mérete meglehetősen korlátozott
Deklaráció
• A __shared__ kulcsszóval lehet kiválasztani ezt a területet
• Példa
2.19. ábra -
Programozási modell
257 Created by XMLmind XSL-FO Converter.
2.20. ábra - [5]
4.6. CUDA memória modell – regiszterek
Jellemzői
• Élettartama megegyezik a hozzá tartozó szál élettartamával
• Csak az őt tartalmazó szálból érhető el
• Írható és olvasható
• Nagy sebességű hozzáférést tesz lehetővé
• Nem dedikáltak a regiszterek, hanem egy regiszterhalmazból kerülnek kiosztásra
Deklaráció
• Az eszközön létrehozott változók, ha más direktíva ezt nem módosítja, mind a regiszterekbe kerülnek (ha van
hely)
• Példa
2.21. ábra -
Programozási modell
258 Created by XMLmind XSL-FO Converter.
2.22. ábra - [5]
4.7. CUDA memória modell – lokális memória
Jellemzői
• Élettartama megegyezik a hozzá tartozó szál élettartamával
• Csak az őt tartalmazó szálból érhető el
• Írható és olvasható
• Lassú, nagy méretű memóriaterület
4.7.1. Deklaráció
• Tulajdonképpen a regiszterekhez hasonló módon kezelendők
• Amennyiben a regiszterek közt már nincs hely a változó számára, akkor azok automatikusan a lokális
memóriába kerülnek elhelyezésre
• Példa
Programozási modell
259 Created by XMLmind XSL-FO Converter.
2.23. ábra -
2.24. ábra - [5]
4.8. Memória modell fizikai leképezése
Dedikált hardver memória
• Ide képződnek le a
• regiszterek,
• megosztott memória
• 1 órajelciklus alatt elérhető
Eszköz memória, gyorsítótár nélkül
• Ide képződnek le a
• lokális memóriába került változók,
• globális memória
Programozási modell
260 Created by XMLmind XSL-FO Converter.
• Kb. 100 órajelciklus alatt elérhető
2.25. ábra - [5]
Eszköz memória, gyorsítótárral
• Ide képződnek le a
• konstans memória,
• textúra memória,
• utasítás memória
Programozási modell
261 Created by XMLmind XSL-FO Converter.
• 1-10-100 órajelciklus alatt elérhető
4.9. Memory handling
Statikus módon
• Változók a C nyelvben megszokott módon deklarálandók
• Az előzőekben megismert kulcsszavak segítségével lehet meghatározni, hogy a változó pontosan milyen
memóriaterülen jöjjön létre (__device__, __constant__ stb.)
• A változóra a C nyelvben megszokott módon egyszerűen a nevével lehet hivatkozni, azokkal tetszőleges
művelet végezhető
Dinamikus módon
• A CUDA osztálykönyvtár által megadott memóriakezelő függvények segítségével lehet a memóriaterületeket
kezelni
• terület lefoglalása
• terület másolása
• terület felszabadítása
• A memóriaterületre egy mutató segítségével lehet hivatkozni
• A mutató használata megfelel a C nyelvben megismerteknek, azonban fontos figyelembe venni, hogy két
külön címtartomány tartozik a rendszer, illetve az eszköz memóriához, a két tartományban létező mutatók
nem keverhetők össze
4.10. Memória területek elérhetőség szerint
Az alábbi ábra összefoglalja, hogy az egyes memóriaterületek milyen szinteken érhetők el
2.26. ábra -
A táblázat tartalmazza, hogy az egyes memóriaterületek az egyes szinteken milyen módon érhetők el
2.27. ábra -
Programozási modell
262 Created by XMLmind XSL-FO Converter.
4.11. Dinamikus memóriakezelés – foglalás
Lineáris memória foglalás
• A hoszt kódjában tetszőleges helyen van lehetőség memóriaterületet foglalni az eszköz memóriájában
• Erre használható a cudaMalloc függvény, amelynek paraméterei:
• címszerinti paraméterként átadva egy mutató, amely majd a lefoglalt területre fog mutatni
• lefoglalni kívánt terület mérete bájtban megadva
• Például egy 256 darab lebegőpontos számot tárolni képes vektor lefoglalása:
2.28. ábra -
4.11.1. Memória felszabadítás
• A cudaFreeArray eljárás segítségével van lehetőség felszabadítani az eszköz memóriájában lefoglalt
területeket
• A függvény paramétere a felszabadítandó területre mutató pointer
2.29. ábra -
4.12. Memória területek közötti másolás
• A cudaMemcpy függvény segítségével van lehetőség a különböző memóriaterületek közötti másolásokra
• Szükséges paraméterek:
• Cél mutató
• Forrás mutató
• Másolandó bájtok száma
• Másolás iránya
• Másolás iránya lehet:
• hoszt → hoszt
(cudaMemcpyHostToHost)
• hoszt → eszköz
(cudaMemcpyHostToDevice)
• eszköz → hoszt
Programozási modell
263 Created by XMLmind XSL-FO Converter.
(cudaMemcpyDeviceToHost)
• eszköz → eszköz
(cudaMemcpyDeviceToDevice)
2.30. ábra -
2.31. ábra - [5]
4.13. Rögzített memória (pinned memory)
• A hoszt oldalon van lehetőség rögzített memória lefoglalására. Ez azt jelenti, hogy ez a terület mindig
fizikailag a memóriában marad, így a GPU a CPU kihagyásával is hozzáférhet
• A nem rögzített memória területek átkerülhetnek a swap területre (gyakorlatilag a merevlemezre), így ezeknél
a közvetlen hozzáférés nem megengedett, az betöltési problémákat okozhatna
• Aszinkron memória átvitelhez a hoszt memóriát is az alábbi CUDA függvényekkel kell lefoglalni:
• cudaHostAlloc()
• cudaFreeHost()
Programozási modell
264 Created by XMLmind XSL-FO Converter.
• Ezek számos előnnyel járnak:
• Másolás a rögzített memória és az eszköz memória között párhuzamosan is folyhat valamilyen kernel
futtatással
• Néhány GPU esetében a rögzített memória olyan helyre is kerülhet, ahol maga a GPU is elérheti
• Bizonyos rendszerek esetében a memória átvitel sebessége is megnövekedhet ezekben az esetekben
• Természetesen a operációs rendszer számára ez jelentős megszorítást jelent, mivel fizikailag jóval kevesebb
memóriával tud gazdálkodni. Emiatt túl sok rögzített memória foglalása ronthatja a rendszer teljes
teljesítményét.
4.14. Másolás nélküli memória (zero-copy memory)
• A rögzített memória egy speciális változata a másolás nélküli memória. Ebben az esetben nincs szükség
átvitelre a hoszt és az eszköz memória között, ezt a memóriaterületet mindketten elérik
• Gyakran leképezett memóriának is nevezik (mapped memory) mivel ebben az esetben a központi memória
egy része lett leképezve a CUDA címtérbe
• Hasznos abban az esetben, ha
• A GPU-nak nincs saját memóriája, hanem a rendszer memóriát használja
• A hoszt hozzá akar férni az adatokhoz még a kernel futása alatt
• Az adat nem fér el a GPU memóriájában
• Elég sok számítást tudunk indítani, ami elrejti a memória hozzáférésból adódó késedelmet
• Ezt a memóriát megosztja a hoszt és a GPU, emiatt az alkalmazást szinkronizálni kell az események
segítségével
• A CUDA eszköz jellemzők közül kiolvasható, hogy a megadott eszköz támogatja-e ezt a funkciót:
canMapHostMemory = 1 ha elérhető
Mozgatható rögzített memória
• Ez a memória típus mozgatható az egyes szálak között (több GPU esetében van szerepe)
5. Végrehajtási modell
5.1. CUDA végrehajtási modell - szálak
• Minden szál rendelkezik egy egyedi azonosítóval, célszerűen ez az azonosító használható arra, hogy
kijelöljük a szál által feldolgozandó adatsort
• A szál azonosító lehet
• 1 dimenziós
• 2 dimenziós (lásd az ábrán)
• 3 dimenziós
• A kernel kódjában a szál azonosítója elérhető a threadIdx (thread index) nevű változón keresztül
• Többdimenziós azonosító esetén ez a változó egy struktúrát tartalmaz, aminek elemeihez a threadIdx.x,
threadIdx.y, threadIdx.z mezőkön keresztül lehet hozzáférni
2.32. ábra -
Programozási modell
265 Created by XMLmind XSL-FO Converter.
5.2. CUDA blokkok
• Az eszközök egyszerre csak korlátozott számú szál futtatására alkalmasak, ami egy nagyobb adattér
párhuzamos feldolgozásához már kevés lehet (pl. max 512 szál ↔ 100x100 mátrix = 10000 elem)
• Az eszköz emiatt a teljes adatteret felbontja blokkokra (block), amelyeket egymástól függetlenül (egymás
után vagy több multiprocesszor esetén akár párhuzamosan) dolgoz fel
• A blokkok által alkotott hierarchiát nevezzük rácsnak (grid)
Blokkokra bontás módja
• A CUDA alkalmazások esetén a szálak indítása és felparaméterezése nem a programozó feladata, mindezt a
keretrendszer hajtja végre, ennek megfelelően a blokkok létrehozását, a szálak blokkokba rendelését szintén a
keretrendszer végzi el
• A felhasználó a felbontásba az alábbi paraméterek segítségével tud csak beavatkozni:
• indítani kívánt szálak száma egy blokkon belül (1,2,3 dimenziós)
• blokkok száma a rácsban (1,2 dimenziós)
5.3. Blokkok azonosítása
• Az egyes szálak blokkokba vannak rendezve, amelyek szintén saját azonosítóval rendelkeznek
• Ez az azonosító lehet
• 1 dimenziós
• 2 dimenziós (lásd az ábrán)
• 3 dimenziós (Fermi és utána)
Programozási modell
266 Created by XMLmind XSL-FO Converter.
• A kernel kódjában a blokk azonosítója elérhető a blockIdx (block index) nevű változón keresztül,
többdimenziós esetben használható a blockIdx.x, blockIdx.y forma
• Egy kernel indítás esetén a blokkok mérete mindig azonos, ez elérhető a blockDim változón keresztül
(többdimenziós esetben ennek mezői blockDim.x, blockDim.y, blockDim.z)
2.33. ábra - [5]
5.4. Globális – lokális index
5.4.1. Lokális azonosító
• Minden szál rendelkezik egy lokális azonosítóval, ami nem más, mint az előzőleg megismert threadIdx
változó által tárolt érték.
Programozási modell
267 Created by XMLmind XSL-FO Converter.
• Ez tulajdonképpen a szál helye az őt tartalmazó blokkon belül
• A blokkon belüli első szál azonosítója a dimenziótól függően 0, [0,0], [0,0,0]
5.4.2. Globális azonosító
• Amennyiben futtatás során nem csak egy, hanem több blokk is létrejött, a lokális azonosítók már nem tudják
egyértelműen azonosítani a szálat
• Mivel azonban ismert a szálat tartalmazó blokk azonosítója (az előzőleg megismert blockIdx változó
tartalmazza), illetve ismert a blokkok mérete (blockDim), egyszerűen kiszámítható a szál globális
azonosítója:
Pl. Globalis_x_komponens = blockIdx.x * blockDim.x + threadIdx.x
• A kernel indításakor nincs lehetőség az egyes szálakhoz különböző paraméterek eljuttatására (pl. a mátrix
hányadik elemét dolgozzák fel), emiatt az egyes szálak lefutása közötti különbségeket csak a globális
azonosító használatával érhetjük el
5.5. Néhány alapvető összefüggés
Bemenő adatok
• Indextér mérete: Gx, Gy
(értelemszerűen származik a problématér méretéből)
• Blokkok mérete: Sx, Sy
(az eszköz által nyújtott lehetőségeknek megfelelő érték)
• Szálak száma: Gx * Gy
• (ennyiszer fog lefutni a megadott kernel)
• Globális azonosító: (0..Gx - 1, 0..Gy – 1)
(az egyes szálak és az így meghatározott indextér elemei között egy-egy megfeleltetés jön létre)
• Blokkok száma: (Wx, Wy) = ((Gx – 1)/ Sx+ 1, (Gy – 1)/ Sy + 1)
(megadott blokkméret mellett hány blokkra van szükség)
• Globális azonosító: (gx, gy) = (wx * Sx + sx, wy * Sy + sy)
• Lokális azonosító: (wx, wy) = ((gx – sx) / Sx, (gy – sy) / Sy)
5.6. CUDA végrehajtási modell – kernel
• Egy CUDA alapú kernel első ránézésre egy egyszerű C függvénynek tűnik, attól azonban különbözik néhány
lényeges vonásban:
• speciális kulcsszavak különböztetik meg a szokásos C függvényektől
• különféle speciális változók használhatók a függvény törzsében (a már megismert szál, blokk azonosítók)
• közvetlenül nem hívhatók meg a hoszt gép kódjából
Függények megjelölésére szolgáló kulcsszavak
• __device__
• Futás helye: eszköz
Programozási modell
268 Created by XMLmind XSL-FO Converter.
• Meghívás helye: eszköz
• __global__
• Futás helye: eszköz
• Meghívás helye: hoszt
• __host__
• Futás helye: hoszt
• Meghívás helye: hoszt
5.7. CUDA végrehajtási modell – kernel indítása
• A hoszt bármikor meghívhat egy kernelt az alábbi szintaxis szerint:
Függvénynév<<<Dg, Db, Ns, S>>>(paraméterek)
ahol:
• Dg – rács méret
• Egy dim3 típusú struktúra, amely megadja a létrehozandó rács méretét
Dg.x * Dg.y = létrejövő blokkok száma
• Szintén egy dim3 típusú struktúra, amely megadja az egyes blokkok méretét
Dg.x * Dg.y * Dg.z = egy blokkon belül a szálak száma
• Ns – megosztott memória mérete (elhagyható)
Egy size_t típusú változó, amely megadja, hogy blokkonként mekkora megosztott memóriát kell lefoglalni a
futtatáskor
• S – csatorna (elhagyható)
• Egy cudaStream_t típusú változó, amely egy csatornához (stream) rendeli a hívást
5.8. Kernel indítással kapcsolatos típusok
dim3 type
• A kernel indításakor mind a rácsra, mind pedig a blokkokra vonatkozóan meg kell adni egy méretet. A rács
esetében ez 1 vagy 2, a blokkok esetében pedig 1, 2 vagy 3 dimenziós méreteket jelenthet
• A könnyű kezelhetőség érdekében bevezették a dim3 struktúrát, amelynek segítségével egyszerűen meg lehet
adni ezeket az értékeket.
• Az alábbi példa bemutatja ennek használatát 1, 2 illetve 3 dimenzió esetében
2.34. ábra -
Programozási modell
269 Created by XMLmind XSL-FO Converter.
size_t type
• Memóriaméretek megadásakor használatos típus, platformtól függő, de alapvetően egy előjel nélküli egész
szám
cudaStream_t típus
• Egy csatorna azonosítója, tulajdonképpen egy egész szám
5.9. Kernel implementálása
• Az alábbi példa egy egyszerű kernelt mutat be, amely egy vektor minden elemét megszorozza kettővel:
2.35. ábra -
• A __global__ kulcsszó jelzi, hogy az eszközön futtatandó a függvény
• Kernel esetében nincs értelme a visszatérési értéknek
• A függvény neve vectorMul
• A függvény egy paraméterrel rendelkezik, egy float tömb kezdőcímével
• Látható, hogy nem a kernel tartalmazza azt, hogy hányszor fog lefutni, hanem majd az indításakor megadott
paraméterek határozzák meg
• Szintén látható, hogy a kernel (mivel nem kaphat csak neki szánt paramétereket) a szál azonosító (threadIdx)
alapján választja ki azt, hogy melyik számot kell megszoroznia
5.10. Kernel elindítás példa
• A legegyszerűbb esetben, ha a feldolgozandó elemek száma nem nagyobb, mint a maximális blokkméret,
1x1-es rácsméret mellett is elindítható az előző kernel
• We use 1x1 grid size (first parameter)
• A megadott paramétereknek megfelelően tehát az eszközön 1 blokk fog létrejönni, ami összesen 200 darab
szálat fog tartalmazni.
2.36. ábra -
• A megadott paramétereknek megfelelően tehát az eszközön 1 blokk fog létrejönni, ami összesen 200 darab
szálat fog tartalmazni.
Programozási modell
270 Created by XMLmind XSL-FO Converter.
• Mivel egydimenziós adatok lettek megadva, így a szálak lokális azonosítói is ennek megfelelően jönnek létre:
0 .. 199 között lesznek
• Az egyetlen létrejött blokk azonosítója 0 lesz
• A kernelben lekérdezhető blokk méret pedig 200 lesz
5.11. Blokkokat kezelő kernel implementálása
• Amennyiben pl. 1000 darab elemet kell megszorozni, ami meghaladná az eszközünk által kezelhető szálak
számát, blokkokat kezelő kernel kell:
2.37. ábra -
• Tehát ha nem csak egy blokk jött létre, hanem több, akkor a szál által feldolgozandó elem címének
meghatározásakor a teljes globális címet kell használni
• Az eljárásban szereplő feltételre csak akkor van szükség, ha a teljes elemszám nem osztható a blokkmérettel.
Ebben az esetben ugyanis (mivel a blokkok mérete mindig azonos) az utolsó blokk túlnyúlik a tényleges
indextéren, így az utolsó szálak túlcímeznék a vektort
5.12. Blokkokat kezelő kernel indítás példa
• Amennyiben 1000 db elemet kell feldolgozni, és a maximális blokkméret 512, célszerű lehet az alábbi
kernelhívást alkalmazni:
2.38. ábra -
• Ebben a példában 4 blokk jön majd létre (0,1,2,3 azonosítóval) és minden blokkon belül 250 szál (0..249
lokális indexekkel)
• Amennyiben a fordításkor még nem ismert a vektorok elemszáma, az alábbi képletekkel egyszerűen
kiszámolhatók a hívási paraméterek (N – vektorok mérete, BM – választandó blokkméret)
• blokkok száma : (N-1) / BM + 1
• blokkméret : BM
5.13. Teljes alkalmazás elkészítése
Programozási modell
271 Created by XMLmind XSL-FO Converter.
5.13.1. Feladat 2.5.1
Az eddig tanultakat felhasználva készítsünk CUDA programot, ami végrehajta az alábbiakat:
• Listázza a CUDA kompatibilis eszközök nevét a képernyőre
• A felhasználó ezek közül tudjon egyet választani
• Foglaljon le egy N méretű vektort (A)
• Töltse fel az A vektort tetszőleges adatokkal
• Másolja át ezeket az adatokat a grafikus kártya memóriájába
• Indítson el egy kernelt, ami kiszámítja az A = A * 2 eredményt
Ehhez N darab szálat és BlockN méretű blokkot használjon
• Másolja vissza a A vektor értékét a központi memóriába
• Írja ki az így kapott A vektor elemeinek értékét a képernyőre
272 Created by XMLmind XSL-FO Converter.
3. fejezet - Programozási környezet
1. Visual Studio használata
1.1. Visual Studio lehetőségek
• A legutolsó CUDA verziók támogatják a Visual Studio 2008/2010-at
• Telepítés után, néhány új CUDA funkció jelenik meg a Visual Studioban
• New project wizard
• Custom build rules
• CUDA syntax highlighting
• Stb.
1.1.1. New project wizard
• Select File/New/Project/Visual C++/CUDA[64]/CUDAWinApp
• Válasszuk a “Next” gombot a megjelenő képernyőn
3.1. ábra -
1.2. New project wizard
• Ki ki választani az alkalmazás típusát, ami az alábbiak közül lehet valamelyik:
Programozási környezet
273 Created by XMLmind XSL-FO Converter.
• Windows application
• Console application – példáinkban ezt fogjuk használni
• DLL
• Static library
• Fejléc állományok
• ATL
• MFC
• További beállítások
• Empty project
• Export symbols
• Precompiled header
• Kattintsunk a “Finish” gombra az új üres CUDA project generálásához
3.2. ábra -
1.3. Custom build rules
• A project nevén jobb kattintás után “Custom build rules”-t választva
• Megjelenik egy vagy több saját CUDA fordítási szabály
Programozási környezet
274 Created by XMLmind XSL-FO Converter.
• Ezek közül kell kiválasztani a megfelelőt az alapján, hogy
• Runtime API vagy Driver API
• CUDA verzió
3.3. ábra -
1.4. CUDA-val kapcsolatos project beállítások
• “Project properties” listából kiválasztható a “CUDA Build Rule” sor
• Több fülön számos beállítás jelenik meg (debug symbols, GPU arch., etc.)
• Az nvcc fordítónál már tárgyalt beállítások jelennek meg itt is
• A “Command Line” fül mutatja a használt beállításokat
3.4. ábra -
Programozási környezet
275 Created by XMLmind XSL-FO Converter.
2. Számítási képességek
2.1. Számítási képességek (1)
• Az eszközök folyamatos fejlesztése nem csak a sebesség és a végrehajtó egységek számának növelésében
jelenik meg, hanem gyakran az egész architektúrát is érintő változások is bekövetkeztek. Az egyes eszközök
által támogatott funkciókat a „számítási képesség” azonosító mutatja
• Compute capability 1.0
• blokkonként a szálak maximális száma 512
• blokkok maximális mérete dimenziónként 512 x 512 x 64
• rács maximális mérete dimenziónként 65535 x 65535
• multiprocesszoronként a blokkok száma maximum 8
• multiprocesszoronként a warpok száma maximum 24
• multiprocesszoronként a szálak száma maximum 768
• multiprocesszoronként a regiszterek száma 8K
• multiprocesszoronként a megosztott memória mérete 16KB
• egy multiprocesszor 8 végrehajtó egységet tartalmaz
• egy warp mérete 32 szál
• Compute capability 1.1
• 32 bites atomi műveletek támogatása a globális memóriában
Programozási környezet
276 Created by XMLmind XSL-FO Converter.
2.2. Számítási képességek (2)
• Compute capability 1.2
• 64 bites atomi műveletek támogatása a globális és a megosztott memóriában
• warp szavazás funkciók
• multiprocesszoronként a regiszterek száma maximum 16K
• multiprocesszoronként a warpok száma maximum 32
• multiprocesszoronként a szálak száma maximum 1024
• Compute capability 1.3
• duplapontosságú lebegőpontos számok támogatása
• Compute capability 2.0
• blokkonként a szálak maximális száma 1024
• blokkok maximális mérete dimenziónként 1024 x 1024 x 64
• multiprocesszoronként a warpok száma maximum 32
• multiprocesszoronként a szálak száma maximum 1536
• multiprocesszoronként a regiszterek száma maximum 32K
• multiprocesszoronként a megosztott memória mérete 48KB
2.3. Számítási képességek (3)
• Compute capability 3.0
• atomi műveletek 64 bites egészekkel a megosztott memóriában
• atomi műveletek 32 bites lebegőpontos számokkal a globális és megosztott memóriában
• __ballot()
• __threadfence_system()
• __syncthreads_count()
• __syncthreads_and()
• __syncthreads_or()
• felszíni függvények
• 3D rács a blokkok számára
• multiprocesszoron belül a blokkok száma 16
• multiprocesszoron belül a warpok száma 64
• multiprocesszoron belül a 32 bites regiszterek száma 64K
• 3D rács a blokkok számára
• Compute capability 3.5
Programozási környezet
277 Created by XMLmind XSL-FO Converter.
• Funnel Shift műveletek
• 32 bites regiszterek száma szálanként 255
• Number of 32-bit registers per multiprocessor is 64K
2.4. Compute capability (4)
• Compute capability 3.5
• Funnel Shift műveletek
• Maximum number of 32-bit registers per thread is 255
2.5. Néhány Nvidia GPU számítási képessége
3.5. ábra -
2.6. Néhány Nvidia GPU számítási képessége
3.6. ábra -
Programozási környezet
278 Created by XMLmind XSL-FO Converter.
• További részletes adatok az alábbi oldalon:
http://en.wikipedia.org/wiki/Comparison_of_Nvidia_graphics_processing_units
3. CUDA nyelvi kiterjesztés
3.1. CUDA language extensions
• Egy CUDA alkalmazás fejlesztése hasonlít egy C vagy C++ alkalmazás fejlesztéséhez. A fejlesztő számára a
fordító munkája szinte láthatatlan, egy forráskód tartalmazza a hoszt és az eszköz számára szánt kódokat
• A kernelek készítése, illetve azok hoszt általi kezelése igényelnek néhány speciális műveletet, ezek azonban
szintén a C szintaxisnak megfelelő (hasonló) módon jelennek meg a kódban
• CUDA alkalmazást a C illetve a C++ szintaxisnak megfelelően is fejleszthetünk, mi a gyakorlatokon a C
formát részesítjük előnyben
A CUDA API három szintje
• A CUDA programból elérhető kiterjesztéseket (függvények, típusok, kulcsszavak) célszerűen az elérhetőségi
kör szerint csoportosíthatjuk:
• csak a hoszt számára elérhető elemek
• csak az eszköz számára elérhető elemek
• mindkét oldalon elérhető elemek
3.2. Mindkét oldalon elérhető típusok
Beépített vektor típusok
• Az alábbi beépített típusok elősegítik a vektorokkal való munkát:
• char1, uchar1, char2, uchar2, char3, uchar3, char4, uchar4
• short1, ushort1, short2, ushort2, short3, ushort3, short4, ushort4
• int1, uint1, int2, uint2, int3, uint3, int4, uint4
• long1, ulong1, long2, ulong2, long3, ulong3, long4, ulong4
• float1, float2, float3, float4, double2
• Értelemszerűen pl. az int4, egy 4 darab int típusú elemet tartalmazó vektor
• A vektorok egyes komponensei az x, y, z, w mezőkön keresztül érhetők el (a vektor dimenziójának
megfelelően)
• A vektorok rendelkeznek egy make_típus nevű konstruktor függvénnyel pl. Pl. int2 make_int2(int x, int y)
3.2.1. dim3 típus
• A blokkok, rácsok méretének megadásakor használt típus
• Hasonló az uint3 típushoz, azonban létrehozásakor a nem definiált mezők értéke automatikusan 1 lesz
3.3. Mindkét oldalon elérhető függvények
Matematikai függvények
Programozási környezet
279 Created by XMLmind XSL-FO Converter.
• A kernelek az eszközön fognak lefutni, így ezekben értelemszerűen nem használható a C-ben megismert
függvények többsége (I/O műveletek, összetett függvények stb.)
• A matematikai függvények egy jelentős része azonban elérhető a kernel oldalon is
• alapvető aritmetika
• szögfüggvények
• logaritmus, gyökvonás stb.
Időméréssel kapcsolatos függvények
• A clock függvény segítségével célszerű mérni a kernelek futásidejét, szignatúrája:
clock_t clock
• Az eszköz kódjában lefuttatva egy folyamatosan növekvő (órajel frekvenciának megfelelően) számláló
aktuális értékét adja vissza
• Csak az eltelt időre enged következtetni, nem a kernelben lévő utasítások végrehajtására fordított tényleges
ciklusok számára
3.4. Csak eszköz oldalon elérhető változók
gridDim
• Típusa: dim3
• Az aktuális szálat tartalmazó rács mérete
blockIdx
• Típusa: uint3
• Az aktuális szálat tartalmazó blokk poziciója a rácsban
blockDim
• Típusa: dim3
• Az aktuális szálat tartalmazó blokk mérete
threadIdx
• Típusa: uint3
• Az aktuális szál poziciója az őt tartalmazó blokkban
warpSize
• Típusa: int
• Warp méret
3.5. Csak eszköz oldalon elérhető függvények
Gyors matematikai függvények
• Az alábbi gyors matematikai függvények elérhetők az eszköz kódjában:
• __fdividef__sinf, __cosf, __tanf, __sincosf, __logf, __log2f, __log10f, __expf, __exp10f, __powf
Programozási környezet
280 Created by XMLmind XSL-FO Converter.
• Az eszközön használhatók a hagyományos matematikai függvények is, ezekhez képest a fenti változatokra
általában jellemző:
• gyorsabbak, mivel kihasználják a hardver által nyújtott lehetőségeket
• kisebb pontosságot garantálnak
Blokkon belüli szinkronizáció
• A kernel kódjában van lehetőség az egy blokkon belüli szálakra vonatkozó hardveres szinkronizációra. Ennek
formája:
void __syncthreads()
• hatása: a függvényt lefuttató szálak blokkolódnak egészen addig, amíg a blokkon belül található összes szál
le nem futtatja a függvényt
• hatóköre: csak egy blokkon belül található szálakra vonatkozik
• Elágazásokban is használható, de lényeges, hogy minden szál eljusson a szinkronizációig, különben a teljes
futtatás blokkolódhat
Atomi műveletek
• Az atomi műveletek egész számokon végeznek el műveleteket, amelyek során garantálják az olvasás-
módosítás-írás atomiságát:
atomicAdd, atomicSub, atomicExch, atomicMin, atomicMax, atomicInc, atomicDec, atomicCAS, atomicAnd,
atomicOr, atomicXor
• Használhatók a megosztott és a globális memóriában is
• Működési elvükből kifolyólag meglehetősen rontják a párhuzamos algoritmusok hatékonyságát
Warp szavazási funkciók
• Csak 1.2-es számítási képesség felett érhetők el
• int __all(int condition
Az összes szál kiértékeli a feltételt, a visszatérési értéke pedig csak akkor nem 0, ha mindegyik kiértékelés
igazat adott vissza
• int __any(int condition)
Az összes szál kiértékeli a feltételt, a visszatérési értéke pedig csak akkor nem 0, ha legalább az egyik
kiértékelés igazat adott vissza
3.6. Csak hoszt oldalon elérhető függvények
Már megismert műveletek
• Eszközöket kezelő műveletek
• Lásd előző diák
• Kontextusokat kezelő műveletek
• Lásd előző diák
• Memóriát kezelő műveletek
• Lásd előző diák
Programozási környezet
281 Created by XMLmind XSL-FO Converter.
• Program modulokat kezelő műveletek
• Lásd előző diák
• Kernelek végrehajtásához kapcsolódó műveletek
• Lásd előző diák
Hibakezelés
• cudaError_t cudaGetLastError()
Visszaadja az utolsó hiba kódját
• Const char* cudaGetErrorString(cudaError_t error)
Visszaadja az átadott hibakódhoz tartozó szöveges leírást
4. Aszinkron konkurens végrehajtás
4.1. Stream-ek
• Az alkalmazások a stream-eken keresztül kezelik a konkurens végrehajtást
• Egy stream tulajdonképpen parancsok sorozatát tartalmazza (esetenként más-más hoszt szálból érkező
parancsokat), amelyeket a megadott sorrendben hajt végre. A különböző stream-ek a megadott parancsokat
végrehajthatják különféle sorrendekben is bizonyos szabályokat megtartva [11]
• A stream-ek támogatják a konkurens végrehajtást
• Különböző stream-ek műveletei párhuzamosan is végrehajthatók
• Különböző stream-ek műveletei átfedhetik egymást
3.7. ábra - [12]
4.2. Stream-ek létrehozás és megszüntetése
• A stream-eket a cudaStream_t típus képviseli
• Stream készítésére használható a cudaStreamCreate függvény
• Parameterei: pStream – mutató az új stream azonosítóra
Programozási környezet
282 Created by XMLmind XSL-FO Converter.
3.8. ábra -
• Stream megszüntetésére használható a cudaStreamDestroy függvény
• Parameterei: pStream – a megszüntetendő stream
3.9. ábra -
• Gyakori, hogy stream-ek tömbjén kell dolgoznunk
3.10. ábra -
4.3. Stream-ek használata
• Néhány CUDA függvény tartalmaz egy további stream paramétert is
• cudaError_t cudaMemcpyAsync(
void *dst,
const void *src,
size_t count,
enum cudaMemcpyKind kind,
cudaStream_t stream = 0)
• Kernel indítás:
Func<<< grid_size, block_size, shared_mem, stream >>>
• Konkurens végrehajtás további követelményeket igényelhet
• Aszinkron másolás különböző irányokba
• Page locked memória
• Elég erőforrás
• Amennyiben nem adunk meg stream azonosítót, a CUDA egy alapértelmezett stream-et kezd használni (0
azonosítóval)
• Amennyiben nincs stream megadva
Programozási környezet
283 Created by XMLmind XSL-FO Converter.
• Szinkron hoszt – eszköz hívások
• Kivétel: GPU kernel hívások alapesetben is aszinkron módon futnak le, még hiányzó stream paraméter
esetén is
4.4. Példa a stream-ek használatára
3.11. ábra -
• Minden stream1 és stream2 művelet párhuzamosan fut
• Minden adatműveletnek egymástól függetlennek kell lennie
4.5. Stream szinkronizáció
• Minden stream szinkronizálására használható a cudaDeviceSynchronize
Ez addig várakoztatja a hoszt szálat, amíg minden CUDA hívás végez
3.12. ábra -
• Megadott stream-ek szinkronizálására használható a cudaStreamSynchronize
• Paramétere: stream – a szinkronizálandó stream
3.13. ábra -
• A programozó különféle eseményeket is készíthet a szinkronizáláshoz
4.6. Szinkronizációt magukba foglaló műveletek
• Page-locked memória foglalás
• cudaMallocHost
Programozási környezet
284 Created by XMLmind XSL-FO Converter.
• cudaHostAlloc
• Eszköz memória foglalás
• cudaMalloc
• Szinkron memória műveletek
• cudaMemcpy
• cudaMemset
• Megosztott memória konfiguráció változtatása
• cudaDeviceSetCacheConfig
4.7. Stream időzítés [12]
• A Fermi hardver három sort kezel
• 1 Compute Engine sor (számítások)
• 2 Copy Engine sor (másolások)
• Hosztról eszközre másolás
• Eszközről hosztra másolás
• CUDA műveletek a kiadás sorrendjében jutnak el az egyes eszközökre
• Bekerülnek a megfelelő sorba
• Az egyes sorok közötti függőségeket automatikusan kezeli a rendszer (de egy soron belül ez változtatható)
• CUDA műveletek feldolgozásra kerülnek a sorban, ha
• Megelőző műveletek az azonos stream-ben már végeztek,
• Megelőző műveletek az azonos sorban már végeztek, és
• A szükséges erőforrások rendelkezésre állnak
• CUDA kernelek futhatnak párhuzamosan is, ha különböző stream-ekben helyezkednek el
• A következő szál blokkokat akkorra ütemezi a rendszer, amikor már az összes megelőző kernelfutáshoz
tartozó blokk végzett, és rendelkezésre állnak a szükséges erőforrások
• Egy blokkoló művelet minden műveletet blokkol a sorban, még az egyéb stream-ekben találhatókat is
4.8. Konkurens végrehajtás támogatása
• Compute Capability 1.0
• Csak GPU/CPU konkurens végrehajtás
• Compute Capability 1.1
• Aszinkron memória másolás támogatása
• Az asyncEngineCount eszköz tulajdonság mutatja, hogy támogatott-e
• Compute Capability 2.0
Programozási környezet
285 Created by XMLmind XSL-FO Converter.
• Konkurens GPU kernel futtatások támogatása
• A concurrentKernels eszköz tulajdonság mutatja, hogy támogatott-e
• Támogatja a kétirányú, egyidejű másolásokat is
• Az asyncEngineCount eszköz tulajdonság mutatja meglétét
4.9. Példa blokkolt sorra
• Tekintsünk két stream-et az alábbi műveletekkel:
• Stream1: HDa1, HDb1, K1, DH1
• Stream2: DH2
3.14. ábra - [12]
4.10. Példa blokkolt sorra (2)
• Tekintsünk két stream-et az alábbi műveletekkel:
• Stream1: Ka1, Kb1
• Stream2: Ka2, Kb2
3.15. ábra - [12]
Programozási környezet
286 Created by XMLmind XSL-FO Converter.
5. CUDA események
5.1. Események létrehozása és megszüntetése
• A cudaEventCreate függvény létrehoz egy CUDA eseményt
cudaError_t cudaEventCreate(cudaEvent_t *event)
• Az első paramétere egy esemény típusú mutató
• A függvény létrehoz egy új eseményt, és a paraméterként átadott mutató erre fog hivatkozni
• A függvény visszatérési értéke a szokásos CUDA hibakód
• Egy példa
3.16. ábra -
• Egy haladóbb változata a függvénynek:
cudaEventCreateWithFlags (bővebben lást a CUDA dokumentációt)
• A cudaEventDestroy függvény megszünteti az esemény objektumot
cudaError_t cudaEventDestroy(cudaEvent_t event)
• Az első paramétere a megszüntetendő esemény objektum
• Egy példa:
3.17. ábra -
5.2. Esemény rögzítése
• A cudaEventRecord függvény rögzít egy eseményt egy már létező stream-be
cudaError_t cudaEventRecord (
cudaEvent_t event,
cudaStream_t stream = 0
)
• Az első paraméter a rögzítendő esemény
• A második paraméter a stream, ahová rögzíteni kell
• Az esemény akkor kerül rögzítésre, ha az összes megelőző művelet befejeződött a megadott stream-ben (0
stream esetén ez a teljes CUDA kontextusra vonatkozik)
Programozási környezet
287 Created by XMLmind XSL-FO Converter.
• cudaEventQuery és/vagy cudaEventSynchronyze függvényekkel lehet megállapítani, hogy mikorra lett
rögzítve
• Egy esemény felvétele esetén az felülírja a meglévő állapotot
3.18. ábra -
5.3. Esemény szinkronizálása
• A cudaEventSynchronize függvény szinkronizál egy eseményt. Addig vár, amíg az összes megelőző művelet
végrehajtásra kerül az aktuális cudaEventRecord() előtt
• cudaError_t cudaEventSynchronize(cudaEvent_t event)
• Az egyetlen paramétere az esemény, amire várni kell
• Ha a cudaEventRecord nem lett meghívva, akkor a függvény azonnal visszatér
• Az eseményre való várakozás blokkolni fogja a teljes CPU szálat, amíg nem hajtódik végre az esemény az
eszközön
3.19. ábra -
5.4. Esemény ellenőrzése
• A cudaEventQuery függvény ad információkat egy eseményről
cudaError_t cudaEvent
• Az első paramétere az esemény
• Információkat ad az eszközön található munkákról, amelyek megelőzik a hozzá tartozó cudaEventRecord
hívást
• Amennyiben az események bekövetkeztek, vagy a cudaEventRecord nem lett meghívva, akkor a
visszatérési értéke: cudaSuccess
• Egyéb esetben a visszatérési értéke: cudaErrorNotReady
3.20. ábra -
Programozási környezet
288 Created by XMLmind XSL-FO Converter.
5.5. Szinkronizáció eseményekkel
• A cudaStreamWaitEvent függvény blokkol egy stream-et, amíg egy esemény be nem következik
cudaError_t cudaStreamWaitEvent(
cudaStream_t stream,
cudaEvent_t event,
unsigned int flags
)
• Első paramétere a blokkolni kívánt stream
• Második paraméter az esemény, amire várni kell
• Harmadik paraméter opcionális
• Minden további munkát várakoztat, amíg az esemény végrehajtása be nem következett. A szinkronizációt
maga az eszköz fogja végrehajtani
• Az esemény származhat más kontextusból is, ilyenkor eszközök közötti szinkronizációra is használható
• A stream csak az aktuális cudaEventRecord hívásra figyel
• Ha a stream értéke NULL, minden további művelet várakozni fog az esemény bekövetkeztére
5.6. Szinkronizáció eseményekkel (példa)
3.21. ábra -
Programozási környezet
289 Created by XMLmind XSL-FO Converter.
5.7. Események között eltelt idő számítása
• A cudaEventElapsedTime függvény kiszámítja két esemény között eltelt időt
cudaError_t cudaEventElapsedTime(float *ms,
• cudaEvent_t start,
cudaEvent_t end
)
• Az első paramétere egy float változóra hivatkozó mutató. Ide fogja eltárolni az eredményt
• Másik paraméter a kezdő esemény
• Harmadik paraméter a vége esemény
• cudaEventRecord() függvényt mindkét eseményre meg kell hívni
• Mindkét eseménynek befejezett állapotban kell lenni
• Nem használható a cudaEventDisableTiming jelző
• Ha az időzítés nem kritikus, akkor egy jobb teljesítményű lehetőség:
cudaEventCreateWithFlags(&event, cudaEventDisableTiming)
5.8. Eltelt idő számítása (példa)
3.22. ábra -
6. Egyesített Virtuális Címtér
6.1. CUDA Unified Virtual Address Management
• Unified Virtual Addressing (UVA) egy memória kezelési rendszer, amely a CUDA 4.0 és későbbi
változatokban érhető el és a Fermi, illetve Kepler GPU-k 64 bites folyamataiban használható. Az UVA
memória kezelés adja az alapját további technikáknak is (pl. RDMA for GPUDirect [11])
Programozási környezet
290 Created by XMLmind XSL-FO Converter.
3.23. ábra - [9]
• A CUDA virtuális címtérben a címek az alábbiak lehetnek:
• GPU – A GPU memóriájában található. A hoszt nem érheti el
• CPU – A CPU memóriában található. Mindkét oldalról elérhető
• Free – Későbbi CUDA alkalmazások számára fenntartva
6.2. Egyesített Virtuális Címtér (UVA)
• UVA azt jelenti, hogy egy folyamatos memória tartomány létezik minden eszköz számára (ide értve a hosztot
és az összes GPGPU-t is)
• A CPU és a GPU ugyanazt a virtuális címteret használja
• A driver meg tudja állapítani, hogy az egyes címek fizikailag hol helyezkednek el
• Foglalások mindig ugyanazon az eszközön maradnak
• Elérhetőség
• CUDA 4.0 vagy későbbi változatokban
• Compute Capability 2.0 vagy későbbi változatok
• 64 bites operációs rendszer
• Egy mutató hivatkozhat
• Globális memóriára a GPU-n belül
• Rendszer memóriára a hoszt oldalon
• Globális memóriára egy másik GPU-n belül
• Az alkalmazások le tudják ellenőrizni, hogy ez a lehetőség támogatott-e a megadott rendszeren a
unifiedAddressing eszköz tulajdonságon keresztül
(CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING)
6.3. Egyesített Virtuális Címtér – elérhetőség
• Azt, hogy egy mutató pontosan milyen memóriaterületre hivatkozik, a cudaPointerGetAttributes( )
függvénnyel lehet lekérdezni (CPU-n vagy a GPU-n helyezkedik el a hivatkozott terület).
3.24. ábra -
Programozási környezet
291 Created by XMLmind XSL-FO Converter.
• A függvény visszatérési értéke egy cudaPointerAttributes struktúra:
struct cudaPointerAttributes {
enum cudaMemoryType memoryType;
int device;
void *devicePointer;
void *hostPointer;
}
• memoryType megadja, hogy a paraméterként átadott mutató melyik memóriaterületre mutat. Értéke ennek
megfelelően lehet
cudaMemoryTypeHost vagy cudaMemoryTypeDevice
• device annak az eszköznek a száma, ahova a mutató mutat
• devicePointer az eszközön belüli mutatót adja vissza
• hostPointer a hoszton belüli mutatót adja vissza
6.4. Peer to peer kommunikáció az eszközök között
3.25. ábra - [10]
• UVA memória másolás
• P2P memória másolás
• P2P memória hozzáférés
Programozási környezet
292 Created by XMLmind XSL-FO Converter.
6.5. UVA és a P2P átvitel
• Minden hoszt memória, amit a cuMemAllocHost() vagy cuMemHostAlloc() függvénnyel foglaltak le,
elérhető minden eszközből, amelyek támogatják az UVA funkciót
• A pointer értéke azonos a hoszton és az eszközön, így nincs szükség további függvények meghívására (mint
pl. cudaHostGetDevicePointer)
• Minden mutató egyedi, így pl. a cudaMemCpy() függvény esetén se szükséges megadni a másolás irányát,
hiszen az a mutatók értékéből egyértelműen adódik
3.26. ábra -
• Ezzel a könyvtárak kódja jelentősen egyszerűsíthető
• Mindez persze nem működik, ha a P2P nem elérhető
6.6. P2P memória átvitel GPU-k között
• P2P hozzáférés ellenőrzése [10]:
3.27. ábra -
• P2P hozzáférés engedélyezése:
3.28. ábra -
• UVA másolás művelet:
3.29. ábra -
• P2P hozzáférés letiltása:
3.30. ábra -
Programozási környezet
293 Created by XMLmind XSL-FO Converter.
6.7. P2P memória másolás GPU-k között
• Rendszerkövetelmény a P2P átvitel
• Ugyanazok az ellenőrző lépések [10]:
3.31. ábra -
• Hasonló inicializálás:
3.32. ábra -
• Azonos leállítási lépések:
3.33. ábra -
6.8. P2P memória hozzáférést bemutató kernel
• A már jól ismert másolást elvégző kernel:
3.34. ábra -
• Maga a kernel tetszőleges paraméterekkel elindítható:
Programozási környezet
294 Created by XMLmind XSL-FO Converter.
3.35. ábra -
• Az UVA-nak köszönhetően a kernel tudja, hogy az egyes mutatók melyik eszközön és pontosan hol
helyezkednek el
6.9. CUDA UVA összegzés
• Gyorsabb memória átvitel az egyes eszközök között
• Eszközök közötti átvitel kevesebb hoszt erőforrást igényel
• Az egyes eszközökön futó kernelek elérik a többi eszköz memória tartományait (olvasás és írás esetében is)
• Memória címzés különféle eszközökön (más GPU-k, hoszt memória)
• Szükséges hozzá
• 64 bites operációs rendszer és alkalmazás (Windows TCC)
• CUDA 4.0
• Fermi GPU
• Legújabb driverek
• GPU-knak azonos I/O Hub-on kell lenniük
További információk az UVA kapcsán
• CUDA Programming Guide 4.0
• 3.2.6.4 Peer-to-Peer Memory Access
• 3.2.6.5 Peer-to-Peer Memory Copy
• 3.2.7 Unified Virtual Address Space
295 Created by XMLmind XSL-FO Converter.
4. fejezet - Optimalizációs technikák
1. Megosztott memória használata
1.1. Optimalizációs stratégiák
• Memória felhasználás
• Regiszterek használata
• Megosztott memória használata
• CPU-GPU átvitel minimalizálása
• Adatműveletek másolás helyett (kód áthelyezése a GPU-ra)
• Csoportos adatátvitel
• Speciális memória hozzáférési minták (nem tárgyaljuk)
• Párhuzamos végrehajtás maximalizálása
• GPU párhuzamosság maximalizálása
• Minél több szállal a memória késleltetés elrejtése
• CPU-GPU párhuzamosság kihasználása
• Blokk méret optimalizálása
• Blokkok számának optimalizálása
• Több GPU használata
• Utasítás szintű optimalizálás
• Lebegőpontos aritmetika használata
• Kisebb pontosság használata
• Gyors matematikai funkciók használata
• Divergens warpok minimalizálása
• Elágazások problémája
1.2. Mátrix szorzó alkalmazás elkészítése
1.2.1. Feladat 4.1.1
Készítsünk CUDA alkalmazást, amelyik kétdimenziós (NxN méretű, egyszeres lebegőpontos számokat
tartalmazó) mátrixok szorzását tudja elvégezni a GPU segítségével:
• A kód tartalmazzon egy N konstanst, ami a mátrixok méretét tartalmazza
• Foglaljon le 3 darab NxN méretű mátrixot (A, B, C)
• Töltse fel az A mátrixot tetszőleges adatokkal (pl. ai,j = i + j)
• Töltse fel a B mátrixot tetszőleges adatokkal (bi,j = i - j)
Optimalizációs technikák
296 Created by XMLmind XSL-FO Converter.
• Foglaljon le 3 darab NxN méretű memóriaterületet a grafikus kártya memóriájában (devA, devB, devC)
• Végezze el a bemenő adatok másolását: A → devA, B → devB
• Indítson el egy kernelt, ami kiszámítja a devC = devA * devB eredményt
• Végezze el a kimenő adatok másolását: devC → C
• Írja ki az így kapott C vektor elemeinek értékét a képernyőre
1.3. Többdimenziós mátrix a memóriában
• Bár a C programunkban tudunk többdimenziós tömböket lefoglalni, ezek elemei a memóriában
értelemszerűen lineárisan helyezkednek el
• Egy egyszerű 4x4-es mátrix elhelyezkedése:
A mátrix
4.1. ábra -
A kétdimenziós tömb
4.2. ábra -
Többdimenziós mátrix elemeihez való hozzáférés
• Amennyiben tehát ismert a mátrix kezdőcíme, a dimenziói, illetve az elemek méretei, a mátrix bármelyik
elemének címe egyszerűen kiszámítható:
arow,col= a0,0 + (row * oszlopszám + oszlop) * elemméret
• Mivel a CUDA kernelnek csak a mátrixokat tartalmazó memóriaterületek kezdőcímét adjuk át, a fenti
képlettel érhetjük el az egyes elemeket
Optimalizációs technikák
297 Created by XMLmind XSL-FO Converter.
1.4. Többdimenziós mátrix a memóriában
• Többdimenziós mátrixok esetén már egy 30x30-as méret is 900 darab szálat igényelne, amit (régebbi kártyák
esetén) nem tudunk egy blokkban elhelyezni
• Emiatt célszerű a programot tetszőleges méretű blokkok kezelésére felkészíteni, ennek megfelelően a blokk
azonosítót is kezelni kell
Egy lehetséges kernel
devC = devA * devB mátrixszorzás kódja:
4.3. ábra -
1.5. Több dimenziós mátrix a GPU memóriában
• Inicializálás, memóriaterületek lefoglalása
4.4. ábra -
• Bemenő adatok átmásolása
4.5. ábra -
• Kernel indítása
4.6. ábra -
Optimalizációs technikák
298 Created by XMLmind XSL-FO Converter.
• Eredmények másolása, memória felszabadítása
4.7. ábra -
1.6. Igazított elhelyezés
• Néha célszerű elválasztani egymástól a mátrix egy sorában található oszlopok számát és a memóriában tárolt
tömb sorainak tényleges méretét (pl. kettes számrendszerbeli számokkal gyorsabban számítható a szorzás,
illetve a CUDA végrehajtó egységek memóriakezelése is gyorsítható így)
• Egy egyszerű 5x5-ös mátrix elhelyezkedése, 8 elemes igazítással:
A mátrix
4.8. ábra -
A kétdimenziós tömb
4.9. ábra -
Optimalizációs technikák
299 Created by XMLmind XSL-FO Converter.
Igazított tárolás esetén a hozzáférés
• A képlet hasonló, csak nem a tényleges oszlopszámmal szorzunk:
asor,oszlop = a0,0 + (sor * igazított_oszlopszám + oszlop) * elemméret
1.7. Igazított memóriakezelés
• A CUDA osztálykönyvtár rendelkezik egy memóriafoglaló rutinnal, ami automatikusan a legoptimálisabb
igazítással foglalja le a megadott kétdimenziós memóriaterületet:
• cudaMallocPitch(void** devPtr, size_t *pitch, size_t width, size_t height)
• devPtr – lefoglalt memóriára mutató pointer (címszerinti paraméter)
• pitch – igazítás mértéke (címszerinti paraméter)
• width – mátrix egy sorának a mérete
• height – mátrix sorainak száma
• A lineáris foglaláshoz hasonlóan a devPtr tartalmazza majd a memóriacímet
• Az igazítás méretét tehát nem a függvény hívásakor kell megadni, hanem azt az osztálykönyvtár fogja
megállapítani, és az így kiszámított értéket fogja visszaadni a pitch paraméterként átadott változóban
• A mátrix egy sorának méreténél (width) ügyeljünk rá, hogy bájtban kell megadni a méretet, hiszen a függvény
nem tudhatja, hogy mekkora elemeket akarunk majd eltárolni
1.8. Igazított memória másolása
• Az igazított memóriakezelés során nem használható az egyszerű lineáris memória másolás, hiszen a cél és a
forrás igazítása különböző is lehet
• A másolásra jól használható az alábbi függvény, ami kezeli ezt a problémát:
• cudaMemcpy2D(void* dst, size_t dpitch, const void* src, size_t spitch,
size_t width, size_t height, enum cudaMemcpyKing kind)
• dst – másolás célját mutató pointer
• dpitch – a cél adatszerkezet által használt igazítás mérete
• src – másolás forrását mutató pointer
Optimalizációs technikák
300 Created by XMLmind XSL-FO Converter.
• spitch – a forrás adatszerkezet által használt igazítás mérete
• width – a 2 dimenziós adatszerkezet egy sorának a mérete (bájtban)
• height – a 2 dimenziós adatszerkezet sorainak a száma
• kind – másolás iránya (értékei azonosak a lineáris másolásnál látottakkal)
• hoszt → hoszt (cudaMemcpyHostToHost)
• hoszt → eszköz (cudaMemcpyHostToDevice)
• eszköz → hoszt (cudaMemcpyDeviceToHost)
• eszköz → eszköz (cudaMemcpyDeviceToDevice)
• Amennyiben egy egyszerű igazítás nélküli tömböt használunk, akkor ne felejtsük el, hogy az igazítás mérete
= tömb sorának mérete (és nem 0)
1.9. Mátrix szorzó alkalmazás elkészítése igazított memóriával
1.9.1. Feladat 4.1.2
Készítsünk CUDA alkalmazást, amelyik kétdimenziós (NxN méretű, egyszeres lebegőpontos számokat
tartalmazó) mátrixok szorzását tudja elvégezni a GPU segítségével:
• A kód tartalmazzon egy N konstanst, ami a mátrixok méretét tartalmazza
• Foglaljon le 3 darab NxN méretű mátrixot (A, B, C)
• Töltse fel az A mátrixot tetszőleges adatokkal (pl. ai,j = i + j)
• Töltse fel a B mátrixot tetszőleges adatokkal (pl. bi,j = i - j)
• Foglaljon le 3 darab NxN méretű memóriaterületet a grafikus kártya memóriájában a kártya által választott
igazítással (devA, devB, devC)
• Végezze el a bemenő adatok másolását: A → devA, B → devB
• Indítson el egy kernelt, ami kiszámítja a devC = devA * devB eredményt
• Végezze el a kimenő adatok másolását: devC → C
• Írja ki az így kapott C vektor elemeinek értékét a képernyőre
1.10. Kernel igazított memóriakezeléssel
• A kernel a paraméterként átadott igazítás mérettel végzi a szorzást N helyett
• Az igazítás mérete bájtban van megadva, így típusos mutatók esetén a értékét osztani kell az elem méretével
(a példában feltételeztük hogy ez megtehető, amennyiben a igazítás nem lenne osztható az elemmérettel,
akkor pl. típus nélküli mutatókkal tudjuk az elemek helyeit kiszámítani)
Egy lehetséges kernel
devC = devA * devB mátrixszorzás kódja:
4.10. ábra -
Optimalizációs technikák
301 Created by XMLmind XSL-FO Converter.
1.11. Kernel hívása igazított tömbök esetén
• Inicializálás, memóriaterületek lefoglalása
4.11. ábra -
• Bemenő adatok átmásolása (feltételezzük, hogy a pitch azonos lett)
4.12. ábra -
• Kernel indítása
4.13. ábra -
• Eredmények másolása, memória felszabadítása
4.14. ábra -
1.12. Megosztott memória kezelése
• A mátrix szorzás meglehetősen kevés aritmetikai műveletet tartalmaz a memóriamozgatások számához képest
Optimalizációs technikák
302 Created by XMLmind XSL-FO Converter.
• A GPU a memóriakezelésből származó várakozási időket nem gyorsítótárral, hanem a végrehajtóegységek
átütemezésével próbálja elrejteni. Ha azonban nincs végrehajtandó művelet, akkor ezt nem tudja megoldani
• A CUDA környezetben megvalósított algoritmusok jóságának összehasonlítására emiatt gyakran használatos
az aritmetikai műveletek száma/memóriahozzáférések száma hányados
Megoldási lehetőségek
• Párhuzamosság növelése, amennyiben a feladat ezt lehetővé teszi (jelen esetben erre nem látunk lehetőséget)
• Memóriahozzáférések számának csökkentése (tulajdonképpen programozott gyorsítótár kezelés)
• minél több változó regiszterekben tartása
• megosztott memóriaterület használata
• Egyéb megoldások keresése, esetenként az algoritmusok áttervezése
1.13. Ötlet a mátrix szorzás gyorsítására (csempe technika)
• Mivel a bemenő mátrixok egyes elemei több kimenő elem számításához is szükségesek, így a nem
optimalizált változatban több szál is betölti őket egymástól függetlenül
• Célszerű lenne ezen szálak működését összehangolni:
• a teljes kimenő mátrixot régiókra bontjuk (csempe)
• a régióknak megfelelő méretű megosztott memóriaterületet lefoglalunk a két bemenő mátrix elemeinek
ideiglenes betöltéséhez
• a régiókban található minden szál betölti az ő pozíciójának megfelelő elemet a két bemenő mátrixból a
megosztott memóriába
• a szál a saját és a többi szál által betöltött adatok segítségével kiszámítja az eredménymátrix rá eső értékét
• A megosztott memória mérete meglehetősen korlátos, emiatt elképzelhető, hogy a fenti műveletet csak több
lépésben, a bemenő mátrixokat több csempével lefedve, majd ezek értékét összeadva lehet végrehajtani
• Ez utóbbi esetben lényeges a szinkronizálás is, hogy egyik szál se kezdje el betölteni a következő csempe
adatait, miközben a vele egy régióban lévő szálak még dolgoznak a részeredményeken
1.14. Mátrix szorzó alkalmazás elkészítése (megosztott memóriával)
1.14.1. Feladat 4.1.3
Készítsünk CUDA alkalmazást, amelyik kétdimenziós (NxN méretű, egyszeres lebegőpontos számokat
tartalmazó) mátrixok szorzását tudja elvégezni a GPU segítségével:
• A kód tartalmazzon egy N konstanst, ami a mátrixok méretét tartalmazza
• Foglaljon le 3 darab NxN méretű mátrixot (A, B, C)
• Töltse fel az A mátrixot tetszőleges adatokkal (pl. ai,j = i + j)
• Töltse fel a B mátrixot tetszőleges adatokkal (pl. bi,j = i - j)
• Foglaljon le 3 darab NxN méretű memóriaterületet a grafikus kártya memóriájában (devA, devB, devC)
• Végezze el a bemenő adatok másolását: A → devA, B → devB
Optimalizációs technikák
303 Created by XMLmind XSL-FO Converter.
• Indítson el egy kernelt, ami kiszámítja a devC = devA * devB eredményt, az előzőleg megismert csempe
technika segítségével
• Végezze el a kimenő adatok másolását: devC → C
• Írja ki az így kapott C vektor elemeinek értékét a képernyőre
1.15. Mátrix szorzás gyorsítása
1. Csempékre bontás 3x3 db régió, ezekben 3x3 db szál
2. Minden szál átmásol egy-egy elemet a megosztott memóriába
3. Szinkronizáció
4.15. ábra -
1.16. Mátrix szorzás gyorsítása (2)
4. Minden szál a saját részeredményét kiszámolja a megosztott memória tartalma alapján
5. Szinkronizáció
4.16. ábra -
Optimalizációs technikák
304 Created by XMLmind XSL-FO Converter.
1.17. Mátrix szorzás gyorsítása (3)
6. Következő csempék adatainak betöltése
7. Szinkronizálás
8. Szálak újra elvégzik a szorzást. A szorzatot hozzáadják az előző részeredményhez
9. Szinkronizálás
4.17. ábra -
Optimalizációs technikák
305 Created by XMLmind XSL-FO Converter.
1.18. Mátrix szorzás gyorsítása (4)
6. Következő csempék adatainak betöltése
7. Szinkronizálás
8. Szálak újra elvégzik a szorzást. A szorzatot ismét hozzáadják az előző részeredményhez
9. Szinkronizálás
4.18. ábra -
Optimalizációs technikák
306 Created by XMLmind XSL-FO Converter.
1.19. Mátrix szorzás gyorsítása (5)
10. Minden szál az általa kiszámított elemet bemásolja a C-be
11. Az összes blokk és szál lefutása után az eredménymátrix minden eleme a helyére kerül
4.19. ábra -
Optimalizációs technikák
307 Created by XMLmind XSL-FO Converter.
1.20. Optimalizált mátrix szorzás kernel
• A kernel meghívása azonos az előzőleg megismerttel
4.20. ábra -
Optimalizációs technikák
308 Created by XMLmind XSL-FO Converter.
1.21. Összehasonlító vizsgálat
• Vízszintes tengely: mátrix mérete (N)
• Függőleges tengely: futási idő (másodperc)
4.21. ábra -
2. Atomi műveletek használata
2.1. Atomi műveletek szükségessége
Atomiság igénye
• Az adatpárhuzamos feladatok készítésekor ideális esetben a végeredmény kiszámításához nincs szükség az
indextér egymástól független pontjain végzett műveletekre (pl. két mátrix összeadása), esetleg csak az
olvasásra van szükség (pl. két mátrix szorzása)
• Bizonyos feladatoknál azonban ez nem kerülhető el, mint például a gyakori aggregációs műveleteknél:
• adatszerkezet elemeinek az összege/átlaga
• adatszerkezet legkisebb/legnagyobb eleme
• adatszerkezetben megadott tulajdonságú elemek száma
• stb.
Possible solutions
• Ezen feladatok egy része egyszerűen megoldható adatpárhuzamos környezetben is (pl. van-e T tulajdonságú
elem)
• A feladatok egy része azonban csak (részben) szekvenciális megoldással oldható meg (pl. legkisebb elem
megkeresése)
2.2. CUDA atomi műveletek
Optimalizációs technikák
309 Created by XMLmind XSL-FO Converter.
• A CUDA által nyújtott atomi műveletek segítenek kiküszöbölni a versenyhelyzet okozta problémákat. A
hardver garantálja, hogy az így elvégzett műveletek a szálak számától függetlenül szekvenciálisan fognak
végrehajtódni (vagy legalábbis úgy tűnnek)
• Operandusok lehetnek
• változó a globális memóriában
• változó a megosztott memóriában
• Operandusok mérete
• 32 bites egész (1.1 számítási képesség)
• 64 bites egész (1.2 számítási képesség)
Teljesítmény megfontolások
• Az atomi műveletek jellegüknél fogva nem párhuzamosíthatók, ennek megfelelően jelentősen rontják minden
kernel teljesítményét
• Bizonyos feladatoknál azonban nem lehet őket teljesen kiküszöbölni, azonban ilyenkor is célszerű esetleg
előzetes párhuzamos feldolgozásokkal csökkenteni a szükséges atomi műveletek számát
2.3. CUDA atomi műveletek - aritmetika
• Az atomi műveletek egyik paramétere általában egy memóriacím (globális vagy megosztott memóriában),
második paramétere pedig egy egész szám
• int atomicAdd(int* address, int val)
Az első paraméterként cím szerint átadott változó értékéhez hozzáadja a második paraméterben átadott
értéket. Visszatérési értéke az eredeti szám
• int atomicSub(int* address, int val)
Az első paraméterként cím szerint átadott változó értékéből kivonja a második paraméterben átadott értéket.
Visszatérési értéke az eredeti szám
• int atomicExch(int* address, int val);
Reads the 32-bit or 64-bit word old located at the address in global or shared memory and stores val back to
memory at the same address. These two operations are performed in one atomic transaction. The function
returns old
Az első paraméterként cím szerint átadott változónak értékül adja a második paraméterként átadott értéket.
Visszatérési értéke az eredeti szám
• int atomicMin(int* address, int val);
Ha a második paraméterként átadott szám értéke kisebb mint az első cím szerinti paraméterként átadott
változó értéke, akkor ez utóbbit felülírja az előbbivel. Visszatérési értéke az eredeti szám
2.4. CUDA atomi műveletek – aritmetika (2)
• int atomicMax(int* address, int val);
Ha a második paraméterként átadott szám értéke nagyobb, mint az első cím szerinti paraméterként átadott
változó értéke, akkor ez utóbbit felülírja az előbbivel. Visszatérési értéke az eredeti szám
• unsigned int atomicInc(unsigned int* address, unsigned int val)
Optimalizációs technikák
310 Created by XMLmind XSL-FO Converter.
Ha az első paraméterként cím szerint átadott változó értéke kisebb, mint a második paraméter, akkor az előbbi
értékét növeli 1-el, különben 0-t ad neki értékül. Visszatérési értéke az eredeti szám
• unsigned int atomicDec(unsigned int* address, unsigned int val)
Ha az első paraméterként cím szerint átadott változó értéke nagyobb, mint 0, akkor az előbbi értékét növeli 1-
el, különben a második paraméterben átadott értéket másolja bele. Visszatérési értéke az eredeti szám
• int atomicCAS(int* address, int compare, int val)
Ha az elő paraméterként cím szerint átadott változó értéke egyenlő a második paraméterrel, akkor az
előbbinek értékül adja a harmadik paraméter értékét. Visszatérési értéke az eredeti érték
2.5. CUDA atomi műveletek – logikai függvények
• int atomicAnd(int* address, int val)
Az első paraméterként cím szerint átadott változó értékéül adja a második változóval vett ÉS művelet
eredményét. Visszatérési értéke az eredeti szám
• int atomicOr(int* address, int val)
Az első paraméterként cím szerint átadott változó értékéül adja a második változóval vett VAGY művelet
eredményét. Visszatérési értéke az eredeti szám
• int atomicXor(int* address, int val)
Az első paraméterként cím szerint átadott változó értékéül adja a második változóval vett KIZÁRÓ VAGY
művelet eredményét. Visszatérési értéke az eredeti szám
2.5.1. Feladat 4.2.1
Készítsünk CUDA alkalmazást, amelyik egy (hoszt oldalon) véletlenszerű számokkal feltöltött vektorból
kiválasztja a minimális értéket. A feladat megoldása során használja a megismert atomi műveleteket
2.6. Vektor legkisebb elemének értéke
• Az alap megoldás meglehetősen egyszerű, minden szál az általa indexelt elemre és a vektor első elemére
meghívja a minimumot értékül adó függvényt
• A kernel lefutását követően tehát a vektor legelső eleme tartalmazza a legkisebb elem értékét
4.22. ábra -
• Érdemes megfigyelni, hogy a kernel eleve több blokkos indításra lett tervezve, tehát az atomi műveletek nem
csak blokkon belül, hanem blokkok között is biztosítják a versenyhelyzetek megoldását
2.6.1. Feladat 4.2.2
Sejthető, hogy a globális memóriában végzett atomi műveletek meglehetősen lassúak, ezért próbáljunk egy
olyan változatot, amelyik először a blokk minimumát keresi meg, majd ezzel számol globális minimumot
2.7. Memóriahozzáférések csökkentése – megosztott memória
Optimalizációs technikák
311 Created by XMLmind XSL-FO Converter.
• A blokkon belül az első szál feladata, hogy beállítsa a lokális minimumot tároló változó kezdőértékét
• Ezt követően az összes szál elvégzi a hozzá rendelt értékkel a minimum ellenőrzést
• Végül az első szál az így kiszámított lokális minimummal elvégzi a globális minimum ellenőrzést is
• Szintén ügyeljünk a szinkronizációs pontokra, nehogy rossz sorrendben fussanak le az utasítások az egyes
szálakban
4.23. ábra -
2.7.1. Összehasonlító vizsgálat
• Vízszintes tengely: vektor mérete (N)
• Függőleges tengely: futási idő (másodperc)
4.24. ábra -
Optimalizációs technikák
312 Created by XMLmind XSL-FO Converter.
2.8. Blokkon belüli párhuzamosítás
• Célszerű lenne a megoldást olyan formában keresni, hogy kihasználhassuk a párhuzamosságból eredő
előnyöket is: blokkon belül is kisebb részfeladatokra kell bontani a minimum kiválasztást
Párhuzamosított változat
• A megosztott memóriába betöltjük a globális memória egy szeletét: minden szál beolvassa a globális
memória két elemét, majd ezek közül a kisebbiket eltárolja a megosztott memóriában
• Blokkon belül minden szál összehasonlít két elemet a megosztott memóriában, majd a kisebbiket eltárolja az
alacsonyabb indexű helyen
• Következő iterációban már csak az előzőleg kisebbnek talált elemeket hasonlítják össze, így a vizsgálandó
elemek száma mindig feleződik
• Miután megvan a blokk legkisebb eleme, az előzőleg megismert módon eldöntjük, hogy ezek közül melyik a
globális minimum
2.8.1. Feladat 4.2.3
Készítsük el a minimum kiválasztás fent leírt algoritmussal működő változatát
2.9. Párhuzamos minimum - betöltés
• Egy példa
N = 24
BlockN = 4 (szálak száma)
• Minden blokk lefoglal BlokkN*2 méretű megosztott memóriát
• Minden blokk szálai BlokkN*4 méretű globális memóriából töltik be páronként a kisebb értékeket
• A blokkméret legyen 2 hatványa, így az üres helyeket feltöltjük:
• páratlanul maradt elem
• vektor bármelyik eleme
Optimalizációs technikák
313 Created by XMLmind XSL-FO Converter.
• Betöltés után szinkronizáció
4.25. ábra -
2.10. Párhuzamos minimum – blokk minimuma
4.26. ábra -
• Minden szál log2BlokkN darab iterációt hajt végre, amely során az x indexű szál elvégzi az alábbi műveletet:
Sx = Min(S2x , S2x+1)
• A műveletek végén a vektor legelső eleme tartalmazza a blokk által feldolgozott elemek közüli legkisebb
értékét
• Ezek közül kiválaszhatjuk a globális legkisebb elemet:
Optimalizációs technikák
314 Created by XMLmind XSL-FO Converter.
• atomi műveletek használatával
• a blokkok által kigyűjtött minimális elemeket egy másik vektorban gyűjtjük, majd ezekre ismét lefuttatjuk
a fenti minimumkiválasztást (nagy elemszám esetén már érdemes lehet ezt a változatot használni)
2.11. Párhuzamos minimum - kernel
4.27. ábra -
2.12. Párhuzamos minimum – kernel (2)
4.28. ábra -
Megjegyzések
• A blokkméret mindenképpen 2 hatványa legyen
A k ciklus szerepe, hogy minden blokk kétszer futtassa le a globális memóriából megosztott memóriába való
másolást.
Ennek következtében a BlokkN darab szálat tartalmazó blokk 4*BlokkN elemet tölt be a globális memóriából,
ebből 2*BlokkN elemet (páronként a kisebbet) ment el a megosztott memóriába, így a fenti ciklus első
iterációjában mind a BlokkN darab szál össze tud hasonlítani egy párt
2.13. Összehasonlító vizsgálat
Első és második optimalizált kód összehasonlítása
• Vízszintes tengely: vektor mérete (N)
• Függőleges tengely: futási idő (másodperc)
4.29. ábra -
Optimalizációs technikák
315 Created by XMLmind XSL-FO Converter.
2.14. Összehasonlító vizsgálat
Egyszerű CPU – GPU kód összehasonlítása
• Vízszintes tengely: vektor mérete (N)
• Függőleges tengely: futási idő (másodperc)
4.30. ábra -
3. Kihasználtság
3.1. A végrehajtás áttekintése
• CUDA esetén a teljes problématér blokkokra van osztva
Optimalizációs technikák
316 Created by XMLmind XSL-FO Converter.
• A rács egymástól független blokkokból áll
• Az egyes blokkok pedig szálakból állnak
• Az utasítások warp szinten hajtódnak végre
• A Fermi architektúra esetében 32 szál alkot egy warpot
• Fermi esetében egyidőben 48 aktív warp lehet egy SM-ben (ami összesen 1536 szálat jelent)
• Egy warp futtatása megakad, ha bármelyik szükséges operandus hiányzik
• A késleltetés elkerülése érdekében
• Amíg egy warp megakad, a végrehajtó egység megpróbál kontextust váltani
• A kontextusváltás időigénye nagyon alacsony
• A regiszterek és a megosztott memória a blokk élettartama alatt megőrződnek
• Ha egy blokk aktív, akkor egészen addig aktív marad, amíg nem végez minden benne lévő szál
• Regiszterek és a megosztott memória nem igényel eltárolást/visszatöltést a kontextusváltások során
3.2. Kihasználtság
• Kihasználtság (occupancy) alatt értjük az aktuálisan aktív végrehajtó egységek és a rendelkezésre álló
végrehajtó egységek számának arányát
Kihasználtság = Aktív warpok száma / Maximális warp szám
• Maximális warp és blokk szám a multiprocesszoron belül
• Maximális warp és blokk szám a multiprocesszoron belül
• Regiszterek száma a multiprocesszoron belül
• Megosztott memória mérete a multiprocesszoron belül
• Kihasználtság = Min(regiszter kih., megosztott memória kih., blokk kih.)
3.3. Kihasználtság és a regiszterek kapcsolata
• Fermi esetében 32K darab regisztert tartalmaz egy SM
• A szálak maximális száma pedig 1536
• Például, amennyiben egy kernel 40 regisztert igényel szálanként:
• Aktív szálak száma: 32K / 40 = 819
• Kihasználtság: 819 / 1536 = 0,53
• Ebben az esetben a regiszterek száma korlátozza a kihasználtságot (miközben vannak kihasználatlan
erőforrások még a GPU-ban)
• Cél: korlátozzuk a regiszter felhasználást
• Regiszterhasználat ellenőrzése: fordításkor –ptxax-options=-v
• Regiszterhasználat korlátozása: fordításkor –maxregcount
• Például 21 regiszter esetén:
Optimalizációs technikák
317 Created by XMLmind XSL-FO Converter.
• Aktív szálak száma: 32K / 21 = 1560
• Kihasználtság: 1560 / 1536 = ~1
• Mindez azt jelenti, hogy ennyi regiszter nem korlátozza a GPU teljes kihasználtságát (mindez persze függ a
többi tényezőtől is)
3.4. Kihasználtság és megosztott memória
• Fermi esetében a megosztott memória mérete konfigurálható
• 16K megosztott memória
• 48K megosztott memória (általában ezt használjuk)
• Például, ha egy kernel 64 byte megosztott memóriát használ
• Aktív szálak száma: 48K / 64 = 819
• Kihasználtság: 819 / 1536 = 0,53
• Ebben az esetben a megosztott memória biztosan korlátozza a futást (miközben vannak kihasználatlan
erőforrások a GPU-ban)
• Cél: korlátozzuk a megosztott memória használatot
• Megosztott memória méret ellenőrzése: fordításkor –ptxax-options=-v
• Megosztott memória méret korlátozása
• Kernel híváskor kisebb korlát megadása
• Megfelelően választott L1/Megosztott memória konfiguráció
• Például 32 byte megosztott memória esetében:
• Aktív szálak száma: 48K / 32 = 1536
• Kihasználtság: 1536 / 1536 = 1
• Ez azt jelenti, hogy a megosztott memória nem korlátozza a GPU erőforrásainak a kiaknázását (mindez
persze számos más tényezőtől is függ)
3.5. Kihasználtság és blokk méret
• Minden SM 8 aktív blokkot tud tárolni
• Van egy hardver alapú blokkméret limit
• Compute Capability 1.0 esetén – 512
• Compute Capability 2.0 esetén – 1024
• Az alsó korlát 1, de ez nyilván a szálak számát negatívan befolyásolja
• Például:
• Blokk méret: 128
• Aktív szálak száma egy SM esetében: 128 * 8 = 1024
• Kihasználtság: 1536 / 1024 = 0,66
Optimalizációs technikák
318 Created by XMLmind XSL-FO Converter.
• Ebben az esetben a blokkméret hátráltatja a teljes kihasználtságot (miközben a GPU rendelkezne még szabad
erőforrásokkal)
• Cél: próbáljuk növelni a blokk méretet (a kernel hívásakor)
• Például:
• Blokk méret: 192
• Aktív szálak száma egy SM esetében: 192 * 8 = 1536
• Kihasználtság: 1536 / 1536 = 1
• Ez azt jelenti, hogy a blokkméret nem korlátozza a GPU erőforrásainak a kiaknázását (mindez persze számos
más tényezőtől is függ)
3.6. CUDA Occupancy calculator
• Egy CUDA eszköz, amellyel egyszerűen számítható a kihasználtság
• Gyakorlatilag egy Excel táblázat, amely az alábbi helyen található:
„NVIDIA GPU Computing SDK x.x\C\tools\CUDA_Occupancy_Calculator.xls”
• Bemenő adatok:
• Hardver konfiguráció
• Számítási Kapacitás
• Megosztott memória konfiguráció (Fermi és felette)
• Erőforrás felhasználás
• Szálak száma blokkonként
• Regiszterek száma szálanként
• Megosztott memória mérete blokkonként
• Kimenő adatok:
• Aktív szálak száma multiprocesszoronként
• Aktív warpok száma multiprocesszoronként
• Aktív blokkok száma multiprocesszoronként
• A fentiek alapján a multiprocesszor kihasználtsága
3.7. CUDA Occupancy calculator - példa
4.31. ábra -
Optimalizációs technikák
319 Created by XMLmind XSL-FO Converter.
3.8. CUDA Occupancy calculator – változó blokk méret hatása
4.32. ábra -
3.9. CUDA Occupancy calculator – változó regiszter szám hatása
4.33. ábra -
Optimalizációs technikák
320 Created by XMLmind XSL-FO Converter.
3.10. CUDA Occupancy calculator – változó megosztott memória hatása
4.34. ábra -
3.11. Blokk mérettel kapcsolatos javaslatok [18]
• Blokkon belül a szálak száma legyen mindig a warp méret többszöröse
• Kerüljük el a nem teljesen kihasznált warpok által okozott felesleges számításokat
Optimalizációs technikák
321 Created by XMLmind XSL-FO Converter.
• Optimalizáljuk a blokk méretet
• Minél több blokk – hatékonyabb a memória késleltetés kezelés
• Túl kevés blokk – próbáljunk minél kevesebb regisztert használni, mivel túl sok regiszter
megakadályozhatja a még több blokk futását
• Tapasztalati javaslatok
• Minimum: 64 szál blokkonként
• Több párhuzamos blokk
• 192 vagy 256 szál még jobb választás lehet
• Itt még általában elég a regiszterek száma
• Minden a megadott feladattól függ!
• Tapasztalat, teszt, mérés!
• Próbáljuk maximalizálni a kihasználtságot
• A kihasználtság növekedése nem feltétlenül jár együtt tényleges teljesítménynövekedéssel
• De a nem megfelelő kihasználtság valószínűsíthetően több problémát okoz, pl. a memória késleltetés
elrejtésében
4. Parallel Nsight
4.1. Parallel Nsight
• Nyomkövető alkalmazás a CUDA környezet számára
• Az alábbi címről tölthető le:
http://www.nvidia.com/object/nsight.html
• Elérhető kiadások
• Visual Studio Edition
https://developer.nvidia.com/nvidia-nsight-visual-studio-edition
• Nsight Eclipse Edition
• Főbb funkciói
• Visual Studio/Eclipse támogatás
• PTX/SASS assembly nyomkövetés
• CUDA Debugger (kernel nyomkövetése közvetlenül)
• Feltételes töréspontok használata
• GPU memória megtekintése
• Grafikus nyomkövetés
• Profiler funkciók
• Hardver követelmények
Optimalizációs technikák
322 Created by XMLmind XSL-FO Converter.
• Analyzer -Egy GPU-s rendszer
• CUDA Debugger –Több GPU-s rendszer
• Direct3D Shader Debugger –Több egymástól független rendszer
4.2. Kernel nyomkövetés
• Helyi nyomkövetés főbb lépései
• Nsight Monitor indítása
(All Programs > NVIDIA Corporation > Nsight Visual Studio Edition 2.2 > Nsight Monitor)
• Töréspont elhelyezése
Működése hasonló a Visual Studioban egyébként megszokotthoz
4.35. ábra -
• „Start CUDA debugging funkció” kiválasztása
(Nsight/Start CUDA debugging)
• A nyomkövetés be fog kapcsolni a töréspont elérésekor
• Minden megszokott nyomkövetési funkció elérhető ilyenkor
• továbblépés
• függvénybe belépés
• stb.
• Távoli nyomkövetés
• Nem tárgyaljuk
4.3. GPU memória régiók megtekintése
• A Parallel Nsight támogatja a memória megtekintését is a Visual Studio „Memory” ablakán keresztül
• Megosztott memória
• Lokális memória
• Globális memória
• Egy memória terület megtekintéséhez: Debug/Windows/Memory
• Kernel nyomkövetés során a változó nevet is meg lehet adni a pontos cím helyett
• Direkt címek esetén használhatóak az alábbi kulcsszavak:
__shared__, __local__, __device__
Optimalizációs technikák
323 Created by XMLmind XSL-FO Converter.
• Például: (__shared__ float*)0
• Az általános Visual Studio funkciók itt is elérhetőek
• „Watch window” a kernel változók értékének megtekintéséhez
• A kurzort egy változó felé helyezve annak megjeleníti az aktuális értékét
• A beépített CUDA változók értéke szintén megtekinthető:
• threadIdx
• blockIdx
• blockDim
• gridDim
• stb.
4.4. CUDA Debug Focus
• A változók egy része a kontextushoz kötődik
• Szálakhoz kapcsolódik: regiszterek és a lokális memória
• Blokkokhoz kapcsolódik: a megosztott memória
• Ezek aktuális értékének megtekintéséhez értelemszerűen meg kell határozni a pontos kontextust is (blokk
index és szál index)
• Nsight/Windows/CUDA Debug Focus
4.36. ábra -
• Block: itt megadható a blokk index
• Thread: itt megadható a szál index
• A „Watch window/quick watch” stb. ennek megfelelően fogja mutatni a kiválasztott szál és blokk adatait
4.5. CUDA Device Summary
• Ez a funkció egy gyors áttekintést ad az elérhető eszközök adatairól
Optimalizációs technikák
324 Created by XMLmind XSL-FO Converter.
• Nsight/Windows/CUDA Device Summary funkció kiválasztása
• Ezt követően a megfelelő eszköz kiválasztása oldalt
• Jobb oldalon megjelenik számos statikus és futás közbeni adat
4.37. ábra -
4.6. CUDA Device Summary - rács
• Szintén az elérhető eszközökről ad futásidejő adatokat rács szinten
• Nsight/Windows/CUDA Device Summary funkció
• A megfelelő rács kiválasztható a bal oldali listából
4.38. ábra -
4.7. CUDA Device Summary - warp
• Az elérhető eszközökön épp futó warpokról ad tájékoztatást
Optimalizációs technikák
325 Created by XMLmind XSL-FO Converter.
• Nsight/Windows/CUDA Device Summary funkció
• Baloldalt kiválasztható a megfelelő warp
4.39. ábra -
• A fejlesztő itt tudja ellenőrizni az állapotát az összes aktuálisan futó warpnak
• SourceFile/SourceLine sorok kimondottan hasznosak lehetnek, ha meg akarjuk érteni a végrehajtási
mechanizmust
4.8. PTX code nyomkövetése
• Tools/Options/Debugging options kiválasztása
• Itt ki kell választani a „Enable Address Level Debugging” funkciót
• És ki kell választani a „Show disassembly if source is not available”-t
• Amikor a CUDA nyomkövetés megáll
• Ki kell választani a „Go to Disassembly” funkciót
• Ezt követően megjelenik a PTX kód (az SASS kód szintén elérhető)
• Maga a nyomkövetés egészen hasonló a CPU-k esetében megszokotthoz
4.40. ábra -
Optimalizációs technikák
326 Created by XMLmind XSL-FO Converter.
4.9. Memória ellenőrzés használata
• A CUDA memória ellenőrző funkció képes felderíteni különféle hibákat a globális és a megosztott
memóriában egyaránt. Ha a CUDA nyomkövető egy memória hozzáférési hibát észlel, nem mindig képes
pontosan meghatározni a hiba helyét. Ezekben az esetekben célszerű engedélyezni a CUDA memória
ellenőrzőt, majd így indítani újra az egész alkalmazást. A CUDA memória ellenőrző részletesebb adatokat
tartalmaz majd a hiba helyéről [22]
• Nsight/Options/CUDA kiválasztása
• „Enable Memory Checker” igazra állítása
• Ezt követően indítható az alkalmazás a CUDA nyomkövetővel
• Futás közben, ha a kernel nem megfelelő memóriaterületre próbál írni (tipikusan pl. tömb túlcímzésnél),
akkor a nyomkövetés meg fog állni
• A nyomkövető a hibát okozó utasítás lefuttatása előtt áll majd meg
• A CUDA memória ellenőrző pedig a részletes adatokat kiírja a kimenetre
• Indítási paraméterek
• Az észlelt problémák száma
• GPU állapota az egyes esetekben
• blokk index
• szál index
• forráskódon belül a sorszám
• A problémák összesítése
4.10. CUDA memória ellenőrző minta eredmény
================================================================================
CUDA Memory Checker detected 2 threads caused an access violation:
Launch Parameters
Optimalizációs technikák
327 Created by XMLmind XSL-FO Converter.
CUcontext = 003868b8
CUstream = 00000000
CUmodule = 0347e780
CUfunction = 03478980
FunctionName = _Z9addKernelPiPKiS1_
gridDim = {1,1,1}
blockDim = {5,1,1}
sharedSize = 0
Parameters:
Parameters (raw):
0x05200000 0x05200200 0x05200400
GPU State:
Address Size Type Block Thread blockIdx threadIdx PC Source
------------------------------------------------------------------------------------------
05200018 4 adr st 0 3 {0,0,0} {3,0,0} 0000f0 d:\sandbox\nsighttest\nsighttest\kernel.cu:12
05200020 4 adr st 0 4 {0,0,0} {4,0,0} 0000f0 d:\sandbox\nsighttest\nsighttest\kernel.cu:12
Summary of access violations:
================================================================================
Parallel Nsight Debug
Memory Checker detected 2 access violations.
error = access violation on store
blockIdx = {0,0,0}
threadIdx = {3,0,0}
address = 0x05200018
accessSize = 4
4.11. Lehetséges hibakódok és jelentésük
• CUDA memória ellenőrző hibakódok:
4.41. ábra -
Optimalizációs technikák
328 Created by XMLmind XSL-FO Converter.
329 Created by XMLmind XSL-FO Converter.
5. fejezet - CUDA könyvtárak
1. CUBLAS könyvtár
1.1. CUBLAS Library
• BLAS: Basic Linear Algebra Subprograms [14]
Basic Linear Algebra Subprograms (BLAS) egy olyan alkalmazásfejlesztési felület szabvány, amelyen
keresztül elérhetőek az alapvető lineáris algebra műveletek, mint például a vektor és mátrix műveletek.
Gyakran használatosak a HPC területen, általában egy megadott célhardverre optimalizált változatokkal
találkozhatunk. Gyakran maguk a hardver fejlesztők adják ki, mint pl. az Intel vagy az Nvidia
• CUBLAS: CUDA BLAS library
CUBLAS egy implementációja az előbb említett BLAS felületnek, amely a CUDA környezeten alapul.
Számos könnyen kezelhető adattípussal és függvénnyel rendelkezik. Használatához már nem szükséges a
CUDA driver
• Technikai részletek
• A CUBLAS könyvtárhoz tartozó fejléc: cublas.h
• A CUBLAS-t használó alkalmazásoknak a szerkesztéskor meg kell adni külön a DSO és DLL
állományokat, ami lehet a cublas.dll (Windows alkalmazások esetén) ha ténylegesen GPU-n futtatjuk,
• vagy a cublasemu.dll (Windows alkalmazások esetén) ha csak emulációra van lehetőség.
1.2. CUBLAS alapú alkalmazások fejlesztése
• 1. lépés - A szükséges CUBLAS adatszerkezetek létrehozása
• A CUBLAS számos funkciót nyújt a szükséges objektumok létrehozására és megszüntetésére a GPU
tárterületen
• Nincsenek különleges adattípusok (mint pl. vektor, mátrix), a függvények többnyire egyszerű típusos
mutatókat várnak paraméterül
• 2. lépés – Adatszerkezetek feltöltése adatokkal
• Speciális függvények állnak rendelkezésre, amelyek segítségével át lehet tölteni a központi memóriából a
GPU memóriába az adatokat
• 3. lépés - CUBLAS funkció(k) meghívása
• A fejlesztő ezt követően meg tud hívni egy, vagy akár egymás után több CUBLAS függvényt
• 4. lépés – Eredmények visszatöltése
• Végül a fejlesztő vissza tudja másolni az eredményeket a központi memóriába, hogy ott tovább
dolgozhasson azokkal
1.3. CUBLAS függvények visszatérési értéke
• A cublasStatus típus mutatja egy függvény lefutásának állapotát
• CUBLAS segítő függvények visszatérési értéke közvetlenül ez az állapot, az alapvető függvényeknél ezt a
cublasGetError( ) hívásával kapjuk meg
• Jelenleg ez az alábbi értékeket veheti fel:
CUDA könyvtárak
330 Created by XMLmind XSL-FO Converter.
5.1. ábra -
1.4. CUBLAS segítő függvények
• cublasStatus cublasInit( )
Inicializálja a CUBLAS könyvtárat: lefoglalja a szükséges erőforrásokat a GPU eléréséhez. Minden CUBLAS
függvényhívás előtt egyszer meg kell hívni.
Lehetséges visszatérési értékek:
• CUBLAS_STATUS_ALLOC_FAILED: Foglalás sikertelen volt
• CUBLAS_STATUS_SUCCESS: Inicializáció sikeres volt
• cublasStatus cublasShutdown( )
Leállítja a CUBLAS könyvtárat: felszabadít minden lefoglalt erőforrást
• Visszatérési értékek:
• CUBLAS_STATUS_NOT_INITIALIZED: A CUBLAS könyvtár nem lett inicializálva
• CUBLAS_STATUS_SUCCESS: Leállítás sikeresen megtörtént
• cublasStatus cublasGetError( )
Visszaadja az utolsó függvény által okozott hibakódot (státuszkódot). Csak az alapvető CUBLAS
függvényeknél használatos.
1.5. CUBLAS memória kezelés
• cublasStatus cublasAlloc(int n, int elemSize, void **ptr)
Létrehoz egy objektumot a GPU memóriában, amely alkalmas a megadott mennyiségű (n), megadott méretű
(elemSize) tárolására. A függvény a harmadik paraméteren keresztül adja vissza az erre mutató pointert.
• cublasStatus cublasFree(const void *ptr)
Felszabadítja a ptr mutató által mutatt objektumot.
• cublasStatus cublasSetVector(int n, int elemSize,
const void *x,
CUDA könyvtárak
331 Created by XMLmind XSL-FO Converter.
int incx,void *y,
int incy)
Ez a függvény átmásol egy n elemű vektort a központi memóriából (x mutatja a pontos helyét) a GPU
memóriába (az y által mutatott helyre). Incx és incy határozza meg az igazítást a forrás és a cél
adatszerkezetek esetében.
• cublasStatus cublasGetVector(int n, int elemSize,
const void *x,
int incx,void *y,
int incy)
Az előzőhöz hasonló, csak a másik irányba végzi el a másolást. Átmásol egy n elemű vektort a GPU
memóriából (x mutatja a pontos helyét) a központi memóriába (az y által mutatott helyre). Incx és incy
határozza meg az igazítást a forrás és a cél adatszerkezetek esetében.
1.6. BLAS függvények áttekintése
• A BLAS függvényeket három kategóriába sorolhatjuk: 1., 2. vagy 3. szintűek
• A CUBLAS könyvtár a szabványos BLAS-nak megfelelő bontást alkalmaz
• BLAS 1. szintű függvények
• Ezen a szinten vektor műveletek jelennek meg, mint pl. skalár vektor szorzás, vektor-vektor szorzás stb.
• A függvények az alábbi alcsoportokba rendezhetők:
• Egyszeres pontosságú valós BLAS1 függvények
• Egyszeres pontosságú komplex BLAS1 függvények
• Dupla pontosságú valós BLAS1 függvények
• Dupla pontosságú komplex BLAS1 függvények
• BLAS 2. szintű függvények
• Ezen a szinten mátrix-vektor műveletek találhatók. Mint például vektor-mátrix szorzás, egyenlet megoldás
stb.
• BLAS 3. szintű függvények
• Ezen a szinten a mátrix-mátrix műveletek találhatóak. Ezek általában a legáltalánosabban használható
funkciók.
1.7. Néhány CUBLAS 1. szintű függvény
• int cublasIsamax(int n, const float *x, int incx)
Visszaadja a maximális értékű elem legkisebb indexét (1-től kezdődő indexelést használ!)
• Parameterek:
• n: elemek szám a vektorban
• x: egyszeres pontosságú, n darab elemet tartalmazó vektor
• incx: igazítással együtt az elemek mérete
CUDA könyvtárak
332 Created by XMLmind XSL-FO Converter.
• Hiba kódok:
• CUBLAS_STATUS_NOT_INITIALIZED: A CUBLAS nincs inicializálva
• CUBLAS_STATUS_ALLOC_FAILED: Nem tudta lefoglalni a szükséges puffert
• CUBLAS_STATUS_EXECUTION_FAILED: Nem sikerült a GPU-n futtatás
• float cublasSasum(int n, const float *x, int incx)
• Visszaadja a vektor elemeinek az összegét
…
• A CUBLAS dokumentáció tartalmazza az összes többi elérhető funkciót
1.8. Néhány CUBLAS 2. szintű függvény
• void cublasSsbmv( char uplo,
int n,
int k,
float alpha,
const float *A,
int lda,
const float *x,
int incx,
float beta,
float *y,
int incy)
• Elvégzi az alábbi mátrix-vektor műveletet:
y = alpha * A * x + beta * y
ahol
• alpha, beta – skalárok
• x, y – vektorok
• A – mátrixok
• void cublasStrsv(char uplo, char trans, char diag, int n,
const float *A, int lda, float *x, int incx)
Megoldja a paraméterekkel megadott egyenletet
…
• A CUBLAS dokumentáció tartalmazza az összes többi elérhető funkciót
1.9. Néhány CUBLAS 3. szintű függvény
CUDA könyvtárak
333 Created by XMLmind XSL-FO Converter.
• void cublasSgemm( char transa,
char transb,
int m,
int n,
int k,
float alpha,
const float *A,
int lda,
const float *B,
int ldb,
float beta,
float *C,
int ldc)
• Elvégzi az alábbi mátrix-mátrix műveletet:
C = alpha * op(A) * op(B) + beta * C (where op(x) = x or op(x) = xT)
• ahol
• alpha, beta – skalárok
• lda, ldb, ldc – méretek
• A, B, C – mátrixok
• ha transa = ”T” akkor op(A) = AT
• ha transb = ”T” akkor op(B) = BT
• A CUBLAS dokumentáció tartalmazza az összes többi elérhető funkciót
334 Created by XMLmind XSL-FO Converter.
6. fejezet - CUDA verziók
1. CUDA 4 újdonságok
1.1. CUDA 4.0 újdonságai
GPU megosztása több szál között
• Könnyebben portolhatóak a többszálú alkalmazások. Több CPU szál képes használni egy GPU-t (OpenMP
esetén pl.)
• Konkurens szálak indítása különböző CPU szálakból (nincs szükség többé a kontextus váltásra)
• Új, egyszerűbb kontextus kezelő API (a régi továbbra is támogatott)
Egy szál elérhet minden GPU-t
• Minden hoszt szál elérheti az összes GPU-t
(tehát már nincs a régi 1 CPU szál – 1 GPU korlát)
• Így az egy szálas alkalmazások is jól ki tudják használni a több GPU-s környezetek előnyeit
• Jóval egyszerűbb így koordinálni több GPU-t
1.2. Aktuális eszköz kiválasztása
• Minden CUDA művelet az „aktuális” GPU-nak szól (kivéve az aszinkron P2P memória másolásokat)
• Ehhez ki kell választani a megfelelő eszközt a cudaSetDevice() függvénnyel cudaError_t cudaSetDevice(int
device)
cudaError_t cudaSetDevice(int device)
• Az első paraméter a szükséges eszköz azonosítója
• Ebből a hoszt szálból induló eszköz memória foglalások mind erre a GPU-ra vonatkoznak majd
(cudaMalloc(), cudaMallocPitch(), cudaMallocArray()) és maradnak is ezen az eszközön fizikailag
• Minden memóriafoglalás ebből a hoszt szálból a cudaMallocHost(), cudaHostAlloc() vagy
cudaHostRegister() függvényekkel csak a kapcsolt eszköz élettartamáig léteznek
• Minden új stream vagy esemény ehhez az eszközhöz lesz kapcsolva
• Minden kernel indítás a <<< >>> operátorral, vagy a cudaLaunch() függvénnyel, ezen a GPU-n lesz
lefuttatva
• Ez a hívás bármelyik hoszt szálból bármelyik GPU-ra vonatkozhat bármikor
• Ez a hívás nem okoz szinkronizációt sem a régi, sem az új eszközzel, és nem jár különösebb időveszteséggel
sem
1.3. Aktuális eszköz – stream, események
• Stream-ek és események eszközökhöz kapcsolódnak
• Stream-ek mindig az aktuális eszközön jönnek létre
• Az események mindig az aktuális eszközön jönnek létre
CUDA verziók
335 Created by XMLmind XSL-FO Converter.
• NULL stream (vagy 0 stream)
• Minden eszköz rendelkezik egy alapértelmezett stream-mel
• Az egyes eszközök esetén ez egymástól független
• Stream-ek és események használata
• Stream-ek csak a megadott eszközök eseményeit használhatják
• Aktuális eszköz használata
• Egy stream-et csak akkor lehet elérni, ha a hozzá tartozó eszköz is elérhető
1.4. Több-GPU példa
• Eszközök közötti szinkronizáció
• eventB esemény a streamB stream-hez kapcsolódik az 1. eszközön
• A cudaEventSynchronize híváskor a 0. az aktuális eszköz
6.1. ábra -
1.5. Több CPU szál használata
• Amennyiben egy CPU folyamat (process) több szállal is rendelkezik
• GPU kezelés azonos, mint az egy szálas környezetben
• Bármelyik szál kiválaszthatja az aktuális eszközt
• Minden szál kommunikálhat a GPU-val
• A folyamat egy saját memória területtel rendelkezik, minden szál el tudja érni ezt
• Több folyamat esetében
CUDA verziók
336 Created by XMLmind XSL-FO Converter.
• Minden folyamat egy saját memóriaterülettel rendelkezik
• Ez megfelel annak, mintha fizikailag távol helyezkednének el
• Ekkor valamilyen CPU alapú üzenetkezelést kell alkalmazni (MPI)
• Több hoszt esetén
• A CPU-knak kell megoldaniuk a kommunikációt egymás között
• A GPU-k szemszögéből ez megfelel az egygépes környezetnek
1.6. Vektor szorzás több-GPU-s környezetben - kernel
• Egy egyszerű szorzás: minden elemet szorozzunk meg kettővel
6.2. ábra -
1.7. Vektor szorzás több-GPU-s környezetben – memória foglalás
• Eszközökről információ lekérdezése, majd memória lefoglalása
6.3. ábra -
CUDA verziók
337 Created by XMLmind XSL-FO Converter.
1.8. Vektor szorzás több-GPU-s környezetben – kernel hívás
• Megfelelő eszköz kiválasztása
• A bemenet megfelelő részének átmásolása (aszinkron módon)
• Kernel elindítása az aktuális eszközön
• Eredmények visszamásolása (aszinkron módon)
• A ciklus lefuttatása minden eszközre
• Végül az összes eszköz szinkronizálása
6.4. ábra -
1.9. Vektor szorzás több-GPU-s környezetben – kernel hívás
CUDA verziók
338 Created by XMLmind XSL-FO Converter.
• Memória felszabadítása
• Eredmények kiírása
6.5. ábra -
2. CUDA 5 újdonságok
2.1. CUDA 5.0 újdonságok [26]
Dinamikus párhuzamosság
• GPU szálak dinamikusan tudnak indítani új szálakat, ezzel elősegítve a GPU-n történő további
adatfeldolgozást. Ezzel minimalizálni lehet a CPU-tól való függést, ami jelentősen leegyszerűsíti a
párhuzamos programozást. Továbbá lehetővé teszi az algoritmusok egy szélesebb körének megvalósítását.
GPU által hívható könyvtárak
• Az új CUDA BLAS könyvtár lehetővé teszi, hogy a felhasználók még jobban kihasználják a dinamikus
párhuzamosságot a GPU által is hívható könyvtárak segítségével. Ezekkel lehetőség nyílik arra is, hogy
valaki csak további API-kat fejlesszen, amik a későbbiekben tetszőleges projectekben használhatóak.
• Az object állományok szerkesztésének lehetősége lehetővé teszi a hatékony és már jól megismert módot a
GPU alkalmazások fejlesztésére. Ezzel a GPU programok is felbonthatók több kisebb részre, majd a
későbbiekben ezek a szerkesztéskor összefűzhetők.
GPUDirect támogatás
• Enables direct communication between GPUs and other PCI-E devices, and supports direct memory access
between network interface cards and the GPU.
2.2. Dinamikus párhuzamosság
6.6. ábra -
CUDA verziók
339 Created by XMLmind XSL-FO Converter.
Dinamikus párhuzamosság példa
• A programozó tudja használni a megszokott kernel indítási szintakszist egy kernelen belül is
• Az indítás szálonként megtörténik
• __synctreads() az összes indított szálra vonatkozik a blokkon belül
340 Created by XMLmind XSL-FO Converter.
7. fejezet - Felhasznált irodalom
1. Felhasznált irodalom
[1] Wikipedia – Graphics processing unit http://en.wikipedia.org/wiki/Graphics_processing_unit
[2] Wikipedia – Shader http://en.wikipedia.org/wiki/Shader
[3] S. Patidar, S. Bhattacharjee, J. M. Singh, P. J. Narayanan: Exploiting the Shader Model 4.0 Architecture
http://researchweb.iiit.ac.in/~shiben/docs/SM4_Skp-Shiben-Jag-PJN_draft.pdf
[4] Wikipedia – Unified shader model http://en.wikipedia.org/wiki/Unified_shader_model
[5] CUDA Programming Guide
http://developer.download.nvidia.com/compute/cuda/3_0/toolkit/docs/NVIDIA_CUDA_Programming
Guide.pdf
[6] S. Baxter: GPU Performance http://www.moderngpu.com/intro/performance.html
[7] K. Fatahalian: From Shader Code to a Teraflop: How Shader Cores Work
http://s08.idav.ucdavis.edu/fatahalian-gpu-architecture.pdf
[8] CUDA tutorial 4 – Atomic Operations http://supercomputingblog.com/cuda/cuda-tutorial-4-atomic-
operations
[9] Developing a Linux Kernel Module using RDMA for GPUDirect
http://www.moderngpu.com/intro/performance.html
[10] T. C. Schroeder: Peer-to-Peer & Unified Virtual Addressing
http://developer.download.nvidia.com/CUDA/training/cuda_webinars_GPUDirect_uva.pdf
[11] CUDA C Programming Guide http://docs.nvidia.com/cuda/cuda-c-programming-guide
[12] S. Rennich: CUDA C/C++ Streams and Concurrency
http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf
[13] P. Micikevicius: Multi-GPU Programming
http://developer.download.nvidia.com/CUDA/training/cuda_webinars_multi_gpu.pdf
[14] Wikipedia – Basic Linear Algebra Subprograms
http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
[15] NVIDIA CUBLAS http://developer.nvidia.com/cublas
[16] CUBLAS Library http://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-
doc/CUBLAS_Library.pdf
[17] J. Luitjens, S. Rennich: CUDA Warps and Occupancy
http://developer.download.nvidia.com/CUDA/training/cuda_webinars_WarpsAndOccupancy.pdf
[18] C. Zeller: CUDA Performance http://gpgpu.org/static/s2007/slides/09-CUDA-performance.pdf
[19] NVIDIA’s Next Generation: Fermi
http://www.nvidia.pl/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_White
paper.pdf
[20] Tom R. Halfhill: Parallel Processing with CUDA
http://www.nvidia.com/docs/IO/55972/220401_Reprint.pdf
Felhasznált irodalom
341 Created by XMLmind XSL-FO Converter.
[21] David Kirk, Wen-Mei Hwu:Programming Massively Parallel Processors courses
http://courses.ece.uiuc.edu/ece498/al/
[22] NVIDIA Nsight Visual Studio Edition 2.2 User Guide
http://http.developer.nvidia.com/NsightVisualStudio/2.2/Documentation/UserGuide/HTML/Nsight_Vi
sual_Studio_Edition_User_Guide.htm
[23] Memory Consistency http://parasol.tamu.edu/~rwerger/Courses/654/consistency1.pdf
[24] SIMD < SIMT < SMT: parallelism in NVIDIA GPUs http://www.yosefk.com/blog/simd-simt-smt-
parallelism-in-nvidia-gpus.html
[25] CUDA 5.0 production released http://gpuscience.com/software/cuda-5-0-production-released/
[26] S. Jones: Introduction to Dynamic Parallelism http://on-
demand.gputechconf.com/gtc/2012/presentations/S0338-GTC2012-CUDA-Programming-Model.pdf
2. Gyakran előforduló kifejezések fordításai
Néhány kifejezés esetében megmaradt az eredeti angol szó, mivel annak nincs elterjedt magyar megfelelője (pl.
kernel), vagy az félreértést okozna (stream – folyam, process –folyamat)