Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Nagy Márton 2013. 05.16.. C++ AMP (C++ Accelerated Massive Parallelism)  C++ kiterjesztése  nyílt, de csak Directixt11-re van implementálva  lehetővé.

Hasonló előadás


Az előadások a következő témára: "Nagy Márton 2013. 05.16.. C++ AMP (C++ Accelerated Massive Parallelism)  C++ kiterjesztése  nyílt, de csak Directixt11-re van implementálva  lehetővé."— Előadás másolata:

1 Nagy Márton

2 C++ AMP (C++ Accelerated Massive Parallelism)  C++ kiterjesztése  nyílt, de csak Directixt11-re van implementálva  lehetővé teszi a adatpárhuzamos (data- paralell) hardware-ek (pl. GPU) erőforrásainak kihasználását  Visual Studio 2012-vel jelent meg

3 Eszközök összehasonlítás CPUGPU Tranzisztorok száma~ 1 milliárd~ 2 milliárd Magok száma Memória elérés20 GB/s150 GB/s Energia fogyasztás1 GFlop/watt10 GFlop/watt Órajel3000 GHz900 GHz

4 GPU architektúra

5  Kis cache  Több száz szál  A szálak csoportokba rendeződnek (AMD: warps, NVIDIA: wavefronts), amelyek szekvenciálisan érik el a közös cache-t  A lokális memóriát 4 óra jel alatt olvasható, a globális alatt.

6 Hasonló technológiák - OpenMP  OpenMP: 1997 nyelv és platform független API CPU párhuzamossághoz // size is a compile-time constant double* x = new double[size]; double* y = new double[size + 1]; // get values into y #pragma omp parallel for for (int i = 1; i < size; ++i) { x[i] = (y[i - 1] + y[i + 1]) / 2; }

7 Hasonló technológiák – Concurrency Runtime (ConcRT ) and Parallel Patterns Library  PPL (Parallel Patterns Library) : generikus algoritmusok és konténerek  Asynchronous Agents Library: lock-olás mentes aszinkron kommunikáció  Task Scheduler: a folyamatok ütemezéséért felelős  The Resource Manager: A task scheduler segítségével tud erőforrásokat allokálni a folyamatokhoz (pl. memóriát, processzor magokat)

8 PPL (Parallel Patterns Library)  C++11 labda kifejezéseire épít concurrency::parallel_for(1, size, [=](int i) { x[i] = (y[i-1] + y[i+1])/2; });

9 TPL (Task Paralell Library) .NET-es párhuzamos library  ThreadPool-ra épít  Egy új statikus osztály: Task  Írhatunk saját TaskSheduler-t  A PLINQ a TPL-re épít

10 OpenGL  Open Graphics Library (OpenGL)  1992 ben jelent meg  nyelv és platform független API 2D és 3D grafikára

11 OpenCL  OpenGL-re épülő C szerű nyelv  GPU programozásra  Sajnos nincs bináris szabvány, ezért a cél eszközre esetleg újra kell fordítani

12 CUDA  NVIDIA fejleszti  C szerű nyelv  Csak NVIDIA kártyákhoz használható

13 C++ AMP  A C++ 11-re és a PPL-re kiterjesztése.  A C++ 11-et mindössze két kucsszóval egészíti ki: restrict, tile_static  A nyelv további kiegészítéseit a amp.h fájlon át elérhető osztályok és algoritmusok jelentik

14 Demo-Nbody  Körökre osztott szimmuláció  N db test  A testeknek gravitációja van  Minden testre az összes többi test gravitációja hat.

15 ThinkPad W530 Intel i7-3520MNVIDIA Quadro K1000M Tranzisztorok száma1,4 milliárd1,3 milliárd Magok száma2 (Hyper Threaded)192 Memória elérés25,6 GB/s28,8GB/s Energia fogyasztás45W35W Órajel2,9GHz0,9GHz

16 Hello World

17 C++ lambda

18 1. lambda-introducer (capture clause) 2. lambda-parameter-declaration-list 3. mutable-specification 4. exception-specification 5. lambda-return-type-clause 6. compound-statement

19 restrict kulcsszó  Megszorítást tehetünk vele egy metódusra.  Használat:  void functionAmp() restrict(amp) {}  void functionCpu() restrict(cpu) {}  void functionCpuAmp() restrict(cpu, amp) {}

20 restrict(cpu): csak olyan függvényekből hívható, amely szintén restrict(cpu)-val lett megjelölve ez a default restrict(amp): a C++ nyelv csak egy részhalmaza használható a függvény törzsében, amely adatpárhuzamos eszközön való feldolgozásra alkalmas Legfontosabb megkötések: A function-nek inline-olhatónak kell lennie csak int, unsigned int, float, double és bool változók és csak ezen típusokat tartalmazó struct-ok és class-ok szerepelhetnek benne Nem tartalmazhat: Rekurziót Függvény pointer-t Goto-t Kivételkezelést globális változót statikus változót

