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

Podobné dokumenty
GPU a CUDA. Historie GPU. Co je GPGPU? Nvidia CUDA

GPU A CUDA HISTORIE GPU CO JE GPGPU? NVIDIA CUDA

Pokročilé architektury počítačů

CUDA J. Sloup a I. Šimeček

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

Pokročilé architektury počítačů

Nvidia CUDA Paralelní programování na GPU

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

PŘEDSTAVENÍ GRAFICKÉHO PROCESORU NVIDIA G200

Pokročilé architektury počítačů

Nvidia CUDA Paralelní programování na GPU

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

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

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

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

Co je grafický akcelerátor

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

GPU Computing.

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

Optimalizace pro GPU hardware

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

Hlavní využití 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

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

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

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

Část 2 POROVNÁNÍ VÝKONNOSTI A POUŽITELNOSTI ARCHITEKTUR V TYPICKÝCH APLIKACÍCH

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

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

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

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

HW počítače co se nalézá uvnitř počítačové skříně

Osobní počítač. Zpracoval: ict Aktualizace:

Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC

PROCESOR. Typy procesorů

Architektura grafických ip pro Xbox 360 a PS3

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

2.8 Procesory. Střední průmyslová škola strojnická Vsetín. Ing. Martin Baričák. Název šablony Název DUMu. Předmět Druh učebního materiálu

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Geekovo Minimum. Počítačové Grafiky. Nadpis 1 Nadpis 2 Nadpis 3. Božetěchova 2, Brno

Představení a srovnání grafických procesorů ATI RV770 a NVIDIA G(T)200

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

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

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Mezipaměti počítače. L2 cache. L3 cache

Intel (2) Intel (1) Intel (3) Intel (4) Intel (6) Intel (5) Nezřetězené zpracování instrukcí:

Pohled do nitra mikroprocesoru Josef Horálek

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

PV109: Historie a vývojové trendy ve VT

vlastnosti, praktické zkušenosti

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Ro R dina procesor pr ů Int In e t l Nehalem Šmída Mojmír, SMI108 PAP PA 2009

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

GPU jako levný výpočetní akcelerátor pro obrazovou JPEG2000 kompresi. ORS 2011 Karviná,

Cache paměť - mezipaměť

Procesy a vlákna (Processes and Threads)

Architektura Intel Atom

Paralelní architektury - úvod

Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC

Identifikátor materiálu: ICT-1-08

Nová architektura od ATI (Radeon HD 4800) Datum: Vypracoval: Bc. Radek Stromský

G R A F I C K É K A R T Y

Technické prostředky počítačové techniky

Paralelní architektury - úvod

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

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

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

Část 1 ZÁKLADNÍ RYSY VÝPOČETNÍ PROSTŘEDKŮ DOSTUPNÝCH NA IT4INNOVATIONS

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

Paralelní architektury se sdílenou pamětí

Paralelní programování

Knihovny pro CUDA J. Sloup a I. Šimeček

AGP - Accelerated Graphics Port

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

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

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

VYUŽITÍ GRAFICKÉHO ADAPTÉRU PRO OBECNÉ VÝPOČTY GENERAL-PURPOSE COMPUTATION USING GRAPHICS CARD

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

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

Funkční objekty v C++.

Paměťový podsystém počítače

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

Povídání na téma SUPERPOČÍTAČE DNES A ZÍTRA

Hardware. Příklad převodu čísla: =1*32+0*16+0*8+1*4+0*2+1*1= Převod z dvojkové na desítkovou Sčítání ve dvojkové soustavě

Operační systémy. Přednáška 8: Správa paměti II

INFORMAČNÍ A KOMUNIKAČNÍ TECHNOLOGIE

Cell broadband engine architecture

CHARAKTERISTIKA MODERNÍCH PENTIÍ. Flynnova klasifikace paralelních systémů

České vysoké učení technické v Praze

Paměti. Paměť je zařízení, které slouží k ukládání programů a dat, s nimiž počítač pracuje

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

1 Osobní počítač Obecně o počítačích Technické a programové vybavení... 4

Paralelní architektury se sdílenou pamětí

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Úvod do architektur personálních počítačů

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

