Řešíme úlohu zpracování velkého množství dat. Data jsou symetrická, úloha je dobře paralelizovatelná



Podobné dokumenty
Řešíme úlohu zpracování velkého množství dat. Data jsou symetrická, úloha je dobře paralelizovatelná. Propaganda výrobců grafických karet:

vlastnosti, praktické zkušenosti

Obecné výpočty na GPU v jazyce CUDA. Jiří Filipovič

Úvod do GPGPU J. Sloup, I. Šimeček

Pokročilé architektury počítačů

Nvidia CUDA Paralelní programování na GPU

GPU A CUDA HISTORIE GPU CO JE GPGPU? NVIDIA CUDA

Co je grafický akcelerátor

GPGPU. Jan Faigl. Gerstnerova Laboratoř pro inteligentní rozhodování a řízení České vysoké učení technické v Praze

Pokročilé architektury počítačů

Pokročilé architektury počítačů

CUDA J. Sloup a I. Šimeček

Nvidia CUDA Paralelní programování na GPU

GPU a CUDA. Historie GPU. Co je GPGPU? Nvidia CUDA

Paralelní a distribuované výpočty (B4B36PDV)

OPS Paralelní systémy, seznam pojmů, klasifikace

Optimalizace pro GPU hardware

GPU a CUDA. Historie GPU. Co je GPGPU? Nvidia CUDA

Paralelní programování

PŘEDSTAVENÍ GRAFICKÉHO PROCESORU NVIDIA G200

Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur

Procesy a vlákna (Processes and Threads)

REALIZACE SUPERPOČÍTAČE POMOCÍ GRAFICKÉ KARTY

Pohled do nitra mikroprocesoru Josef Horálek

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Jiné výpočetní platformy J. Sloup, M. Skrbek, I. Šimeček

GPGPU Aplikace GPGPU. Obecné výpočty na grafických procesorech. Jan Vacata

Jan Nekvapil ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická

SUPERPOČÍTAČE DANIEL LANGR ČVUT FIT / VZLÚ

Paralelní a distribuované výpočty (B4B36PDV)

Paralelní programování

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

Zpracování obrazu v FPGA. Leoš Maršálek ATEsystem s.r.o.

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Architektura počítače

Hardware - komponenty počítačů Von Neumannova koncepce počítače. Von Neumannova koncepce počítače

Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

GRAFICKÉ ADAPTÉRY. Pracovní režimy grafické karty

Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2

Semestrální práce z předmětu Speciální číslicové systémy X31SCS

Management procesu I Mgr. Josef Horálek

Matematika v programovacích

Operační systémy. Přednáška 1: Úvod

PROCESOR. Typy procesorů

IUJCE 07/08 Přednáška č. 6

Grafické karty s podporou DirectX 11 Quynh Trang Dao Dao007

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Pokročilé architektury počítačů

Přednáška 1. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Ing. Jan Buriánek. Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Jan Buriánek, 2010

Vyuºití GPGPU pro zpracování dat z magnetické rezonance

Architektura procesoru ARM

Procesor. Procesor FPU ALU. Řadič mikrokód

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Základní operace. Prefix sum. Segmentovaný prefix-sum

Architektura Intel Atom

Princip funkce počítače

INDIVIDUÁLNÍ PROJEKT 1 - ZPRACOVÁNÍ GNSS SIGNÁLU V GPU

Pokročilá architektura počítačů

ARCHITEKTURA AMD PUMA

Paralelní programování

Návrhy elektromagnetických zení

Xbox 360 Cpu = IBM Xenon

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Paralelní výpočty ve finančnictví

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Stavba operačního systému

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

AGP - Accelerated Graphics Port

C2115 Praktický úvod do superpočítání

Základní komunikační operace

Masivně paralelní zpracování obrazu v prostředí systému VisionLab Liberec Roman Cagaš, rc@mii.cz

Real Time programování v LabView. Ing. Martin Bušek, Ph.D.

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Strojový kód. Instrukce počítače

Shrnutí Obecné Operační systém Microsoft Windows 7 Ultimate Centrální procesor

Roman Výtisk, VYT027

Cvičení MI-PAP I. Šimeček, M. Skrbek, J. Trdlička

Virtualizace. Lukáš Krahulec, KRA556

Služba ve Windows. Služba (service) je program

Grafické karty. Autor: Kulhánek Zdeněk

Principy operačních systémů. Lekce 5: Multiprogramming a multitasking, vlákna

Architektury CISC a RISC, uplatnění v personálních počítačích

Bootkity v teorii a praxi. Martin Dráb martin.drab@ .cz

