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

PŘEDSTAVENÍ GRAFICKÉHO PROCESORU NVIDIA G200

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

Nvidia CUDA Paralelní programování na GPU

Pokročilé architektury počítačů

Nvidia CUDA Paralelní programování na GPU

CUDA J. Sloup a I. Šimeček

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

Pokročilé architektury počítačů

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

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

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

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

GPU Computing.

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

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

Co je grafický akcelerátor

PROCESOR. Typy procesorů

Pokročilé architektury počítačů

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

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:

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

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

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

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

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

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

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

PV109: Historie a vývojové trendy ve VT

Hlavní využití počítačů

vlastnosti, praktické zkušenosti

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

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

Hardware. Z čeho se skládá počítač

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

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

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

Návrhy elektromagnetických zení

Závěrečná zpráva projektu Experimentální výpočetní grid pro numerickou lineární algebru

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

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

Optimalizace pro GPU hardware

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

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

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

HAL3000 MČR Pro tak hrají skuteční profesionálové

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

Grafické karty s podporou DirectX 11 Quynh Trang Dao Dao007

IB109 Návrh a implementace paralelních systémů. Organizace kurzu a úvod. RNDr. Jiří Barnat, Ph.D.

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

Operační paměti počítačů PC

Zobrazovací a zvuková soustava počítače

Paralelní systémy. SIMD jeden tok instrukcí + více toků dat jedním programem je zpracováváno více různých souborů dat

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Geneze grafických karet jako základní součásti PC Drahoslav Stejskal

Herní PC HAL3000 Artemis výkonný lovec pro nekončící zábavu

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

AGP - Accelerated Graphics Port

Karel Johanovský Michal Bílek SPŠ-JIA GRAFICKÉ KARTY

Pokročilá architektura počítačů

Cílem této kapitoly je seznámit s parametry a moduly stavebnice NXT. Obr. 1: Brick s moduly [3]

AKCELERACE EVOLUCE PRAVIDEL CELULÁRNÍCH AUTOMATŮ NA GPU

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

ARCHITEKTURA AMD PUMA

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

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

Kč s DPH HAL3000 TITAN X spoutejte sílu nejvýkonnějších technologií

Složení počítače. HARDWARE -veškeré fyzicky existující technické vybavení počítače 12 -MONITOR

Miroslav Tichý, tic136

Volitelný počet jader

Architektura počítače

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

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

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Charakteristika dalších verzí procesorů v PC

Pokročilé architektury počítačů

Grafické adaptéry. Jan Vrzal, verze 1.0

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

a co je operační systém?

Jednokamerový systém pro sledování objektů

Paměti EEPROM (1) Paměti EEPROM (2) Paměti Flash (1) Paměti EEPROM (3) Paměti Flash (2) Paměti Flash (3)

Implementace numerických metod v jazyce C a Python

Vlastnosti produktu. Neutuchající pracovní nasazení s HAL3000 EliteWork

Procesory nvidia Tegra

Průvodce vnitřkem počítače II

CHARAKTERISTIKY MODELŮ PC

Váš stylový multimediální společník v karamelově smetanovém provedení. Oficiální webové stránky VAIO Europe

Vícejádrový procesor. Dvě nebo více nezávislých jader Pro plné využití. podporovat multihreading

Vlastnosti produktu. Neutuchající pracovní nasazení s HAL3000 EliteWork

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

HP EliteBook 8440p. Záruka: 12 měsíců Cena: 5 690,- kč s DPH

Úvod do modelování v programu COMSOL Multiphysics verze 4

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

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

Textury v real-time grafice Josef Pelikán, MFF UK Praha Josef.Pelikan@mff.cuni.cz

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

Základní deska (mainboard, motherboard)

Hardwarová akcelerace HD videa v návaznosti na architektury čipu grafických karet

Využití ICT pro rozvoj klíčových kompetencí CZ.1.07/1.5.00/

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 GeForce GTX 580) GPU je navrženo pro současný běh až 512 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 - 194 GB/s

VÝHODY GPU FIGURE: Zdroj Nvidia Programming Guide

POROVNÁNÍ CPU VS. GPU Za přibližně 500 EUR lze koupit Nvidia INTEL Core i7-970 GeForce 580 Six-Core Transistors 3 000 millions??? 731 millions??? Clock 1.5 GHz 3.5 GHz Threads Num. 512 12 Peak. Perf. 1770 GFlops 200 GFlops Bandwidth 194 GB/s 25.6 GB/s RAM 1.5 GB 48 GB Power 244 W 130 W

CO JE GPGPU? mějmě 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 Fermi FIGURE: Zdroj Nvidia

CUDA ARCHITEKTUR I. GeForce 580 16 multiprocesorů (Streaming Multiprocessors) - každý má 32 jader/procesorů pro jednotlivá vlákna 64 kb velmi rychlé paměti, která může částečně fungovat jako cache tato pamět se dělí do 16 modulů - jeden pro každé vlákno šest 64-bitových pamět ových modulů pro 384-bitový přístup a až 6 GB RAM 768 kb L2 Cache

CUDA ARCHITEKTUŘE II. FIGURE: Zdroj Nvidia