Metoda sledování paprsku na grafických akcelerátorech. Martin Zlatuška

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Transkript:

GPU a CUDA Historie GPU Co je GPGPU? Nvidia CUDA

Historie GPU GPU = graphics processing unit jde o akcelerátory pro algoritmy v 3D grafice a vizualizaci mnoho z nich původně vzniklo pro účely počítačových her to byla často psychologická nevýhoda GPU typická úloha ve vizualizaci vypadá takto transformování miliónů polygonů aplikování textur o velikosti mnoha MB projekce na framebuffer žádná datová závislost

Historie GPU 1970 - ANTIC in 8-bit Atari 1980 - IBM 8514 1993 - Nvidia Co. založeno 1994-3dfx Interactive založeno 1995 - chip NV1 od Nvidia 1996-3dfx vydalo Voodoo Graphics 1999 - GeForce 256 by Nvidia - podpora geometrických transformací 2000 - Nvidia kupuje 3dfx Interactive 2002 - GeForce 4 vybaveno pixel a vertex shadery 2006 - GeForce 8 - unifikovaná architektura (nerozlišuje pixel a vertex shader) (Nvidia CUDA) 2008 - GeForce 280 - podpora dvojité přesnosti 2010 - GeForce 480 (Fermi) - první GPU postavené pro obecné výpočty - GPGPU

Výhody GPU (Nvidia Tesla P100) GPU je navrženo pro současný běh až 3800 vláken - virtuálně až stovek tisíc vláken vlákna musí být nezávislá - není zaručeno, v jakém pořadí budou zpracována GPU je vhodné pro kód s intenzivními výpočty a s malým výskytem podmínek není zde podpora spekulativního zpracování není zde podpora pro cache GPU je optimalizováno pro sekvenční přístup do paměti - 720 GB/s

Výhody GPU Obrázek : Zdroj Nvidia Programming Guide

Výhody GPU Obrázek : Růst výkonu GPU a CPU

Porovnání CPU vs. GPU Nvidia INTEL Core i7-5930 GeForce 980 Six-Core Transistors 5 200 millions 2 000 millions Clock 1.1 GHz 3.5 GHz Threads Num. 2048 12 Peak. Perf. 4.6 TFlops 0.2 TFlops Bandwidth 224 GB/s 68 GB/s RAM 4 GB 64 GB Power 165 W 130 W

Porovnání CPU vs. GPU Nvidia INTEL Xeon E5-2699A V4 Tesla P100 22 Cores Transistors 15.3 billions 7.2 billions Clock 1.3 GHz 3.6 GHz Threads Num. 3584 44 Peak. Perf. 10 TFlops 0.75 TFlops Bandwidth 720 GB/s 76.8 GB/s RAM 16 GB 1.54 TB Power 300 W 145 W

Co je GPGPU? mějme obdélník a pokryjme ho texturou s rozlišením 800x600 pixels promítneme ho jedna ku jedné do framebuferu/na obrazovku s rozlišením 800x600 pixelů co když použijeme dvě textury a alfa blending T (i, j) = α 1 T 1 (i, j) + α 2 T 2 (i, j), for all pixels (i, j) dostáváme váženou sumu dvou matic z R 800,600 a výsledek je uložen ve framebuferu/na obrazovce

Historie of GPGPU GPGPU = General Purpose Computing on GPU (www.gpgpu.org) Lengyel, J., Reichert, M., Donald, B.R. and Greenberg, D.P. Real-Time Robot Motion Planning Using Rasterizing Computer Graphics Hardware. In Proceedings of SIGGRAPH 1990, 327-335. 1990. 2003 - GPGPU na běžných GPUs

Podstata GPGPU na počátku bylo nutné pro GPGPU využívat rozhraní OpenGL úlohy byly formulovány pomocí textur a operací s pixely vývojáři her ale potřebovali flexibilnější hardware vznikly pixel shadery jde o jednoduchý programovatelný procesor pro operace s pixely má podporu pro výpočty s plovoucí desetinnou čárkou v jednoduché přesnosti velikost kódu byla omezena na několik desítek instrukcí