Profilová část maturitní zkoušky 2013/2014

Základní deska (1) Parametry procesoru (2) Parametry procesoru (1) Označována také jako mainboard, motherboard

Systém adresace paměti

VÝUKOVÝ MATERIÁL. 3. ročník učebního oboru Elektrikář Přílohy. bez příloh. Identifikační údaje školy

Procesor Intel Pentium (1) Procesor Intel Pentium (3) Procesor Intel Pentium Pro (1) Procesor Intel Pentium (2)

Emulátory. Autor: Martin Fiala. Spouštění programů a her z jiných OS nebo jiných platforem. InstallFest

Principy operačních systémů. Lekce 1: Úvod

Systémy pro sběr a přenos dat

Windows a real-time. Windows Embedded

Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

Představení a vývoj architektur vektorových procesorů

Vizuální programovací jazyk

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Charakteristika dalších verzí procesorů v PC

Transkript:

GPGPU

Motivace Řešíme úlohu zpracování velkého množství dat Data jsou symetrická, úloha je dobře paralelizovatelná Propaganda výrobců grafických karet: Vezměte váš C-čkový kód, zkompilujte a pusťte jej na grafické kartě a ono to funguje! Realita je trochu jiná verze 1.1 2010-2011, Martin Kruliš 2

Historie 1996: 3Dfx Voodoo 1 První grafický akcelerátor do domácího počítače 1999: NVIDIA GeForce 256 První HW T&L jednotka ( transform & lightning ) 2000: NVIDIA GeForce2, ATI Radeon 2001: programování GPU DirectX 8 (vertex a fragment shaders v1.0 a v1.1) 2006: OpenGL 2.0, DirectX 10, Windows Vista Unifikované shader procesory, geometry shader 2007: NVIDIA CUDA První GPGPU řešení 2009: OpenCL, DirectCompute verze 1.1 2010-2011, Martin Kruliš 3

Hardware NVIDIA Fermi Momentální state-of-the-art 768kB L2 cache 16 SMP jednotek s 512 CUDA cores Poznámka: 1 CUDA core ~ 1 5D ATI stream processor (Radeon 5870 má 320 jader) verze 1.1 2010-2011, Martin Kruliš 4

Hardware Streaming Multiprocessor (Fermi) 32 CUDA jader 64K sdílené paměti nebo L1 cache 1024 registrů na jádro 16 load/store jednotek 4 jednotky speciálních funkcí 16 double-precision operací za takt 1 řadič instrukcí! Všechna jádra běží v SIMT verze 1.1 2010-2011, Martin Kruliš 5

CPU vs. GPU CPU Malý počet jader Jádra pro obecné výpočty Na různých jádrech běží různá vlákna Latenci přístupů do globální paměti redukuje cache Problém Locality of Reference GPU Velký počet jader Jádra specializovaná pro numerické výpočty SIMT zpracování vláken Latenci přístupů redukuje rychlé přepínání mezi vlákny Komplikovanější důsledky přístupu do globální paměti verze 1.1 2010-2011, Martin Kruliš 6

CPU GPU Skrývání latence pamětí Context-switch je drahá operace Snaha mít co největší cache Context-switch je levný (při čekání na data může běžet jiné vlákno). Malé cache CPU GPU Rozdíl ve skrývání latencí mezi CPU a GPU (oficiální materiály NVIDIA) verze 1.1 2010-2011, Martin Kruliš 7

OpenCL Univerzální framework pro parallelní výpočty Specifikace 1.0 vydána v srpnu 2009 sdružením Khronos. Existují různé implementace (NVIDIA, AMD, Mac OS, ). API nad různými paralelními architekturami Multi-core CPU, GPU, přídavné karty pro výpočty, Zastřešuje detekci, komunikaci, přesun dat a spouštění kódu Dva druhy paralelismu data parallelism a task parallelism Vlastní rozšíření jazyka C99 pro psaní kernelů Kernel je kompilován za běhu přímo pro cílovou platformu. Teoreticky je možné až za běhu vybrat nejvhodnější zařízení. Prakticky to není vždy rozumné, protože kód je potřeba optimalizovat. verze 1.1 2010-2011, Martin Kruliš 8

OpenCL architektura OpenCL bere v úvahu více různorodých zařízení na jednom host-u (počítači). verze 1.1 2010-2011, Martin Kruliš 9