CUDA ARCHITEKTUŘE II. Každý multiprocesor se skládá z: 32 výpočetních jader 32k 32-bitových registrů 64 kb SRAM provede jednu FMA operaci na jeden takt u float a dva takty u double 16 jednotek pro načítání a zápis dat umí adresovat pamět dvourozměrně umí převádět data mezi různými typy např. int n float apod. čtyři speciální jednotky se používají pro výpočet 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 FIGURE: Zdroj Nvidia: Getting Started with CUDA

PAMĚŤOVÝ MODEL FIGURE: Zdroj Nvidia: Getting Started with CUDA

PAMĚŤOVÁ HIERARCHIE FIGURE: Zdroj Nvidia: Getting Started with CUDA

PROGRAMOVÁNÍ V CUDA I. 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!!! Následující kód v C int main() { float A[ N ], B[ N ], C[ N ];... for( int i = 0; i <= N-1, i ++ ) C[ i ] = A[ i ] + B[ i ]; }

PROGRAMOVÁNÍ V CUDA II. lze v CUDA zapsat jako global void vecadd( float* A, float* B, float* C ) { int i = threadidx.x; if( i = < N ) C[ i ] = A[ i ] + B[ i ]; } int main() { // allocate A, B, C on the CUDA device... vecadd<<< 1,N >>>( A, B, C ); }

ALOKOVÁNÍ PAMĚTI NA CUDA ZAŘÍZENÍ // Allocate input vectors h_a and h_b in host memory float* h_a = malloc(size); float* h_b = malloc(size); // Allocate vectors in device memory float* d_a; cudamalloc((void**)&d_a, size); float* d_b; cudamalloc((void**)&d_b, size); float* d_c; cudamalloc((void**)&d_c, size); // Copy vectors from host memory to device memory cudamemcpy(d_a, h_a, size, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, size, cudamemcpyhosttodevice); // Invoke kernel VecAdd<<< 1, N >>>(d_a, d_b, d_c); // Copy result from device memory to host memory // h_c contains the result in host memory cudamemcpy(h_c, d_c, size, cudamemcpydevicetohost); // Free device memory cudafree(d_a); cudafree(d_b); cudafree(d_c); Kód uložíme v cuda-example.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á - méně než 5 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 FIGURE: Zdroj Nvidia: Nvidia CUDA programming guide

SLOUČENÉ PŘÍSTUPY DO PAMĚTI FIGURE: Zdroj Nvidia: Nvidia CUDA programming guide

SLOUČENÉ PŘÍSTUPY DO PAMĚTI FIGURE: Zdroj Nvidia: Nvidia CUDA programming guide

PAMĚŤ TEXTUR Není-li možné dosáhnout sloučených přístupů do globální paměti, lze využít kešovanou pamět textur. nejprve je nutné ji bindovat s texturou pomocí cudabindtexture v daném kernelu do této paměti nelze zapisovat textura může být 1 nebo 2 dimenzionální s každým načteným prvkem se načítají i okolní prvky Nelze-li efektivně využít pamět pro textury, lze již spoléhat jen na keš.

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ĚŤ MULTIPROCESORU sdílená pamět multiprocesoru je rozdělena na 16 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 16 č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 warp se dělí na dvě poloviny - halfwarps to je důležité z pohledu přístupu do sdílené paměti multiprocesoru multiprocesor má jen 16 jednotek pro načítání/zápis dat, proto je celý warp obsloužen vždy ve dvou krocích

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

BUDOUCNOST GPU Ale GPU je pro mnoho typů úloh mnohem lepší architektura než CPU stále je některými lidmi považováno za herní zařízení i s pomocí CUDA je vývoj algoritmů pomalý a vyžaduje detailní znalosti zatím neexistují knihovny běžných algoritmů pro GPU slabá podpora pro dvojitou přesnost omezená pamět na 6 GB málo zkušeností s GPU klastry GPU se stále vyvíjí velmi rychle a je náročné sledovat všechny změny možná fůze s CPU

CUDA 3 AND FERMI podpora keší na multiprocesoru - 64Kb podpora ECC RAM "úplná podpora" C++ printf jako funkce kernelu usnadňuje ladění

CUDA 4 lepší podpora pro počítání na více GPU lze obsluhovat více GPU z jednoho vlákna unifikovaný adresový prostor

ZBYTEK SVĚTA ATI/AMD - Radeon GPUs podporuje OpenCL (Nvidia také) OpenCL nepodporuje C++ and Fortran AMD Fusion - GPU implementované na základní desce a sdílející pamět s CPU odstraňuje nutnost přenosu dat CPU GPU ale pracuje s běžnou a pomalou DRAM Intel nové CPU od Intelu obsahují GPU také Larabee architektura

FUTURE OF CUDA? Nvidia má vedoucí postavení v GPGPU díky CUDA CUDA nepodporuje GPU od AMD CUDA má brzy podporovat vícejádrové systémy = běh kernelů n x86 Nvidia nemá vlastní CPU investuje do ARM architektury Nvidia Tegra Microsoft oznámil podporu Windows 8 na ARM CPUs AMD ohlásilo vývoj ARM CPU Nvidia plánuje vytvořit ARM CPU pro HPC