Nvidia CUDA CUDA = Compute Unified Device Architecture - Nvidia 15 February 2007 výrazně zjednodušuje programování v GPGPU zcela odstraňuje nutnost pracovat s OpenGL a formulování úloh pomocí textur je založena na jednoduchém rozšíření jazyka C/C++ funguje jen s kartami společnosti Nvidia Je velice snadné napsat kód pro CUDA ale je potřeba mít hluboké znalosti o GPU aby byl výsledný kód efektivní.

CUDA architektura I. Architektura Maxwell Obrázek : Zdroj Nvidia

CUDA architektur I. GeForce 980 skládá se ze 4 GPC = Graphic Processing Cluster každý GPC obsahuje 4 SMM = Streaming Multiprocessors všechny GPC mezi sebou sdílejí 2MB L2 cache dále obsahuje 4 GB GDDR5 RAM

CUDA architektura I. Architektura Maxwell Obrázek : Zdroj Nvidia

CUDA architektur I. GeForce 980 SMM Každý SMM se skládá z: 32 jader/procesorů pro jednotlivá vlákna 64 nebo 96 kb velmi rychlé sdílené paměti a 24 kb L1 cache sdílená pamět se dělí do 32 modulů LD/ST jsou jednotky pro přístup do globální paměti SFU jsou jednotky pro výpočty složitých funkcí jako sin, cos, tan, exp Od hardwarové architektury se odvíjí hierarchická struktura vláken:

Vlákna v CUDA CUDA host je CPU a operační pamět CUDA device je zařízení pro paralelní zpracování až stovek tisíc nezávislých vláken - threads CUDA thread je velmi jednoduchá struktura - rychle se vytváří a rychle se přepíná při zpracování komunikace mezi výpočetními jednotkami je hlavní problém v paralelním zpracování dat nemůžeme očekávat, že budeme schopni efektivně synchronizovat tisíce vláken CUDA architektura zavádí menší skupiny vláken zvané bloky - blocks

Bloky a gridy jeden blok je zpracován na jednom multiprocesoru vlákna v jednom bloku sdílejí velmi rychlou pamět s krátkou latencí vlákna v jednom bloku mohou být synchronizována v jednom bloku může být až 1024 vláken multiprocesor přepíná mezi jednotlivými vlákny tím zakrývá latence pomalé globální paměti zpracovává vždy ta vlákna, která mají načtena potřebná data, ostatní načítají Bloky vláken jsou seskupeny do gridu - grid.

Model zpracování vláken Obrázek : Zdroj Nvidia: Getting Started with CUDA

Pamět ový model Obrázek : Zdroj Nvidia: Getting Started with CUDA

Pamět ová hierarchie Obrázek : Zdroj Nvidia: Getting Started with CUDA

Programování v CUDA programování v CUDA spočívá v psaní kernelů - kernels kód zpracovaný jedním vláknem kernely nepodporují rekurzi podporují větvení kódu, ale to může snižovat efektivitu nemohou vracet žádný výsledek jejich parametry nemohou být reference podporují šablony C++ od CUDA 2.0 podporují funkci printf!!!

Programování v CUDA 1 #include <cuda. h> 2 #include <cuda_runtime_api. h> 3 #include <iostream > 4 5 global void cudavectoraddition ( double cuda_u, 6 const double cuda_v, 7 const i n t size, 8 const i n t grididx, 9 const i n t griddim ) ; 10 11 i n t main ( i n t argc, char argv [ ] ) 12 { 13 const i n t size ( 1 << 20 ) ; 14 double host_u, host_v, cuda_u, cuda_v ; 15 16 / 17 A l l o c a t i o n on the host 18 / 19 host_u = new double [ s ize ] ; 20 host_v = new double [ s ize ] ; 21 22 / 23 A l l o c a t i o n on the device 24 / 25 i f ( cudamalloc ( ( void ) & cuda_u, size sizeof ( double ) )!= cudasuccess 26 cudamalloc ( ( void ) & cuda_v, size sizeof ( double ) )!= cudasuccess ) 27 { 28 std : : c e r r << "Unable to allocate vectors on the device." << std : : endl ; 29 return EXIT_FAILURE ; 30 }