OpenCL logické vrstvy Dělení vrstev přístupu Host může mít více platforem Platforma ~ implementace OCL Z platformy se vytvoří kontext Kontext sdružuje zařízení vybraného typu Zařízení je možné osahat a vybrat si dle parametrů V rámci kontextu se také vytváří buffer, kompilují kernely, Zařízení Vytváří se na něm fronty Do fronty se vkládají příkazy (spouštění kernels, kopírování bufferů, ) 4 jádrový core i7 s HT Radeon 5870 (1600 stream procesorů) verze 1.1 2010-2011, Martin Kruliš 10

OpenCL klientská aplikace std::vector<cl::platform> platforms; cl_int err = cl::platform::get(&platforms); if (err!= CL_SUCCESS) return 1; cl_context_properties cps[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0]()), 0}; cl::context context(cl_device_type_gpu, cps, NULL, NULL, &err); Seznam všech platforem Kontext všech GPU zařízení na 1. platformě std::vector<cl::device> devices = context.getinfo<cl_context_devices>(); Seznam všech GPU cl::buffer buf(context, CL_MEM_READ_ONLY, sizeof(cl_float)*n); cl::program program(context, cl::program::sources(1, std::make_pair(source.c_str(), source.length())) ); err = program.build(devices); cl::kernel kernel(program, "function_name", &err); err = kernel.setarg(0, buf); Vytvoříme a zkompilujeme program pro GPU Z konkrétní funkce uděláme kernel object cl::commandqueue commandqueue(context, devices[0], 0, &err); commandqueue.enqueuewritebuffer(buf, CL_TRUE, 0, sizeof(cl_float)*n, data); commandqueue.enqueuendrangekernel(kernel, cl::nullrange, cl::ndrange(n), cl::ndrange(grp), NULL, NULL); commandqueue.finish(); Poslání příkazů a čekání na jejich dokončení Fronta příkazů na GPU verze 1.1 2010-2011, Martin Kruliš 11

Kernel OpenCL kernels Program (funkce) v rozšířené syntaxi jazyka C Kompiluje se za běhu přímo pro cílové zařízení Vysoká míra optimalizace Spouštění kernels Program si řekne, kolikrát chce kernel spustit (data parallelism) Kernely se navíc spojují do skupin (skupina může sdílet lokální data) Logicky se instance uspořádají do 1-3 rozměrné mřížky Kernel má k dispozici funkce pro zjištění svého ID, ID skupiny, get_global_id(dim), get_local_id(dim), get_global_size(dim) Dle ID si může dopočítat, jakou část dat má zpracovat. Více kernels může být ve frontě ke zpracování (task parallelism) Ne každé zařízení task paralelism podporuje verze 1.1 2010-2011, Martin Kruliš 12

OpenCL spouštění kernels Příklad dvojrozměrné uspořádání Velikost skupiny musí být v každém směru soudělná s velikostí problému Je dobré, aby velikost problému byla mocnina 2 verze 1.1 2010-2011, Martin Kruliš 13

OpenCL struktura paměti Struktura paměti private paměť vlastní jednomu kernelu local paměť sdílená skupinou kernelů global paměť sdílená všemi kernely spuštěnými paralelně constant stejné jako global, ale read-only Nerozlišujeme globální paměť zařízení a hosta (OpenCL určí samo). verze 1.1 2010-2011, Martin Kruliš 14

OpenCL kód kernelu Datové typy Téměř všechny běžné typy dostupné v jazyce C Některé předdefinované typy: size_t, ptrdiff_t Speciální typ half 16bit. varianta float Vektorové datové typy Pro číselné typy existují vektorové varianty charn, intn, floatn, longn, kde n je 2, 4, 8 nebo 16 K jednotlivým složkám se přistupuje, jako k prvkům struktury int4 vec = (int4) (1, 2, 3, 4); int x = vec.x; \\ položky jsou xyzw nebo 0-f Na položky je možné uplatnit swizzling (přehazování a duplikace): float4 dup = vec.xxyy; float4 rot = vec.yzwx; verze 1.1 2010-2011, Martin Kruliš 15

Funkce OpenCL kód kernelu V rámci jednoho programu může být definováno více funkcí, které se mohou vzájemně volat (kernel je jen vstupní bod). Je možné volat i jiné funkce (např. printf), ale jejich skutečné zavolání závisí na kontextu, kde se kernel pouští Na CPU se provedou, na GPU nikoli Existuje řada vestavěných funkcí Funkce vlákna (např. get_global_id()) Matematické funkce Velmi široká paleta zejména pro grafické operace Na GPU existuje pro spoustu z nich jediná instrukce Geometrické funkce (skalární součin, euklidovská vzdálenost, ) Funkce pro asynchronní přenosy dat z/do globální paměti verze 1.1 2010-2011, Martin Kruliš 16

