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
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
iii Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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 iv Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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) SMenké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) SMenké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) SMenké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 v Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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 vi Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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 vii Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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ú ALUkra [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 viii Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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 ix Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
2.6. CPU-GPGPU összehasonlítás .................................................................... 2.7. Memória szerkezete ................................................................................... 2.8. SIMT végrehajtás ....................................................................................... 2. Programozási modell ........................................................................................................ 1. CUDA környezet alapjai ......................................................................................... 1.1. CUDA környezet ........................................................................................ 1.2. Szükséges komponensek ............................................................................ 1.3. CUDA környezet áttekintése ...................................................................... 1.4. CUDA környezet részei ............................................................................. 1.5. CUDA szoftver rétegek .............................................................................. 1.6. CUDA alapú fejlesztés lépései ................................................................... 2. Fordítás és szerkesztés ............................................................................................ 2.1. CUDA fordítás lépései ............................................................................... 2.1.1. Bemenet ......................................................................................... 2.1.2. Kimenet ......................................................................................... 2.2. nvcc fordító alapvető paraméterei .............................................................. 2.2.1. Fordítás céljának meghatározása ................................................... 2.3. nvcc fordító alapvető paraméterei (2) ........................................................ 2.4. nvcc fordító alapvető paraméterei (3) ........................................................ 2.5. nvcc fordító alapvető paraméterei (4) ........................................................ 2.6. Példa parancssori fordításra ....................................................................... 2.7. Fordítás áttekintése .................................................................................... 3. Platform modell ...................................................................................................... 3.1. CUDA platform modell .............................................................................. 3.2. CUDA platform modell (2) ........................................................................ 3.3. Hozzáférés az eszközökhöz ........................................................................ 3.3.1. CUDA eszköz kiválasztása ............................................................ 3.4. Eszközök adatai .......................................................................................... 3.5. Eszközök adatainak lekérdezése ................................................................ 3.5.1. Feladat 2.3.1 .................................................................................. 4. Memória modell ..................................................................................................... 4.1. CUDA memória modell ............................................................................. 4.1.1. Kapcsolat a hoszttal ....................................................................... 4.2. CUDA memória modell – globális memória ............................................. 4.3. CUDA memória modell – konstans memória ............................................ 4.4. CUDA memória modell – textúra memória ............................................... 4.5. CUDA memória modell – megosztott memória ......................................... 4.6. CUDA memória modell – regiszterek ........................................................ 4.7. CUDA memória modell – lokális memória ............................................... 4.7.1. Deklaráció .................................................................................... 4.8. Memória modell fizikai leképezése ............................................................ 4.9. Memory handling ....................................................................................... 4.10. Memória területek elérhetőség szerint ..................................................... 4.11. Dinamikus memóriakezelés – foglalás ..................................................... 4.11.1. Memória felszabadítás ................................................................. 4.12. Memória területek közötti másolás .......................................................... 4.13. Rögzített memória (pinned memory) ....................................................... 4.14. Másolás nélküli memória (zero-copy memory) ....................................... 5. Végrehajtási modell ................................................................................................ 5.1. CUDA végrehajtási modell - szálak ........................................................... 5.2. CUDA blokkok .......................................................................................... 5.3. Blokkok azonosítása .................................................................................. 5.4. Globális – lokális index .............................................................................. 5.4.1. Lokális azonosító ........................................................................... 5.4.2. Globális azonosító ......................................................................... 5.5. Néhány alapvető összefüggés .................................................................... 5.6. CUDA végrehajtási modell – kernel .......................................................... 5.7. CUDA végrehajtási modell – kernel indítása ............................................. 5.8. Kernel indítással kapcsolatos típusok ........................................................ 5.9. Kernel implementálása ............................................................................... x Created by XMLmind XSL-FO Converter.
234 235 236 238 238 238 238 239 240 240 241 242 242 242 243 244 244 244 245 245 245 246 246 246 249 250 251 251 251 252 252 252 252 253 254 255 256 257 258 258 259 261 261 262 262 262 263 264 264 264 265 265 266 266 267 267 267 268 268 269
GPGPU-k és programozásuk
5.10. Kernel elindítás példa ............................................................................... 5.11. Blokkokat kezelő kernel implementálása ................................................. 5.12. Blokkokat kezelő kernel indítás példa ...................................................... 5.13. Teljes alkalmazás elkészítése ................................................................... 5.13.1. Feladat 2.5.1 ................................................................................ 3. Programozási környezet ................................................................................................... 1. Visual Studio használata ......................................................................................... 1.1. Visual Studio lehetőségek .......................................................................... 1.1.1. New project wizard ........................................................................ 1.2. New project wizard .................................................................................... 1.3. Custom build rules ..................................................................................... 1.4. CUDA-val kapcsolatos project beállítások ................................................ 2. Számítási képességek ............................................................................................. 2.1. Számítási képességek (1) ........................................................................... 2.2. Számítási képességek (2) ........................................................................... 2.3. Számítási képességek (3) ........................................................................... 2.4. Compute capability (4) ................................................................................ 2.5. Néhány Nvidia GPU számítási képessége .................................................. 2.6. Néhány Nvidia GPU számítási képessége .................................................. 3. CUDA nyelvi kiterjesztés ....................................................................................... 3.1. CUDA language extensions ....................................................................... 3.2. Mindkét oldalon elérhető típusok ............................................................... 3.2.1. dim3 típus ..................................................................................... 3.3. Mindkét oldalon elérhető függvények ........................................................ 3.4. Csak eszköz oldalon elérhető változók ...................................................... 3.5. Csak eszköz oldalon elérhető függvények ................................................. 3.6. Csak hoszt oldalon elérhető függvények .................................................... 4. Aszinkron konkurens végrehajtás ........................................................................... 4.1. Stream-ek ................................................................................................... 4.2. Stream-ek létrehozás és megszüntetése ...................................................... 4.3. Stream-ek használata .................................................................................. 4.4. Példa a stream-ek használatára ................................................................... 4.5. Stream szinkronizáció ................................................................................ 4.6. Szinkronizációt magukba foglaló műveletek ............................................. 4.7. Stream időzítés [12] ................................................................................... 4.8. Konkurens végrehajtás támogatása ............................................................ 4.9. Példa blokkolt sorra ................................................................................... 4.10. Példa blokkolt sorra (2) ............................................................................ 5. CUDA események .................................................................................................. 5.1. Események létrehozása és megszüntetése .................................................. 5.2. Esemény rögzítése ...................................................................................... 5.3. Esemény szinkronizálása ........................................................................... 5.4. Esemény ellenőrzése .................................................................................. 5.5. Szinkronizáció eseményekkel .................................................................... 5.6. Szinkronizáció eseményekkel (példa) ........................................................ 5.7. Események között eltelt idő számítása ....................................................... 5.8. Eltelt idő számítása (példa) ........................................................................ 6. Egyesített Virtuális Címtér ..................................................................................... 6.1. CUDA Unified Virtual Address Management ........................................... 6.2. Egyesített Virtuális Címtér (UVA) ............................................................ 6.3. Egyesített Virtuális Címtér – elérhetőség ................................................... 6.4. Peer to peer kommunikáció az eszközök között ......................................... 6.5. UVA és a P2P átvitel .................................................................................. 6.6. P2P memória átvitel GPU-k között ............................................................ 6.7. P2P memória másolás GPU-k között ......................................................... 6.8. P2P memória hozzáférést bemutató kernel ................................................ 6.9. CUDA UVA összegzés .............................................................................. 4. Optimalizációs technikák ................................................................................................. 1. Megosztott memória használata ............................................................................. 1.1. Optimalizációs stratégiák ........................................................................... xi Created by XMLmind XSL-FO Converter.
269 270 270 270 271 272 272 272 272 272 273 274 275 275 276 276 277 277 277 278 278 278 278 278 279 279 280 281 281 281 282 283 283 283 284 284 285 285 286 286 286 287 287 288 288 289 289 289 289 290 290 291 292 292 293 293 294 295 295 295
GPGPU-k és programozásuk
1.2. Mátrix szorzó alkalmazás elkészítése ........................................................ 1.2.1. Feladat 4.1.1 .................................................................................. 1.3. Többdimenziós mátrix a memóriában ........................................................ 1.4. Többdimenziós mátrix a memóriában ........................................................ 1.5. Több dimenziós mátrix a GPU memóriában ............................................... 1.6. Igazított elhelyezés ..................................................................................... 1.7. Igazított memóriakezelés ........................................................................... 1.8. Igazított memória másolása ........................................................................ 1.9. Mátrix szorzó alkalmazás elkészítése igazított memóriával ....................... 1.9.1. Feladat 4.1.2 .................................................................................. 1.10. Kernel igazított memóriakezeléssel .......................................................... 1.11. Kernel hívása igazított tömbök esetén ...................................................... 1.12. Megosztott memória kezelése .................................................................. 1.13. Ötlet a mátrix szorzás gyorsítására (csempe technika) ............................. 1.14. Mátrix szorzó alkalmazás elkészítése (megosztott memóriával) .............. 1.14.1. Feladat 4.1.3 ................................................................................ 1.15. Mátrix szorzás gyorsítása ......................................................................... 1.16. Mátrix szorzás gyorsítása (2) ................................................................... 1.17. Mátrix szorzás gyorsítása (3) ................................................................... 1.18. Mátrix szorzás gyorsítása (4) ................................................................... 1.19. Mátrix szorzás gyorsítása (5) ................................................................... 1.20. Optimalizált mátrix szorzás kernel ........................................................... 1.21. Összehasonlító vizsgálat .......................................................................... 2. Atomi műveletek használata ................................................................................... 2.1. Atomi műveletek szükségessége ................................................................ 2.2. CUDA atomi műveletek ............................................................................. 2.3. CUDA atomi műveletek - aritmetika ......................................................... 2.4. CUDA atomi műveletek – aritmetika (2) ................................................... 2.5. CUDA atomi műveletek – logikai függvények .......................................... 2.5.1. Feladat 4.2.1 .................................................................................. 2.6. Vektor legkisebb elemének értéke ............................................................. 2.6.1. Feladat 4.2.2 .................................................................................. 2.7. Memóriahozzáférések csökkentése – megosztott memória ........................ 2.7.1. Összehasonlító vizsgálat ................................................................ 2.8. Blokkon belüli párhuzamosítás .................................................................. 2.8.1. Feladat 4.2.3 .................................................................................. 2.9. Párhuzamos minimum - betöltés ................................................................ 2.10. Párhuzamos minimum – blokk minimuma .............................................. 2.11. Párhuzamos minimum - kernel ................................................................ 2.12. Párhuzamos minimum – kernel (2) .......................................................... 2.13. Összehasonlító vizsgálat .......................................................................... 2.14. Összehasonlító vizsgálat .......................................................................... 3. Kihasználtság .......................................................................................................... 3.1. A végrehajtás áttekintése ............................................................................ 3.2. Kihasználtság ............................................................................................. 3.3. Kihasználtság és a regiszterek kapcsolata .................................................. 3.4. Kihasználtság és megosztott memória ....................................................... 3.5. Kihasználtság és blokk méret ..................................................................... 3.6. CUDA Occupancy calculator ..................................................................... 3.7. CUDA Occupancy calculator - példa ......................................................... 3.8. CUDA Occupancy calculator – változó blokk méret hatása ...................... 3.9. CUDA Occupancy calculator – változó regiszter szám hatása .................. 3.10. CUDA Occupancy calculator – változó megosztott memória hatása ....... 3.11. Blokk mérettel kapcsolatos javaslatok [18] .............................................. 4. Parallel Nsight ........................................................................................................ 4.1. Parallel Nsight ............................................................................................ 4.2. Kernel nyomkövetés .................................................................................. 4.3. GPU memória régiók megtekintése ........................................................... 4.4. CUDA Debug Focus .................................................................................. 4.5. CUDA Device Summary ............................................................................ xii Created by XMLmind XSL-FO Converter.
295 295 296 297 297 298 299 299 300 300 300 301 301 302 302 302 303 303 304 305 306 307 308 308 308 308 309 309 310 310 310 310 310 311 312 312 312 313 314 314 314 315 315 315 316 316 317 317 318 318 319 319 320 320 321 321 322 322 323 323
GPGPU-k és programozásuk
4.6. CUDA Device Summary - rács .................................................................. 4.7. CUDA Device Summary - warp ................................................................ 4.8. PTX code nyomkövetése ............................................................................ 4.9. Memória ellenőrzés használata .................................................................. 4.10. CUDA memória ellenőrző minta eredmény ............................................. 4.11. Lehetséges hibakódok és jelentésük ......................................................... 5. CUDA könyvtárak ........................................................................................................... 1. CUBLAS könyvtár ................................................................................................. 1.1. CUBLAS Library ....................................................................................... 1.2. CUBLAS alapú alkalmazások fejlesztése .................................................. 1.3. CUBLAS függvények visszatérési értéke .................................................. 1.4. CUBLAS segítő függvények ...................................................................... 1.5. CUBLAS memória kezelés ........................................................................ 1.6. BLAS függvények áttekintése .................................................................... 1.7. Néhány CUBLAS 1. szintű függvény ........................................................ 1.8. Néhány CUBLAS 2. szintű függvény ........................................................ 1.9. Néhány CUBLAS 3. szintű függvény ........................................................ 6. CUDA verziók ................................................................................................................. 1. CUDA 4 újdonságok .............................................................................................. 1.1. CUDA 4.0 újdonságai ................................................................................ 1.2. Aktuális eszköz kiválasztása ...................................................................... 1.3. Aktuális eszköz – stream, események ........................................................ 1.4. Több-GPU példa ........................................................................................ 1.5. Több CPU szál használata .......................................................................... 1.6. Vektor szorzás több-GPU-s környezetben - kernel .................................... 1.7. Vektor szorzás több-GPU-s környezetben – memória foglalás .................. 1.8. Vektor szorzás több-GPU-s környezetben – kernel hívás .......................... 1.9. Vektor szorzás több-GPU-s környezetben – kernel hívás .......................... 2. CUDA 5 újdonságok .............................................................................................. 2.1. CUDA 5.0 újdonságok [26] ....................................................................... 2.2. Dinamikus párhuzamosság ......................................................................... 7. Felhasznált irodalom ........................................................................................................ 1. Felhasznált irodalom ............................................................................................... 2. Gyakran előforduló kifejezések fordításai ...............................................................
xiii Created by XMLmind XSL-FO Converter.
324 324 325 326 326 327 329 329 329 329 329 330 330 331 331 332 332 334 334 334 334 334 335 335 336 336 337 337 338 338 338 340 340 341
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
xiv Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
2.43. A végrehajtási tartomány felbontása munkacsoportokra ......................................................... 2.44. A végrehajtási tartomány felbontása munkacsoportokra ......................................................... 2.45. ................................................................................................................................................. 2.46. ................................................................................................................................................. 2.47. ................................................................................................................................................. 2.48. ................................................................................................................................................. 2.49. A végrehajtás modell fő fogalmai ............................................................................................ 2.50. ................................................................................................................................................. 2.51. A végrehajtás modell fő fogalmai ............................................................................................ 2.52. Elágazások végrehajtása - 1 [26] ............................................................................................. 2.53. Elágazások végrehajtása - 2 [26] ............................................................................................. 2.54. Utasítás folyam végrehajtásának folytatása elágazás után [26] ............................................... 2.55. A végrehajtás modell fő fogalmai ............................................................................................ 2.56. ................................................................................................................................................. 2.57. ................................................................................................................................................. 2.58. ................................................................................................................................................. 2.59. ................................................................................................................................................. 2.60. ................................................................................................................................................. 2.61. ................................................................................................................................................. 2.62. ................................................................................................................................................. 2.63. ................................................................................................................................................. 2.64. ................................................................................................................................................. 2.65. ................................................................................................................................................. 2.66. ................................................................................................................................................. 2.67. ................................................................................................................................................. 3.1. A SIMT végrehajtás megvalósítási alternatívái ......................................................................... 3.2. Az Nvidia és AMD/ATI GPGPU vonalainak áttekintése .......................................................... 3.3. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (1) .................... 3.4. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (2) .................... 3.5. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (3) .................... 3.6. Main features of Nvidia’s dual-GPU graphics cards [33], [34] ................................................. 3.7. Az AMD/ATI duál-GPU grafikus kártyáinak főbb jellemzői [35] ............................................ 3.8. ................................................................................................................................................... 3.9. Az Nvidia Fermi előtti grafikus kártyái [33] ............................................................................ 3.10. A MAD (Multiply-ADD - Szorzás-Összeadás) művelet értelmezése [51] .............................. 3.11. ................................................................................................................................................. 3.12. Az Nvidia Fermi alapú grafikus kártyáinak főbb jellemzői [33] ............................................. 3.13. Az Nvidia Kepler alapú grafikus kártyáinak főbb jellemzői [33] ........................................... 3.14. ................................................................................................................................................. 3.15. ................................................................................................................................................. 3.16. ................................................................................................................................................. 3.17. ................................................................................................................................................. 3.18. ................................................................................................................................................. 3.19. ................................................................................................................................................. 3.20. Az AMD/ATI korai grafikus kártyáinak főbb jellemzői -1 [35] ............................................. 3.21. Az AMD/ATI korai grafikus kártyáinak főbb jellemzői - 2 [35] ............................................. 3.22. Az AMD Southern Islands sorozatú grafikus kártyái [35] ...................................................... 3.23. Az AMD Northern Islands sorozatú grafikus kártyái [35] ...................................................... 3.24. AMD Southern Islands sorozatú (GCN) grafikus kártyái [35] ................................................ 3.25. Az AMD Sea Islands sorozatú grafikus kártyáinak főbb jellemzői [45] ................................. 3.26. ATI HD 5870 (RV870 alapú) [43] ......................................................................................... 3.27. ATI HD 5970: 2 x ATI HD 5870 némileg csökkentett memória órajellel ............................... 3.28. ATI HD 5970: 2 x ATI HD 5870 valamelyest csökkentett memória órajellel ........................ 3.29. AMD HD 6990: 2 x ATI HD 6970 valamelyest csökkentett memória és shader órajellel ...... 3.30. AMD HD 7970 ........................................................................................................................ 3.31. GPU árak összehasonlítása 2012 nyarán ................................................................................. 4.1. GPGPU magok, kártyák, valamint az azokat támogató szoftverek áttekintése (2) .................... 4.2. ................................................................................................................................................... 4.3. ................................................................................................................................................... 4.4. ................................................................................................................................................... xv Created by XMLmind XSL-FO Converter.
44 44 45 45 46 46 47 48 48 49 49 50 50 51 52 52 53 53 54 55 56 56 56 57 58 59 59 60 60 61 62 62 62 63 64 64 65 66 67 68 69 69 70 70 71 72 72 73 74 74 75 76 76 77 77 78 80 80 81 82
GPGPU-k és programozásuk
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 xvi Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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 xvii Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
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 xviii Created by XMLmind XSL-FO Converter.
GPGPU-k és programozásuk
9.25. ............................................................................................................................................... 9.26. ............................................................................................................................................... 9.27. ............................................................................................................................................... 9.28. ............................................................................................................................................... 1.1. [11] .......................................................................................................................................... 1.2. ................................................................................................................................................. 1.3. [3] ............................................................................................................................................ 1.4. [5] ............................................................................................................................................ 1.5. [3] ............................................................................................................................................ 1.6. [7] ............................................................................................................................................ 2.1. ................................................................................................................................................. 2.2. [5] ............................................................................................................................................ 2.3. [5] ............................................................................................................................................ 2.4. [2] ............................................................................................................................................ 2.5. ................................................................................................................................................. 2.6. ................................................................................................................................................. 2.7. [5] ............................................................................................................................................ 2.8. [5] ............................................................................................................................................ 2.9. ................................................................................................................................................. 2.10. ............................................................................................................................................... 2.11. ............................................................................................................................................... 2.12. ............................................................................................................................................... 2.13. [5] .......................................................................................................................................... 2.14. ............................................................................................................................................... 2.15. [5] .......................................................................................................................................... 2.16. ............................................................................................................................................... 2.17. [5] .......................................................................................................................................... 2.18. [5] .......................................................................................................................................... 2.19. ............................................................................................................................................... 2.20. [5] .......................................................................................................................................... 2.21. ............................................................................................................................................... 2.22. [5] .......................................................................................................................................... 2.23. ............................................................................................................................................... 2.24. [5] .......................................................................................................................................... 2.25. [5] .......................................................................................................................................... 2.26. ............................................................................................................................................... 2.27. ............................................................................................................................................... 2.28. ............................................................................................................................................... 2.29. ............................................................................................................................................... 2.30. ............................................................................................................................................... 2.31. [5] .......................................................................................................................................... 2.32. ............................................................................................................................................... 2.33. [5] .......................................................................................................................................... 2.34. ............................................................................................................................................... 2.35. ............................................................................................................................................... 2.36. ............................................................................................................................................... 2.37. ............................................................................................................................................... 2.38. ............................................................................................................................................... 3.1. ................................................................................................................................................. 3.2. ................................................................................................................................................. 3.3. ................................................................................................................................................. 3.4. ................................................................................................................................................. 3.5. ................................................................................................................................................. 3.6. ................................................................................................................................................. 3.7. [12] .......................................................................................................................................... 3.8. ................................................................................................................................................. 3.9. ................................................................................................................................................. 3.10. ............................................................................................................................................... 3.11. ............................................................................................................................................... 3.12. ............................................................................................................................................... xix Created by XMLmind XSL-FO Converter.
215 216 217 218 231 231 233 234 235 237 238 239 241 242 245 246 247 249 250 251 251 252 252 253 254 254 255 255 256 257 257 258 259 259 260 261 261 262 262 263 263 264 266 268 269 269 270 270 272 273 274 274 277 277 281 282 282 282 283 283
GPGPU-k és programozásuk
3.13. ............................................................................................................................................... 3.14. [12] ........................................................................................................................................ 3.15. [12] ........................................................................................................................................ 3.16. ............................................................................................................................................... 3.17. ............................................................................................................................................... 3.18. ............................................................................................................................................... 3.19. ............................................................................................................................................... 3.20. ............................................................................................................................................... 3.21. ............................................................................................................................................... 3.22. ............................................................................................................................................... 3.23. [9] .......................................................................................................................................... 3.24. ............................................................................................................................................... 3.25. [10] ........................................................................................................................................ 3.26. ............................................................................................................................................... 3.27. ............................................................................................................................................... 3.28. ............................................................................................................................................... 3.29. ............................................................................................................................................... 3.30. ............................................................................................................................................... 3.31. ............................................................................................................................................... 3.32. ............................................................................................................................................... 3.33. ............................................................................................................................................... 3.34. ............................................................................................................................................... 3.35. ............................................................................................................................................... 4.1. ................................................................................................................................................. 4.2. ................................................................................................................................................. 4.3. ................................................................................................................................................. 4.4. ................................................................................................................................................. 4.5. ................................................................................................................................................. 4.6. ................................................................................................................................................. 4.7. ................................................................................................................................................. 4.8. ................................................................................................................................................. 4.9. ................................................................................................................................................. 4.10. ............................................................................................................................................... 4.11. ............................................................................................................................................... 4.12. ............................................................................................................................................... 4.13. ............................................................................................................................................... 4.14. ............................................................................................................................................... 4.15. ............................................................................................................................................... 4.16. ............................................................................................................................................... 4.17. ............................................................................................................................................... 4.18. ............................................................................................................................................... 4.19. ............................................................................................................................................... 4.20. ............................................................................................................................................... 4.21. ............................................................................................................................................... 4.22. ............................................................................................................................................... 4.23. ............................................................................................................................................... 4.24. ............................................................................................................................................... 4.25. ............................................................................................................................................... 4.26. ............................................................................................................................................... 4.27. ............................................................................................................................................... 4.28. ............................................................................................................................................... 4.29. ............................................................................................................................................... 4.30. ............................................................................................................................................... 4.31. ............................................................................................................................................... 4.32. ............................................................................................................................................... 4.33. ............................................................................................................................................... 4.34. ............................................................................................................................................... 4.35. ............................................................................................................................................... 4.36. ............................................................................................................................................... 4.37. ............................................................................................................................................... xx Created by XMLmind XSL-FO Converter.
283 285 285 286 286 287 287 287 288 289 290 290 291 292 292 292 292 292 293 293 293 293 294 296 296 297 297 297 297 298 298 298 300 301 301 301 301 303 303 304 305 306 307 308 310 311 311 313 313 314 314 314 315 318 319 319 320 322 323 324
GPGPU-k és programozásuk
4.38. ............................................................................................................................................... 4.39. ............................................................................................................................................... 4.40. ............................................................................................................................................... 4.41. ............................................................................................................................................... 5.1. ................................................................................................................................................. 6.1. ................................................................................................................................................. 6.2. ................................................................................................................................................. 6.3. ................................................................................................................................................. 6.4. ................................................................................................................................................. 6.5. ................................................................................................................................................. 6.6. .................................................................................................................................................
xxi Created by XMLmind XSL-FO Converter.
324 325 325 327 330 335 336 336 337 338 338
I. rész - GPGPU-k
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
2 Created by XMLmind XSL-FO Converter.
GPGPU-k
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 3 Created by XMLmind XSL-FO Converter.
GPGPU-k
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 4 Created by XMLmind XSL-FO Converter.
GPGPU-k
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 5 Created by XMLmind XSL-FO Converter.
GPGPU-k
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 6 Created by XMLmind XSL-FO Converter.
GPGPU-k
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
7 Created by XMLmind XSL-FO Converter.
GPGPU-k
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
8 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.
ix 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 -
10 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
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]
11 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
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) 12 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
ú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]
13 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
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 -
14 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
4. AMD GPU-k csúcs FP32 teljesítménye [8] 1.9. ábra -
15 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
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] 16 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
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 17 Created by XMLmind XSL-FO Converter.
Bevezetés a GPGPU-kba
18 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 19 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 (fejlesztőkészletek) használatával, amint azt a lenti ábra szemlélteti.
2.4. ábra -
20 Created by XMLmind XSL-FO Converter.
a
megfelelő
nyelvi
eszközök
A GPGPU modell virtuális gép elve
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 -
21 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 GPGPUjuk 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].
22 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
• 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
23 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
24 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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]
25 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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)
26 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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]
27 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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. 28 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 29 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
• 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 -
30 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 31 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
• 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 -
32 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
33 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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), 34 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
35 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
36 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
37 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
38 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
39 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
40 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
41 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
42 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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. 43 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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. 44 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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). 45 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
• 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ó CUra, 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 -
46 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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.
47 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
48 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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]
49 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
50 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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. 51 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 52 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
53 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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
54 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
• 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 -
55 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
56 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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 -
57 Created by XMLmind XSL-FO Converter.
A GPGPU modell virtuális gép elve
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].
58 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
59 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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)
60 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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, 61 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése • 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 -
62 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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.
63 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése 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:
64 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése • 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). 65 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése 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]
66 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
2.1.2. Az Nvidia GPGPU kártyáinak pozicionálása a termékspektrumukon belül [41] 3.14. ábra -
67 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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ú)
68 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
3.16. ábra -
2.2.3. Nvidia GeForce GTX 480 és 580 kártyák [44] 3.17. ábra -
69 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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 -
70 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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]
71 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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]
72 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
3.23. ábra - Az AMD Northern Islands sorozatú grafikus kártyái [35]
73 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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]
74 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
3.2. Példák AMD grafikus kártyákra 3.26. ábra - ATI HD 5870 (RV870 alapú) [43]
75 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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
76 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
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
77 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
3.2.5. GPGPU árak 2012 nyarán [50] 3.31. ábra - GPU árak összehasonlítása 2012 nyarán
78 Created by XMLmind XSL-FO Converter.
GPGPU magok és kártyák áttekintése
79 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 -
80 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 RISCszerű load/store architektúrát valósít meg.
81 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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 -
82 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 -
83 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 APIkat • Ú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. 84 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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 85 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 -
86 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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. 87 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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.
88 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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] 89 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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]
90 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
4.3. Az Nvidia GPGPU-k magasszintű mikroarchitektúrájának fejlődése [52] 4.14. ábra -
91 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 92 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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 93 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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] 94 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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] 95 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
4.20. ábra -
4.7.2. Egy ALU („CUDA mag”) 4.21. ábra - A single ALU [57]
Megjegyzés
96 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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 97 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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 SMhez. (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 -
98 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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,
99 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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 -
100 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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), 101 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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
102 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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]
103 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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.
104 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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
105 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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]
106 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
4.20. Példa: Aritmetikai műveletek kibocsájtási sebessége (művelet/órajel) SM-enként [13] 4.33. ábra -
107 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 -
108 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 109 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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.
110 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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]
111 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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
112 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák • 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]
113 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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
114 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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]
115 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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]
116 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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
117 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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 -
118 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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:
119 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák 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]
120 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
4.45. ábra -
6.3. A Fermi négy alcsaládjának magjait (SM egységeit) ábrázoló blokkdiagramm [66] 4.46. ábra -
121 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
6.4. A GF 100/110 aritmetikai műveletvégzési sebessége (művelet/óraciklus) SM-enként [13] 4.47. ábra -
122 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 -
123 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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].
124 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
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 -
125 Created by XMLmind XSL-FO Converter.
Az Nvidia Fermi családhoz tartozó magok és kártyák
126 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
127 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 -
128 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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. 129 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák • 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]
130 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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]
131 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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]
132 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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]
133 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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]
134 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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
135 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák 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. 136 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 137 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák 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.
138 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 -
139 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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]. 140 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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.
141 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 -
142 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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
143 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák 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:
144 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 -
145 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
4.4. A Kepler GK104 mag SMX-ének blokkdiagrammja [76] 5.33. ábra -
146 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák 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 -
147 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 = 192 és
FP32
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).
148 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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 -
149 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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]
150 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
5.39. ábra -
5.3.2. Az Nvidia Kepler GK110 magjának felépítése [79] 5.40. ábra -
151 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
5.3.3. Az Nvidia GK110 és GK104 magjainak összehasonlítása [79] 5.41. ábra -
152 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
5.3.4. A Kepler GK110 SMX-ének blokkdiagrammja [70] 5.42. ábra -
153 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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.
154 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák 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 -
155 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
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.
156 Created by XMLmind XSL-FO Converter.
Az Nvidia Kepler családhoz tartozó magok és kártyák
5.46. ábra -
157 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
158 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája
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
159 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája 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 -
160 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája
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
161 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája
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
162 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája
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]
163 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája 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 -
164 Created by XMLmind XSL-FO Converter.
Az AMD heterogén rendszerarchitektúrája
2.9. Az AMD útiterve a HSA implementációjára - részletezés [85] 6.10. ábra -
165 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
166 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák • 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 167 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
168 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
169 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
170 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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.
171 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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
172 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
173 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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
174 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák 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 -
175 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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
176 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák 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 VLIWalapú 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] 177 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák • 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. 178 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák • 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 -
179 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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)
180 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
181 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
182 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
183 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
184 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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
185 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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:
186 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák 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 10 12 = 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 -
187 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
188 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
189 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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)
190 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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]
191 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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.
192 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák 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. 193 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák • 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] 194 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
195 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
196 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
197 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
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 -
198 Created by XMLmind XSL-FO Converter.
Az AMD Southern Islands családhoz tartozó magok és kártyák
199 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 -
200 Created by XMLmind XSL-FO Converter.
Az AMD Sea Islands családja
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.
201 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 MICnek (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. 202 Created by XMLmind XSL-FO Converter.
Kitekintés
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 203 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
204 Created by XMLmind XSL-FO Converter.
Kitekintés
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.
205 Created by XMLmind XSL-FO Converter.
Kitekintés
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 206 Created by XMLmind XSL-FO Converter.
Kitekintés
• 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]
207 Created by XMLmind XSL-FO Converter.
Kitekintés
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.
208 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
209 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
210 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
211 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
212 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
213 Created by XMLmind XSL-FO Converter.
Kitekintés
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 214 Created by XMLmind XSL-FO Converter.
Kitekintés
4.19. A Xeon Phi 5110P sebességének összehasonlítása egy 2processzoros 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 -
215 Created by XMLmind XSL-FO Converter.
Kitekintés
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 -
216 Created by XMLmind XSL-FO Converter.
Kitekintés
4.23. b) Az Nvidia Tesla GPGPU-inak FP64 teljesítménye 9.27. ábra -
217 Created by XMLmind XSL-FO Converter.
Kitekintés
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.
218 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-JagPJN_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, http://www.nvidia.com/page/8800_tech_briefs.html
[7]
CUDA C Programming guide/index.html
Guide,
Nvidia.com,
Vers.
0.1,
Nov.
2006,
Nvidia,
http://docs.nvidia.com/cuda/cuda-c-programming-
[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. pdf [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. pdf
[14]
OpenCL Introduction and Overview, Chronos Group, http://www.khronos.org/developers/library/overview/opencl_overview.pdf
[15]
The OpenCL Specification, V1.1, Document Revision: http://developer.amd.com/wordpress/media/2012/10/opencl-1.1.pdf
44,
June Jan.
2010, 6
2011,
[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 http://pc.watch.impress.co.jp/video/pcw/docs/532/796/p17.pdf
Evolution,
2010,
[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 219 Created by XMLmind XSL-FO Converter.
Hivatkozások
[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 http://sa09.idav.ucdavis.edu/docs/SA09_NVIDIA_IHV_talk.pdf
[22]
Hensley J., Yang J., Compute Abstraction Layer, http://coachk.cs.ucf.edu/courses/CDA6938/s08/UCF-2008-02-01a.pdf
GPUs, AMD,
Nvidia,
Febr.
1
2008,
[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] [25]
Balfour J., CUDA Threads and Atomics, bin/images/3/34/Darve_cme343_cuda_3.pdf
April
25
Kogo H., RV770 Overview, PC http://pc.watch.impress.co.jp/docs/2008/0702/kaigai_09.pdf
2011,
Watch,
http://mc.stanford.edu/cgiJuly
02
2008,
[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 http://developer.download.nvidia.com/compute/cuda/4_0_rc2/toolkit/docs/ptx_isa_2.3.pdf
2011,
[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.0provisional.pdf [30]
Nvidia OpenCL Overview, OpenCLIntroduction.pdf
2009
http://gpgpu.org/wp/wp-content/uploads/2009/06/05-
[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 http://en.wikipedia.org/wiki/Comparison_of_Nvidia_graphics_processing_units
[34]
SLI Minimum System Requirements, http://www.geforce.com/hardware/technology/sli/system-requirements
[35]
Wikipedia, Comparison of AMD graphics processing http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units
units,
Geforce.com, 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 http://forums.nvidia.com/index.php?showtopic=73056
[38]
NVIDIA G80: Architecture and GPU http://www.beyond3d.com/content/reviews/1/11
Computing
Analysis,
220 Created by XMLmind XSL-FO Converter.
Beyond3D,
Discussion, Nov.
8
2008 2006,
Hivatkozások
[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-unifiedarchitecture/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-580review-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-2303497179-0-0-0-jpg-.html [47] Tom’s Hardware Gallery, http://www.tomshardware.com/gallery/two-cypress-gpus,0101-230369-7179-00-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/481amd-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-reviewcatching-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_FermiThe_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 =print [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-se1gb-review-2.html [56] NVIDIA GF100 Architecture Details, Geeks3D, 2008-2010, http://www.geeks3d.com/20100118/nvidiagf100-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
221 Created by XMLmind XSL-FO Converter.
Hivatkozások
[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-gtx480,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-iitop,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-28nmyields/#.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/nvidiadoc/sdk-cuda-doc/C/doc/ptx_isa_3.0.pdf [72] [73]
NVIDIA CUDA Programming Guide, Version 3.0, Febr. http://zega.web.elte.hu/jegyz/gpu_prog/NVIDIA_CUDA_Programming_Guide_3.0.PDF
9
NVIDIA Kepler GK110 Next-Generation CUDA Compute Architecture, May http://www.nvidia.com/content/PDF/kepler/NV_DS_Tesla_KCompute_Arch_May_2012_LR.pdf
2010, 12,
[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-FastestMost-Efficient-Accelerators-Powers-World-s-No-1-Supercomputer-8b6.aspx [75]
ORNL Debuts Titan Supercomputer, content/themes/olcf/titan/Titan_Debuts.pdf
OLCF,
[76]
Whitepaper, NVIDIA GeForce GTX 680. V1.0, http://www.geforce.com/Active/en_US/en_US/pdf/GeForce-GTX-680-Whitepaper-FINAL.pdf
222 Created by XMLmind XSL-FO Converter.
http://www.olcf.ornl.gov/wp2012,
Hivatkozások
[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-reviewedFermi-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-ii4gb-two-slot-revision/ [81]
Norem J., Nvidia Unleashes the Titan, Maximum http://www.maximumpc.com/article/news/nvidia_unleashes_titan2013
PC,
Febr.
19
2013,
[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-heterogeneoussystems-architecture/ [83]
Halfacree G., AMD ditches Fusion branding, Bit-Tech, Jan. tech.net/news/hardware/2012/01/19/amd-ditches-fusion-branding/1
19
2012,
http://www.bit-
[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.bittech.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-anddesign/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-unifiedmemory-for-cpugpu-in-2013-hsa-gpus-in-2014 [91]
White Paper, AMD Graphics Cores Next (GCN) Architecture, http://www.amd.com/jp/Documents/GCN_Architecture_whitepaper.pdf
June
2012,
[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-2013apus2c-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,31042.html 223 Created by XMLmind XSL-FO Converter.
Hivatkozások
[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.bittech.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-hd6950-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-amdarchitects-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-CardReview-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/tahitipro,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-q22013.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 224 Created by XMLmind XSL-FO Converter.
Hivatkozások
[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, http://download.intel.com/pressroom/archive/reference/ISC_2010_Skaugen_keynote.pdf
ISC
2010,
[119] Timeline of Many-Core at Intel, intel.com, http://download.intel.com/newsroom/kits/xeon/phi/pdfs/ManyCore-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.335XeonPhi-Chrysos-Intel.pdf [121]
Intel Xeon Phi Coprocessor: Pushing the Limits of Discovery, http://download.intel.com/newsroom/kits/xeon/phi/pdfs/Intel-Xeon-Phi_Factsheet.pdf
2012,
[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-forintel-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-productfamily-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-revealsintels-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
225 Created by XMLmind XSL-FO Converter.
II. rész - GPGPU-k és programozásuk
Created by XMLmind XSL-FO Converter.
Tartalom 1. Bevezetés ................................................................................................................................... 1. Bevezetés (1) .................................................................................................................... 1.1. GPU-k számítási kapacitása ................................................................................ 2. Bevezetés (2) .................................................................................................................... 2.1. Valós alkalmazások ............................................................................................. 2.2. Grafikus Feldolgozó Egységek ............................................................................ 2.2.1. Shaderek .................................................................................................. 2.3. Unified Shader Model ......................................................................................... 2.4. GPGPU fogalom megjelenése ............................................................................. 2.5. GPGPU helye és szerepe ...................................................................................... 2.6. CPU-GPGPU összehasonlítás ............................................................................. 2.7. Memória szerkezete ............................................................................................. 2.8. SIMT végrehajtás ................................................................................................ 2. Programozási modell ................................................................................................................. 1. CUDA környezet alapjai .................................................................................................. 1.1. CUDA környezet ................................................................................................. 1.2. Szükséges komponensek ..................................................................................... 1.3. CUDA környezet áttekintése ............................................................................... 1.4. CUDA környezet részei ....................................................................................... 1.5. CUDA szoftver rétegek ....................................................................................... 1.6. CUDA alapú fejlesztés lépései ............................................................................ 2. Fordítás és szerkesztés ..................................................................................................... 2.1. CUDA fordítás lépései ......................................................................................... 2.1.1. Bemenet .................................................................................................. 2.1.2. Kimenet ................................................................................................... 2.2. nvcc fordító alapvető paraméterei ........................................................................ 2.2.1. Fordítás céljának meghatározása ............................................................. 2.3. nvcc fordító alapvető paraméterei (2) .................................................................. 2.4. nvcc fordító alapvető paraméterei (3) .................................................................. 2.5. nvcc fordító alapvető paraméterei (4) .................................................................. 2.6. Példa parancssori fordításra ................................................................................. 2.7. Fordítás áttekintése .............................................................................................. 3. Platform modell ................................................................................................................ 3.1. CUDA platform modell ....................................................................................... 3.2. CUDA platform modell (2) ................................................................................. 3.3. Hozzáférés az eszközökhöz ................................................................................. 3.3.1. CUDA eszköz kiválasztása ..................................................................... 3.4. Eszközök adatai ................................................................................................... 3.5. Eszközök adatainak lekérdezése .......................................................................... 3.5.1. Feladat 2.3.1 ............................................................................................ 4. Memória modell ............................................................................................................... 4.1. CUDA memória modell ....................................................................................... 4.1.1. Kapcsolat a hoszttal ................................................................................. 4.2. CUDA memória modell – globális memória ....................................................... 4.3. CUDA memória modell – konstans memória ...................................................... 4.4. CUDA memória modell – textúra memória ......................................................... 4.5. CUDA memória modell – megosztott memória .................................................. 4.6. CUDA memória modell – regiszterek ................................................................. 4.7. CUDA memória modell – lokális memória ......................................................... 4.7.1. Deklaráció .............................................................................................. 4.8. Memória modell fizikai leképezése ..................................................................... 4.9. Memory handling ................................................................................................ 4.10. Memória területek elérhetőség szerint ............................................................... 4.11. Dinamikus memóriakezelés – foglalás .............................................................. 4.11.1. Memória felszabadítás .......................................................................... 4.12. Memória területek közötti másolás ....................................................................
227 Created by XMLmind XSL-FO Converter.
231 231 231 231 231 232 232 232 233 234 234 235 236 238 238 238 238 239 240 240 241 242 242 242 243 244 244 244 245 245 245 246 246 246 249 250 251 251 251 252 252 252 252 253 254 255 256 257 258 258 259 261 261 262 262 262
GPGPU-k és programozásuk
4.13. Rögzített memória (pinned memory) ................................................................. 4.14. Másolás nélküli memória (zero-copy memory) ................................................. 5. Végrehajtási modell ......................................................................................................... 5.1. CUDA végrehajtási modell - szálak .................................................................... 5.2. CUDA blokkok .................................................................................................... 5.3. Blokkok azonosítása ............................................................................................ 5.4. Globális – lokális index ....................................................................................... 5.4.1. Lokális azonosító .................................................................................... 5.4.2. Globális azonosító ................................................................................... 5.5. Néhány alapvető összefüggés .............................................................................. 5.6. CUDA végrehajtási modell – kernel .................................................................... 5.7. CUDA végrehajtási modell – kernel indítása ...................................................... 5.8. Kernel indítással kapcsolatos típusok .................................................................. 5.9. Kernel implementálása ........................................................................................ 5.10. Kernel elindítás példa ........................................................................................ 5.11. Blokkokat kezelő kernel implementálása .......................................................... 5.12. Blokkokat kezelő kernel indítás példa ............................................................... 5.13. Teljes alkalmazás elkészítése ............................................................................. 5.13.1. Feladat 2.5.1 .......................................................................................... 3. Programozási környezet ............................................................................................................. 1. Visual Studio használata .................................................................................................. 1.1. Visual Studio lehetőségek .................................................................................... 1.1.1. New project wizard ................................................................................. 1.2. New project wizard .............................................................................................. 1.3. Custom build rules ............................................................................................... 1.4. CUDA-val kapcsolatos project beállítások .......................................................... 2. Számítási képességek ....................................................................................................... 2.1. Számítási képességek (1) ..................................................................................... 2.2. Számítási képességek (2) ..................................................................................... 2.3. Számítási képességek (3) ..................................................................................... 2.4. Compute capability (4) ......................................................................................... 2.5. Néhány Nvidia GPU számítási képessége ........................................................... 2.6. Néhány Nvidia GPU számítási képessége ........................................................... 3. CUDA nyelvi kiterjesztés ................................................................................................ 3.1. CUDA language extensions ................................................................................. 3.2. Mindkét oldalon elérhető típusok ........................................................................ 3.2.1. dim3 típus ............................................................................................... 3.3. Mindkét oldalon elérhető függvények ................................................................. 3.4. Csak eszköz oldalon elérhető változók ................................................................ 3.5. Csak eszköz oldalon elérhető függvények ........................................................... 3.6. Csak hoszt oldalon elérhető függvények ............................................................. 4. Aszinkron konkurens végrehajtás .................................................................................... 4.1. Stream-ek ............................................................................................................. 4.2. Stream-ek létrehozás és megszüntetése ............................................................... 4.3. Stream-ek használata ........................................................................................... 4.4. Példa a stream-ek használatára ............................................................................ 4.5. Stream szinkronizáció .......................................................................................... 4.6. Szinkronizációt magukba foglaló műveletek ....................................................... 4.7. Stream időzítés [12] ............................................................................................. 4.8. Konkurens végrehajtás támogatása ...................................................................... 4.9. Példa blokkolt sorra ............................................................................................. 4.10. Példa blokkolt sorra (2) ..................................................................................... 5. CUDA események ............................................................................................................ 5.1. Események létrehozása és megszüntetése ........................................................... 5.2. Esemény rögzítése ............................................................................................... 5.3. Esemény szinkronizálása ..................................................................................... 5.4. Esemény ellenőrzése ............................................................................................ 5.5. Szinkronizáció eseményekkel .............................................................................. 5.6. Szinkronizáció eseményekkel (példa) ................................................................. 5.7. Események között eltelt idő számítása ................................................................ 228 Created by XMLmind XSL-FO Converter.
263 264 264 264 265 265 266 266 267 267 267 268 268 269 269 270 270 270 271 272 272 272 272 272 273 274 275 275 276 276 277 277 277 278 278 278 278 278 279 279 280 281 281 281 282 283 283 283 284 284 285 285 286 286 286 287 287 288 288 289
GPGPU-k és programozásuk
5.8. Eltelt idő számítása (példa) .................................................................................. 6. Egyesített Virtuális Címtér ............................................................................................... 6.1. CUDA Unified Virtual Address Management ..................................................... 6.2. Egyesített Virtuális Címtér (UVA) ...................................................................... 6.3. Egyesített Virtuális Címtér – elérhetőség ............................................................ 6.4. Peer to peer kommunikáció az eszközök között .................................................. 6.5. UVA és a P2P átvitel ........................................................................................... 6.6. P2P memória átvitel GPU-k között ..................................................................... 6.7. P2P memória másolás GPU-k között ................................................................... 6.8. P2P memória hozzáférést bemutató kernel .......................................................... 6.9. CUDA UVA összegzés ........................................................................................ 4. Optimalizációs technikák ........................................................................................................... 1. Megosztott memória használata ....................................................................................... 1.1. Optimalizációs stratégiák ..................................................................................... 1.2. Mátrix szorzó alkalmazás elkészítése .................................................................. 1.2.1. Feladat 4.1.1 ............................................................................................ 1.3. Többdimenziós mátrix a memóriában ................................................................. 1.4. Többdimenziós mátrix a memóriában ................................................................. 1.5. Több dimenziós mátrix a GPU memóriában ........................................................ 1.6. Igazított elhelyezés .............................................................................................. 1.7. Igazított memóriakezelés ..................................................................................... 1.8. Igazított memória másolása ................................................................................. 1.9. Mátrix szorzó alkalmazás elkészítése igazított memóriával ................................ 1.9.1. Feladat 4.1.2 ............................................................................................ 1.10. Kernel igazított memóriakezeléssel ................................................................... 1.11. Kernel hívása igazított tömbök esetén ............................................................... 1.12. Megosztott memória kezelése ............................................................................ 1.13. Ötlet a mátrix szorzás gyorsítására (csempe technika) ...................................... 1.14. Mátrix szorzó alkalmazás elkészítése (megosztott memóriával) ....................... 1.14.1. Feladat 4.1.3 .......................................................................................... 1.15. Mátrix szorzás gyorsítása .................................................................................. 1.16. Mátrix szorzás gyorsítása (2) ............................................................................. 1.17. Mátrix szorzás gyorsítása (3) ............................................................................. 1.18. Mátrix szorzás gyorsítása (4) ............................................................................. 1.19. Mátrix szorzás gyorsítása (5) ............................................................................. 1.20. Optimalizált mátrix szorzás kernel .................................................................... 1.21. Összehasonlító vizsgálat .................................................................................... 2. Atomi műveletek használata ............................................................................................ 2.1. Atomi műveletek szükségessége ......................................................................... 2.2. CUDA atomi műveletek ...................................................................................... 2.3. CUDA atomi műveletek - aritmetika ................................................................... 2.4. CUDA atomi műveletek – aritmetika (2) ............................................................. 2.5. CUDA atomi műveletek – logikai függvények ................................................... 2.5.1. Feladat 4.2.1 ............................................................................................ 2.6. Vektor legkisebb elemének értéke ....................................................................... 2.6.1. Feladat 4.2.2 ............................................................................................ 2.7. Memóriahozzáférések csökkentése – megosztott memória ................................. 2.7.1. Összehasonlító vizsgálat ......................................................................... 2.8. Blokkon belüli párhuzamosítás ............................................................................ 2.8.1. Feladat 4.2.3 ............................................................................................ 2.9. Párhuzamos minimum - betöltés .......................................................................... 2.10. Párhuzamos minimum – blokk minimuma ........................................................ 2.11. Párhuzamos minimum - kernel .......................................................................... 2.12. Párhuzamos minimum – kernel (2) .................................................................... 2.13. Összehasonlító vizsgálat .................................................................................... 2.14. Összehasonlító vizsgálat .................................................................................... 3. Kihasználtság ................................................................................................................... 3.1. A végrehajtás áttekintése ..................................................................................... 3.2. Kihasználtság ....................................................................................................... 3.3. Kihasználtság és a regiszterek kapcsolata ............................................................ 229 Created by XMLmind XSL-FO Converter.
289 289 289 290 290 291 292 292 293 293 294 295 295 295 295 295 296 297 297 298 299 299 300 300 300 301 301 302 302 302 303 303 304 305 306 307 308 308 308 308 309 309 310 310 310 310 310 311 312 312 312 313 314 314 314 315 315 315 316 316
GPGPU-k és programozásuk
3.4. Kihasználtság és megosztott memória ................................................................. 3.5. Kihasználtság és blokk méret .............................................................................. 3.6. CUDA Occupancy calculator .............................................................................. 3.7. CUDA Occupancy calculator - példa .................................................................. 3.8. CUDA Occupancy calculator – változó blokk méret hatása ................................ 3.9. CUDA Occupancy calculator – változó regiszter szám hatása ............................ 3.10. CUDA Occupancy calculator – változó megosztott memória hatása ................ 3.11. Blokk mérettel kapcsolatos javaslatok [18] ....................................................... 4. Parallel Nsight .................................................................................................................. 4.1. Parallel Nsight ..................................................................................................... 4.2. Kernel nyomkövetés ............................................................................................ 4.3. GPU memória régiók megtekintése ..................................................................... 4.4. CUDA Debug Focus ............................................................................................ 4.5. CUDA Device Summary ..................................................................................... 4.6. CUDA Device Summary - rács ........................................................................... 4.7. CUDA Device Summary - warp .......................................................................... 4.8. PTX code nyomkövetése ..................................................................................... 4.9. Memória ellenőrzés használata ............................................................................ 4.10. CUDA memória ellenőrző minta eredmény ...................................................... 4.11. Lehetséges hibakódok és jelentésük .................................................................. 5. CUDA könyvtárak ..................................................................................................................... 1. CUBLAS könyvtár ........................................................................................................... 1.1. CUBLAS Library ................................................................................................ 1.2. CUBLAS alapú alkalmazások fejlesztése ............................................................ 1.3. CUBLAS függvények visszatérési értéke ............................................................ 1.4. CUBLAS segítő függvények ............................................................................... 1.5. CUBLAS memória kezelés .................................................................................. 1.6. BLAS függvények áttekintése ............................................................................. 1.7. Néhány CUBLAS 1. szintű függvény .................................................................. 1.8. Néhány CUBLAS 2. szintű függvény .................................................................. 1.9. Néhány CUBLAS 3. szintű függvény .................................................................. 6. CUDA verziók ........................................................................................................................... 1. CUDA 4 újdonságok ........................................................................................................ 1.1. CUDA 4.0 újdonságai .......................................................................................... 1.2. Aktuális eszköz kiválasztása ................................................................................ 1.3. Aktuális eszköz – stream, események .................................................................. 1.4. Több-GPU példa .................................................................................................. 1.5. Több CPU szál használata ................................................................................... 1.6. Vektor szorzás több-GPU-s környezetben - kernel .............................................. 1.7. Vektor szorzás több-GPU-s környezetben – memória foglalás ........................... 1.8. Vektor szorzás több-GPU-s környezetben – kernel hívás ................................... 1.9. Vektor szorzás több-GPU-s környezetben – kernel hívás ................................... 2. CUDA 5 újdonságok ........................................................................................................ 2.1. CUDA 5.0 újdonságok [26] ................................................................................. 2.2. Dinamikus párhuzamosság .................................................................................. 7. Felhasznált irodalom .................................................................................................................. 1. Felhasznált irodalom ........................................................................................................ 2. Gyakran előforduló kifejezések fordításai ........................................................................
230 Created by XMLmind XSL-FO Converter.
317 317 318 318 319 319 320 320 321 321 322 322 323 323 324 324 325 326 326 327 329 329 329 329 329 330 330 331 331 332 332 334 334 334 334 334 335 335 336 336 337 337 338 338 338 340 340 341
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 -
231 Created by XMLmind XSL-FO Converter.
Bevezetés
2.2. Grafikus Feldolgozó Egységek • Alapvető feladatuk a képernyőn megjelenítendő tartalom kezelésével kapcsolatos feladatok átvétele a CPUtó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:
232 Created by XMLmind XSL-FO Converter.
Bevezetés
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 233 Created by XMLmind XSL-FO Converter.
Bevezetés
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]
234 Created by XMLmind XSL-FO Converter.
Bevezetés
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]
235 Created by XMLmind XSL-FO Converter.
Bevezetés
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 236 Created by XMLmind XSL-FO Converter.
Bevezetés
• 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]
237 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 -
238 Created by XMLmind XSL-FO Converter.
Programozási modell
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]
239 Created by XMLmind XSL-FO Converter.
Programozási modell
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
240 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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
241 Created by XMLmind XSL-FO Converter.
Programozási modell
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]
242 Created by XMLmind XSL-FO Converter.
Programozási modell
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 243 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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 (-odir) A kimenő állomány helyének meghatározása • --output-file (-o) A kimenő állomány nevének meghatározása • --compiler-bindir (-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 (-I) Az „include” direktíván keresztül elérhető állományok helye • --library (-l) A használni kívánt osztálykönyvtárak nevei 244 Created by XMLmind XSL-FO Converter.
Programozási modell
• --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 (-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', 'sm_10','sm_11','sm_12','sm_13'
'compute_11',
'compute_12',
'compute_13',
Alapértelmezett érték: 'sm_10' • --gpu-code (-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(-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 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 -
245 Created by XMLmind XSL-FO Converter.
Programozási modell
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
246 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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]
247 Created by XMLmind XSL-FO Converter.
Programozási modell
248 Created by XMLmind XSL-FO Converter.
Programozási modell
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]
249 Created by XMLmind XSL-FO Converter.
Programozási modell
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 -
250 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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.
251 Created by XMLmind XSL-FO Converter.
Programozási modell
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]
252 Created by XMLmind XSL-FO Converter.
Programozási modell
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 -
253 Created by XMLmind XSL-FO Converter.
Programozási modell
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 254 Created by XMLmind XSL-FO Converter.
Programozási modell
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]
255 Created by XMLmind XSL-FO Converter.
Programozási modell
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 -
256 Created by XMLmind XSL-FO Converter.
Programozási modell
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 -
257 Created by XMLmind XSL-FO Converter.
Programozási modell
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
258 Created by XMLmind XSL-FO Converter.
Programozási modell
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 259 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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
260 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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 -
261 Created by XMLmind XSL-FO Converter.
Programozási modell
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 262 Created by XMLmind XSL-FO Converter.
Programozási modell
(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()
263 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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 264 Created by XMLmind XSL-FO Converter.
Programozási modell
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) 265 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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. 266 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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 267 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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<<>>(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 -
268 Created by XMLmind XSL-FO Converter.
Programozási modell
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.
269 Created by XMLmind XSL-FO Converter.
Programozási modell
• 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 270 Created by XMLmind XSL-FO Converter.
Programozási modell
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
271 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: 272 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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
273 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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 -
274 Created by XMLmind XSL-FO Converter.
Programozási környezet
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
275 Created by XMLmind XSL-FO Converter.
Programozási környezet
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
276 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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 -
277 Created by XMLmind XSL-FO Converter.
Programozási környezet
• További részletes adatok az alábbi http://en.wikipedia.org/wiki/Comparison_of_Nvidia_graphics_processing_units
oldalon:
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
278 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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
279 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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ásmó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 280 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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 281 Created by XMLmind XSL-FO Converter.
Programozási környezet
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
282 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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
283 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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
284 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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]
285 Created by XMLmind XSL-FO Converter.
Programozási környezet
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) 286 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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 287 Created by XMLmind XSL-FO Converter.
Programozási környezet
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 -
288 Created by XMLmind XSL-FO Converter.
Programozási környezet
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]) 289 Created by XMLmind XSL-FO Converter.
Programozási környezet
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 290 Created by XMLmind XSL-FO Converter.
Programozási környezet
• 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
291 Created by XMLmind XSL-FO Converter.
Programozási környezet
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 -
292 Created by XMLmind XSL-FO Converter.
Programozási környezet
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ó: 293 Created by XMLmind XSL-FO Converter.
Programozási környezet
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
294 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)
295 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 296 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 -
297 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
298 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 299 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
300 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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
301 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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
302 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
303 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 -
304 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 -
305 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 -
306 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
1.20. Optimalizált mátrix szorzás kernel • A kernel meghívása azonos az előzőleg megismerttel
4.20. ábra -
307 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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
308 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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)
309 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 1el, 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 310 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
311 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 312 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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:
313 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
314 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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
315 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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: 316 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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
317 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
318 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 -
319 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 320 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 321 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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__ 322 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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
323 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 324 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
• 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 -
325 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 326 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
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 -
327 Created by XMLmind XSL-FO Converter.
Optimalizációs technikák
328 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: 329 Created by XMLmind XSL-FO Converter.
CUDA könyvtárak
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, 330 Created by XMLmind XSL-FO Converter.
CUDA könyvtárak
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 331 Created by XMLmind XSL-FO Converter.
CUDA könyvtárak
• 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 332 Created by XMLmind XSL-FO Converter.
CUDA könyvtárak
• 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
333 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(), cudaHostRegister() függvényekkel csak a kapcsolt eszköz élettartamáig léteznek
cudaHostAlloc()
vagy
• 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
334 Created by XMLmind XSL-FO Converter.
CUDA verziók
• 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
335 Created by XMLmind XSL-FO Converter.
CUDA verziók
• 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 -
336 Created by XMLmind XSL-FO Converter.
CUDA verziók
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
337 Created by XMLmind XSL-FO Converter.
CUDA verziók
• 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 -
338 Created by XMLmind XSL-FO Converter.
CUDA verziók
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
339 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: http://s08.idav.ucdavis.edu/fatahalian-gpu-architecture.pdf
How
Shader
Cores
Work
[8] CUDA tutorial 4 – Atomic Operations http://supercomputingblog.com/cuda/cuda-tutorial-4-atomicoperations [9]
Developing a Linux Kernel Module http://www.moderngpu.com/intro/performance.html
using
RDMA
for
GPUDirect
[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 http://developer.download.nvidia.com/CUDA/training/cuda_webinars_multi_gpu.pdf
Programming
[14]
Wikipedia – Basic Linear http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
Subprograms
Algebra
[15] NVIDIA CUBLAS http://developer.nvidia.com/cublas [16]
CUBLAS Library doc/CUBLAS_Library.pdf
http://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-
[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 http://www.nvidia.com/docs/IO/55972/220401_Reprint.pdf
Processing
340 Created by XMLmind XSL-FO Converter.
with
CUDA
Felhasznált irodalom
[21] [22]
David Kirk, Wen-Mei Hwu:Programming http://courses.ece.uiuc.edu/ece498/al/
Massively
Parallel
Processors
courses
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-smtparallelism-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://ondemand.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)
341 Created by XMLmind XSL-FO Converter.