Programování v CUDA 1 / 2 Setting up the vectors 3 / 4 for ( int i = 0; i < size ; i ++ ) 5 { 6 host_u [ i ] = i ; 7 host_v [ i ] = size i ; 8 } 9 i f ( cudamemcpy ( ( void ) cuda_u, ( void ) host_u, 10 size sizeof ( double ), cudamemcpyhosttodevice )!= cudasuccess 11 cudamemcpy ( ( void ) cuda_v, ( void ) host_v, 12 s ize sizeof ( double ), cudamemcpyhosttodevice )!= cudasuccess ) 13 { 14 std : : c e r r << "Unable to copy data from the host to the device." << std : : endl ; 15 return EXIT_FAILURE ; 16 } 17 18 / 19 Compute the a d d i t i o n on the CPU 20 / 21 for ( i n t i = 0; i < size ; i ++ ) 22 host_u [ i ] += host_v [ i ] ;

Programování v CUDA 1 2 / 3 Run the CUDA k e r nel 4 / 5 dim3 cudablocksize ( 256 ) ; 6 cudadeviceprop properties ; 7 cudagetdeviceproperties ( &properties, 0 ) ; 8 i n t maxcudagridsize ( properties. maxgridsize [ 0 ] ) ; 9 const i n t cudablockscount = s ize / cudablocksize. x + 10 ( size % cudablocksize. x!= 0 ) ; 11 const i n t cudagridscount = cudablockscount / maxcudagridsize + 12 ( cudablockscount % maxcudagridsize!= 0 ) ; 13 for ( i n t g r i d I d x = 0; g r i d I d x < cudagridscount ; g r i d I d x ++ ) 14 { 15 dim3 cudagridsize ; 16 i f ( g r i d I d x < cudagridscount ) 17 cudagridsize. x = maxcudagridsize ; 18 else 19 cudagridsize. x = cudablockscount % maxcudagridsize ; 20 cudavectoraddition <<< cudagridsize, cudablocksize >>> 21 ( cuda_u, cuda_v, size, grididx, maxcudagridsize ) ; 22 cudaerror err = cudagetlasterror ( ) ; 23 i f ( e r r!= cudasuccess ) 24 { 25 std : : cerr << "Computation on the device failed with error: " 26 << cudageterrorstring ( err ) << "." << std : : endl ; 27 return EXIT_FAILURE ; 28 } 29 }

Programování v CUDA 1 2 / 3 Copy the r e s u l t back to the host 4 / 5 i f ( cudamemcpy ( ( void ) host_v, ( void ) cuda_u, 6 size sizeof ( double ), cudamemcpydevicetohost )!= cudasuccess ) 7 { 8 std : : c e r r << "Unabel to copy data back from the GPU." << std : : endl ; 9 return EXIT_FAILURE ; 10 } 11 12 i f ( memcmp( ( void ) host_u, ( void ) host_v, size sizeof ( double ) )!= 0 ) 13 { 14 std : : c e r r << "The results are different." << std : : endl ; 15 return EXIT_FAILURE ; 16 } 17 std : : cout << "Everything is ok." << std : : endl ; 18 19 / 20 Freeing a l l o c a t e d memory 21 / 22 delete [ ] host_u ; 23 delete [ ] host_v ; 24 cudafree ( cuda_u ) ; 25 cudafree ( cuda_v ) ; 26 } 27 28 global void cudavectoraddition ( double cuda_u, 29 const double cuda_v, 30 const i n t size, 31 const i n t grididx, 32 const i n t griddim ) 33 { 34 const i n t t i d = ( grididx griddim + blockidx. x ) blockdim. x + threadidx. x ; 35 i f ( t i d < size ) 36 cuda_u [ t i d ] += cuda_v [ t i d ] ; 37 }

Programování v CUDA Kód uložíme do cuda-vector-addition.cu a přeložíme pomocí nvcc.

Vývoj efektivního kódu Pro získání efektivního kódu je nutné dodržet následující pravidla: redukovat přenos dat mezi CPU (CUDA host) a GPU (CUDA device) optimalizovat přístup do globální paměti omezit divergentní vlákna zvolit správnou velikost bloků