OpenCL kód kernelu Výkon a optimalizace Podmínky a větvení kódu Skupina vláken běží v SIMT režimu vykonávají se všechny větve Pokud to jde, je lepší použít podmíněné přiřazení Místo if (up) y += dy; else y -= dy; For-cykly Raději int f = (up)? 1 : -1; y += f*dy; Překladač se je automaticky pokouší rozvinout While-cykly Stejný problém jako u if-u Vektorové instrukce Na ATI může pomoct (každé jádro je 5D stream procesor) Na CPU se typicky přeloží do SSE Překladač se pokouší vektorové instrukce generovat sám verze 1.1 2010-2011, Martin Kruliš 17

OpenCL synchronizace Na úrovni klientské aplikace Operace ve frontě se provádí out-of-order Na dokončení operace lze čekat Globální bariéry Na úrovni kernelu Bariéry Fungují pouze lokálně v rámci jedné skupiny Memory fence Atomické operace (volitelné rozšíření) Lokální i globální (32 nebo 64 bit integer) Dva typy base a extended Base běžné operace jako add, sub, xchg a cmpxhg Extended atomický min, max, and, or, xor verze 1.1 2010-2011, Martin Kruliš 18

Příklad ze života Násobení matic kernel void mul_matrix ( global const float *m1, global const float *m2, global float *mres) { } int n = get_global_size(0); int r = get_global_id(0); int c = get_global_id(1); float sum = 0; for (int i = 0; i < n; ++i) sum += m1[r*n + i] * m2[c*n + i]; mres[r*n + c] = sum; Druhá matice je již transponovaná verze 1.1 2010-2011, Martin Kruliš 19

ms Násobení matic Násobení dvou čtvercových matic floatů Na AMD Radeon 8570 (320 jader) a Core i7 (4 jádra s HT) Standardní algoritmus O(N 3 ), druhá matice je transponovaná (optimalizace pro procesorové cache) 35000 30000 29370 25000 20000 15000 1024x1024 2048x2048 10000 5000 0 3630 4090 2338 3400 591 319 392 CPU TBB OCL - CPU OCL - GPU Hmm verze 1.1 2010-2011, Martin Kruliš 20

Kde je problém? Podívejme se na výsledky profileru Matice 1024x1024 Kolikrát každé vlákno četlo z globální paměti Kolik % celkového času se četla paměť Procentuální poměr ALU op. vs. čtení Kolik % celkového času čekaly fetch jednotky na data verze 1.1 2010-2011, Martin Kruliš 21

Přístup do globální paměti Coalesed Memory Load Na GPU běží vždy několik vláken v SIMT módu společně NVIDIA warp 32 vláken (resp. half-warp 16 vláken) AMD/ATI wavefront 64 vláken Pokud tato vlákna načítají paměťové bloky zarovnaně, provede se coalesed load a všechna paměť se načte najednou. Každé vlákno musí načítat buňku velikosti 4B (jeden int nebo float). Přesná pravidla se liší kartu od karty (viz materiály výrobců). 0 B 64 B paměť vlákna verze 1.1 2010-2011, Martin Kruliš 22