21 array, array_view  array : T típusú N hosszú tömb létrehozása, amely másolásra kerül az adatpárhuzamos eszköz memóriájába  Array_view : T típusú N hosszú tömb nézet létrehozása egy már meglevő konténerből synchronize(): a módosítások visszavezetése az eredeti konténerbe  Max 128 dimenzió std::vector v(5); std::iota(v.begin(), v.end(), 0); array a(5,v.begin(),v.end()); parallel_for_each(a.extent, [&](index idx) restrict(amp) { a[idx] = a[idx] * 2; }); copy(a,v); std::vector v(5); std::iota(v.begin(), v.end(), 0); array_view av(5,v); parallel_for_each(av.extent, [=](index idx) restrict(amp) { av[idx] = av[idx] * 2; }); av.synchronize();

22 accelator: Egy fizikai eszközt reprezentál  accelerator::default_accelerator  accelerator::direct3d_warp  accelerator::direct3d_ref  accelerator::cpu  accelerator::set_default() metódussal állítható be a default gyorsító accelator_view: egy eszköznek több különböző logikai nézete lehet accelerator device(accelerator::default_accelerator); accelerator_view av = device.default_view; array C(n, av);

23 Extend  Egy array_view szerkezetét adja meg.

24 index  Egy elem lekérdezése

25 Paralell_for_each  Globális függvény  Paraméterei: Az első egy Extend, amely a feldolgozandó elemeket tartalmazza A második egy lambda, amely minden elemre mehívodik paraméterül kapva az adott elem index-ét  Az extend-beli minden elemre egy thread-et indít  Az index-ek feldolgozásának sorrendje nem definiált. (az asszinkronitás miatt) parallel_for_each(c.extent, [=](index idx) restrict(amp) { c[idx] = a[idx] + b[idx]; });

26 CPU-GPU adatcsere  Az array_view tartamla átmásolásra kerül a GPU memóriájába alapértelmezetten.  Az amp function módosításai a synchronize() functionnel szinkronizálható vissza az eredeti konténetrbe.  Az array_view tartalma synchronize() hívás nélkül is visszaíródik az eredeti konténerbe, amikor az felszabadításra kerül. Ez elkerülhető, a const típusparaméterrel hozzuk létre (pl. array_view )  Ha csak kimenő adatot állít elő egy amp metódus, akkor a kezdeti másolást hinteléssel küszöbölhetjük ki. array_view out(5, v2); out.discard_data();

27 Szekvenciális mátrix szorzás

28 AMP mátrix szorzás

29 GPU architektúra

30 tile  A tile-ok segítségével felosztható a feldolgozandó tömb egyenlő méretű területekre.  Egy-egy tile-t egy warp fog feldolgozni  A tile méretet ezért érdemes a warp magjainak számának egészszámú többszörösének választani.

31 Tile indexelés (tiled_index) tiled_index pédánynak két adattagja segítségével:  local: a tile-on belüli index  global: az array/array_view-n belüli index

32 Mátrix szorzás, tile-okkal

33 Tile memória kezelés  Egy tile-t egy warp fog feldolgozni.  Minden warp-nak van egy saját gyors memória területe  Használjuk ki!

34 tile_static kulcsszó  A tile_static kulcsszó után deklarált változó warp lokális memória területén kerül allokálásra  Az adatokat nekünk kell belemásolni a globális memória területről  Csak akkor van értelme, ha a belemásolt adatot többször kell használnuk.

35 Egy bugos példa

36 tile_barrier osztály  Használat: t_idx.barrier.wait();  A wait() utasítást követő utasítások, csak azután futhatnak le, miután minden tile-on belüli szál elérte a wait() utasítást.

37 Mátrix szorzás tile-okkal

38

39 Elérhető sebesség növekedés App 1 App 2 App 3 eredetiSzekvenciális kód aránya50%25%10% Szekvenciális kód futásideje Párhuzamos kód futásideje Párhuzamosítva 10- szeres gyorsulás esetén Párhuzamos kód57,59 Teljes futás idő5532,519 Gyorsulás1,823,085,02 Párhuzamosítva 100-szoreo gyorsulás esetén Párhuzamos kód0,50,750,9 Teljes futás idő50,525,7 5 10,9 Gyorsulás1,983,889,17

40 Hol találkozhatunk vele  BitCoin bányászat  Szuperszámítógépek  Képfeldolgozás

41 Hivatkozások  MSDN - C++ AMP: us/library/vstudio/hh aspxhttp://msdn.microsoft.com/en- us/library/vstudio/hh aspx  MSDN magazin: us/magazine/hh aspx us/magazine/hh aspx us/magazine/hh aspx us/magazine/hh aspx  Könyv: Microsoft Press - C++ AMP Accelerated Massive Parallelism with Microsoft® Visual C++®


Letölteni ppt "Nagy Márton 2013. 05.16.. C++ AMP (C++ Accelerated Massive Parallelism)  C++ kiterjesztése  nyílt, de csak Directixt11-re van implementálva  lehetővé."

Hasonló előadás


Google Hirdetések