Komunikace mezi CPU a GPU komunikace přes PCI Express je velmi pomalá cca. 8 GB/s je nutné tuto komunikaci minimalizovat ideálně provést jen na začátku a na konci výpočtu GPU se nevyplatí pro úlohy s nízkou aritmetickou intenzitou z tohoto pohledu mohou mít výhodu on-board GPU, které sdílí operační pamět pokud je nutné provádět často komunikaci mezi CPU a GPU pak je dobré jí provádět formou pipeliningu je možné provádět najednou výpočet na GPU výpočet na CPU kopírování dat z CPU do GPU kopírování dat z GPU na CPU

Sloučené přístupy do pamětí většinu přístupů GPU do globální paměti tvoří načítání textur GPU je silně optimalizováno pro sekvenční přístup do globální paměti programátor by se měl vyhnout náhodným přístupům do globální paměti ideální postup je: načíst data do sdílené paměti multiprocesoru provést výpočty zapsat výsledek do globální paměti sloučený přístup - coalesced memory access - může velmi výrazně snížit (až 32x) počet pamět ových transakcí

Sloučené přístupy do paměti Obrázek : Zdroj Nvidia: Nvidia CUDA programming guide

Sloučené přístupy do paměti Obrázek : Zdroj Nvidia: Nvidia CUDA programming guide

Sloučené přístupy do paměti Obrázek : Zdroj Nvidia: Nvidia CUDA programming guide

Keš Architektura Fermi zavádí plně funkční L1 a L2 keše. L1 keš se nachází na každém multiprocesoru lze nastavit, jaká část ze 64kB SRAM paměti bude určeno pro keš pomocí funkce: cudafuncsetcacheconfig( MyKernel, cudafunccacheprefershared ) cudafunccacheprefershared - shared memory is 48 KB cudafunccachepreferl1 - shared memory is 16 KB cudafunccacheprefernone - no preference L2 keš je společná pro všechny multiprocesory a má velikost 768kB

Sdílená pamět multiprocesoru sdílená pamět multiprocesoru je rozdělena na 32 pamět ových bank data se ukládají do jednotlivých bank vždy po 4 bajtech je potřeba se vyhnout situaci, kdy dvě vlákna ze skupiny 32 čtou z různých adres v jedné bance nevadí, když čte více vláken ze stejné adresy, použije se broadcast

Divergentní vlákna CUDA device umí zpracovávat současně různé kernely, ale jen na různých multiprocesorech Nvidia tuto architekturu nazývá SIMT = Single Instruction, Multiple Threads v rámci jednoho multiprocesoru jde ale o SIMD architekturu, tj. všechny jednotky provádějí stejný kód warp je skupina 32 vláken zpracovávaných současně vlákna ve warpu jsou tedy implicitně synchronizovaná všechna by měla zpracovávat stejný kód

Zpracování bloků vláken na multiprocesoru na mutliprocesoru většinou běží více bloků vláken scheduler mezi nimi přepíná a spouští vždy ty bloky vláken, které mají načteny potřebná data tím se zakrývají velké latence globální paměti k tomu je ale potřeba, aby jeden blok nevyčerpal všechny registry a sdílenou pamět pokud není dostatek registrů, ukládají se proměnné do local memory - to je pomalé je potřeba dobře zvolit velikost bloku - násobek 32 minimalizovat počet proměnných a množství sdílené paměti použité jedním blokem minimalizovat velikost kódu kernelu efektivnost obsazení multiprocesoru udává parametr zvaný occupancy (maximum je 1.0) za účelem optimalizace lze použít CUDA occupancy calculator 1 CUDA profiler výpisy nvcc -ptxas-options=-v 1 http://developer.download.nvidia.com/compute/cuda/cuda_occupancy_calculator.xls

Multi-GPU systémy do jednoho PC lze instalovat az 4 GPU navíc existují i dvoučipové GPU karty dostáváme tak systém s distribuovanou pamětí jednotlivá GPU nemají přímý přístup do paměti těch ostatních více v CUDA Programming Guide