Přístup do lokální paměti Lokální paměť Sdílená mezi vlákny ve skupině (warpu). Velmi malá (16-64KB) a stejně rychlá jako registry Rozdělená do bank (buňky velikosti 4B modulo #bank). NVIDIA 16 bank, ATI 32 bank banky vlákna Do 1 banky přistupuje 1 vlákno (na přeskáčku) banky vlákna Broadcast (pouze NVIDIA) verze 1.1 2010-2011, Martin Kruliš 23

Násobení matic úprava pro GPU kernel void mul_matrix_opt ( global const float *m1, global const float *m2, global float *mres, local float *tmp1, local float *tmp2) { int size = get_global_size(0); int lsize_x = get_local_size(0); int lsize_y = get_local_size(1); int block_size = lsize_x * lsize_y; int gid_x = get_global_id(0); int gid_y = get_global_id(1); int lid_x = get_local_id(0); int lid_y = get_local_id(1); int offset = lid_y*lsize_x + lid_x; Zkopírujeme část matice do lokální paměti float sum = 0; for (int i = 0; i < size; i += lsize_x) { // Load data to local memory tmp1[offset] = m1[gid_y*size + i + lid_x]; for (int j = 0; j < lsize_x / lsize_y; ++j) tmp2[offset + j*block_size] = m2[(gid_x + lsize_y*j)*size + i + lid_x]; barrier(clk_local_mem_fence); // Add data from block to the sum for (int k = 0; k < lsize_x; ++k) sum += tmp1[lid_y*lsize_x + k] * tmp2[lid_x*lsize_x + k]; barrier(clk_local_mem_fence); } mres[gid_y*size + gid_x] = sum; Spočítáme mezivýsledky z } načtených částí verze 1.1 2010-2011, Martin Kruliš 24

ms Násobení matic úprava pro GPU Verze optimalizovaná pro GPU 45x rychlejší než sériová verze 3.6x rychlejší než paralelní verze 35000 30000 29370 25000 20000 15000 1024x1024 2048x2048 10000 5000 0 3630 4090 3400 2338 591 319 392 100 654 CPU TBB OCL - CPU OCL - GPU OCL - GPU opt. verze 1.1 2010-2011, Martin Kruliš 25

Násobení matic výsledky profileru Výsledky profileru po optimalizaci Fetch se zmenšilo ze 2048 na 128 Poměr ALU operací ku čtení vzrostl na 45% Čtení zabralo pouze 9% celkového času a pouze 5% se na data čekalo Ale Docházelo ke 100% množství kolizí na bankách lokální paměti verze 1.1 2010-2011, Martin Kruliš 26

Násobení matic přenosy dat Doba potřebná na přenos dat na GPU a zpět Matice 1024x1024 floatů (2x 4 MB tam, 4 MB zpět) 1024 372 20 Výpočet Přenosy dat 1024 opt 80 20 0 50 100 150 200 250 300 350 400 450 Matice 2048x2048 floatů (2x 16 MB tam, 16 MB zpět) 2048 3330 70 Výpočet Přenosy dat 2048 opt 587 67 0 500 1000 1500 2000 2500 3000 3500 4000 verze 1.1 2010-2011, Martin Kruliš 27

ms Jednoduché operace Jednoduché operace nad dvěma vektory 16 M float čísel Násobení: z[i] = x[i] * y[i]; Složitější vzoreček: z[i] = (sqrt(x[i])*y[i]/x[i]) + cos(y[i]) * x[i]; 600 500 505 400 300 Násobení Vzoreček 200 100 38 23 137 148 148 Pouze 2.1 (resp. 5.5) ms trval samotný výpočet 0 CPU TBB OpenCL verze 1.1 2010-2011, Martin Kruliš 28

ms Backtracking Variace na součet podmnožiny Dána množina (30ti) čísel; každé je v součtu jako kladné nebo záporné a hledáme předepsaný součet. Maximální vytížení kombinace neexistuje (máme sudá čísla, chceme liché). 7000 6000 6193 5000 4000 3000 2000 1875 1000 493 0 CPU TBB OpenCL verze 1.1 2010-2011, Martin Kruliš 29

Potíže při nasazení Ovladače Ovladače jsou poměrně mladé. Občas může chyba programu běžícího na GPU způsobit pád OS. Data Data je potřeba přesunou z operační přes PCIe do zařízení a zpět. Málo DRAM, část spotřebuje OS na zobrazování Task Parallel Execution Momentálně umí pouze NVIDIA Fermi Kompilace kernel-u Kompilace chvíli trvá (i jednotky sekund) vyplatí se? verze 1.1 2010-2011, Martin Kruliš 30

OpenCL vs. OpenGL Provázání OpenCL a OpenGL OpenCL je mladší bratr OpenGL Silná podpora pro práci s (nejen 3D) grafikou Datový typ pro 2D a 3D obrázky Speciální typ umožňuje definovat, jak jsou reprezentovány barvy Řada konverzí CL buffer GL buffer CL image object GL texture CL buffer GL renderbuffer Sdílení CL a GL kontextu Vytváření CL objektů z GL objektů verze 1.1 2010-2011, Martin Kruliš 31

Alternativní technologie NVIDIA CUDA První GPGPU technologie (již v r. 2007) Cílem bylo přesunout zejména výpočty fyziky na GPU NVIDIA koupila v r. 2008 firmu Agelia a její technologii PhysX Jednodušší API Víme, že pracujeme s GPU odpadá detekce platforem, zařízení, Kernels jsou přímo v kódu a volají se téměř jako normální funkce KernelFnc<<<1, N>>>(A, B, C); Direct Compute Navržené Microsoftem, součást DirectX 11 (listopad 2009) Bližší integrace s vývojem her Použití velmi podobné jako vertex nebo fragment shaderu Pouští se speciální verze shaderů, kterým se dají speciální buffery verze 1.1 2010-2011, Martin Kruliš 32

Dotazy verze 1.1 2010-2011, Martin Kruliš 33