CUDA J. Sloup a I. Šimeček

Podobné dokumenty
Pokročilé architektury počítačů

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

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

GPU A CUDA HISTORIE GPU CO JE GPGPU? NVIDIA CUDA

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

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

Pokročilé architektury počítačů

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

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

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

GPU Computing.

Část 3 CUDA VS. OPENCL, OPENACC

Nvidia CUDA Paralelní programování na GPU

Pokročilé architektury počítačů

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

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

Nvidia CUDA Paralelní programování na GPU

Procesy a vlákna (Processes and Threads)

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

Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček

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

Optimalizace pro GPU hardware

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

Architektury VLIW M. Skrbek a I. Šimeček

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

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

11. Přehled prog. jazyků

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

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

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

Matematika v programovacích

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

PŘEDSTAVENÍ GRAFICKÉHO PROCESORU NVIDIA G200

Struktura programu v době běhu

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

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

CUDA OpenCL PhysX Literatura NPGR019. Úvod do architektury CUDA. MFF UK Praha. Jan Horáček CUDA 1 / 53

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

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

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

Mělká a hluboká kopie

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

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

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

Metody připojování periferií

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

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

8 Třídy, objekty, metody, předávání argumentů metod

Vláknové programování část I

Generátor efektivního kódu fúzovaných CUDA kernelů

Management procesu I Mgr. Josef Horálek

Architektury paralelních počítačů II.

PB161 Programování v jazyce C++ Přednáška 4

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

Opakování programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

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

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

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

Paralelní programování

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

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

Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.

Architektura Intel Atom

Algoritmizace a programování

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

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

Algoritmizace a programování

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

MSP 430F1611. Jiří Kašpar. Charakteristika

Ovladače pro Windows. Ovladače Windows A4M38KRP. Str. 1

Paralelní programování

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

VYUŽITÍ KNIHOVNY SWING PROGRAMOVACÍHO JAZYKU JAVA PŘI TVORBĚ UŽIVATELSKÉHO ROZHRANÍ SYSTÉMU "HOST PC - TARGET PC" PRO ŘÍZENÍ POLOVODIČOVÝCH MĚNIČŮ

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

Profilování paralelních aplikací Profiling of Parallel Applications

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

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

Cvičení MI-PRC I. Šimeček

Paralelní výpočetní jádro matematického modelu elektrostatického zvlákňování

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

Virtualizace. Lukáš Krahulec, KRA556

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

Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35

a co je operační systém?

Úvod do programování - Java. Cvičení č.4

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

Programování v C++ 1, 1. cvičení

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

vlastnosti, praktické zkušenosti

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

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

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

ČÁST 1. Základy 32bitového programování ve Windows

Metody připojování periferií

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Transkript:

CUDA J. Sloup a I. Šimeček xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PAP, LS2010/11, Predn.6 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti

CUDA (Compute Unified Device Architecture) CUDA je architektura pro provádění paralelních výpočtů, která definuje: Programming model vlákna (threads), blok (block) a mřížka (grid) Memory model registry, lokální, sdílená a globální paměť Execution model spouštění vláken a jejich mapování na HW Vývojové prostředí zahrnuje: Driver Runtime spouštění C funkcí na GPU Toolkit překladač, debugger, profiler Libraries CUFFT, CUBLAS, SDK dokumentace + ukázky kódu CUDA je podporována na všech grafických procesorech NVIDIA (CUDA enabled-gpus) počínaje čipem G80 CUDA programy je možno psát v jazyku C/C++ nebo Fortran.

CUDA základní pojmy CPU (označované jako host hostitel) Kernel = část kódu, kterou chceme provádět paralelně na GPU (def. jako funkce) Vlákno (thread) = instance kernelu GPU (označované jako device zařízení) je tvořeno multiprocesory. Streaming Multiprocesor (dále jen SM) se skládá z několika (např. 8 u G80) procesorů (jader = SP). SM provádějí bloky vláken. Warp je skupina vláken spouštěná najednou, např. 32 na GT200 GPU má SIMT architekturu = všechna vlákna v rámci warpu jsou ovládány jednou instrukční jednotkou = provádí stejnou instrukci (kromě podmíněných příkazů) Vlákna během výpočtu přistupují k různým druhům pamětí

2D architektura = škálovatelnost Každý GPU se může lišit Frekvencí GPU Pamětí a velikostí GPU paměti Počtem SM Počtem jader na SM Schopnostmi (CUDA capabilities) Protože jednotlivé SM pracují víceméně nezávisle, je snadné zvyšovat výkon GPU zvýšením počtu SM

Provádění GPU kódu Vlákna jsou sdružována do bloků a bloky do mřížky (2D) Vlákna v rámci bloku: lze synchronizovat (pomocí bariéry) mohou sdílet data pomocí sdílené paměti Programátor zadá (téměř libovolně) počet bloků a počet vláken v bloku (2D z hlediska programátora) To jak přesně bude kód prováděn udává execution model. Ten se stará o korektní a efektivní mapování na dané HW. V HW totiž existuje daný počet SM a daný počet SP na jeden SM. (2D z hlediska HW)

Provádění GPU kódu Každý blok vláken je prováděn na právě jednom SM. Na každý SM může být namapováno více bloků najednou (až 8 u GT200) Blok vláken je rozdělen do několika warpů (podle čísel vláken). Centrální distribuce bloků metodou round-robin. V každém časovém kroku plánovač naplánuje (nulová režie!) k provedení připravený warp (který má všechna data a neprovádí bariéru). Vlákna warpu pak provedou paralelně jednu instrukci. Plánování je HW akcelerováno GeForce 8800: maximálně 24 rozpracovaných warpů GTX 280: maximálně 32 rozpracovaných warpů

Bloky kontra vlákna I Je dobré mít velký počet vláken v bloku Synchronizace a předávání dat pomocí sdílené paměti jen v rámci jednoho bloku! Díky přeplánování mohou být amortizovány velké latence. Ale: Blok může obsahovat maximálně 512 threadů Každý SM může (současně) provádět 8 bloků, ale skutečný počet závisí na paměťových požadavcích na registry a sdílenou paměť = např. všechny bloky na SM mohou alokovat max. 16 kb sdílené paměti. Stejně tak je limitován počet registrů pro vlákno

Bloky kontra vlákna II Bloky by měly být nezávislé Být navrženy tak, aby každé pořadí jejich vyhodnocení bylo korektní Mohou běžet paralelně nebo sekvenčně Data mohou být sdílena mezi bloky ale problém se synchronizací

Jednoduchý CUDA příklad // definice kernelu global void VecAdd(float* A, float* B, float* C) { //identifikacni cislo vlakna int i = threadidx.x; C[i] = A[i] + B[i]; } int main() { // volani kernelu z funkce main VecAdd<<<1, N>>>(A, B, C); Musí být void Číslo v rámci bloku } Počet vláken v bloku Počet bloků

Mřížka bloků Bloky mi mohou obecně tvořit (maximálně 2D) mřízku = grid Obdobně vlákna v rámci bloku mi mohou obecně tvořit (maximálně 3D) matici. Ale mřížka i matice jsou převedeny do 1D, takže nemají velký význam kromě vyššího komfortu pro programátora při přístupu do vícedimenzionálního pole.

Mapování

Kompilace CUDA soubory mají příponu.cu Kompilátor nvcc (přesněji compiler driver). Ten má podobné parametry jako gcc. nvcc vezme zdrojový kód v.cu (nebo i.c/.cpp) souboru a za použití dalších aplikací, jako gcc, cl, apod. zkompiluje standardní c/c++ zdrojový kód do spustitelné podoby. Kód určený pro GPU, je přeložen do ptx (Parallel Thread Execution) virtual machine mezikódu. Podporuje i budoucí generace GPU PTX je následně zkompilován během spuštení (JIT pomocí ovladače grafické karty) do binárního kódu pro dané zařízení (pro danou verzi compute capability). Společně se spustitelným kódem se slinkují i knihovny cudart (CUDA runtime library) a cuda (CUDA core library), nutné k běhu aplikace

Synchronizace s hostitelem Spuštení kernelů je asynchronní operace Vrací řízení CPU ihned jak je to možné Pokud je třeba počkat na dokončení práce všech CUDA volání cudathreadsynchronize() kernel je spuštěn po dokončení všech předchozích CUDA voláních Operace kopírování cudamemcpy() je synchronní, je spuštěna po dokončení všech předchozích CUDA voláních

Násobení matic (CUDA v1) I global void Mul_IJ( float *ina, float *inb, float *outc, int N ) { int i=blockidx.x; int j=threadidx.x; int k; float s=0.0; Číslo bloku Číslo v rámci bloku } for(k=0;k<n;k++) s+=ina[i*n+k]*inb[k*n+j]; outc[i*n+j]=s; syncthreads(); Bariéra v rámci bloku

Násobení matic (CUDA v1) II static void HandleError( cudaerror_t err, const char *file, int line ) { if (err!= cudasuccess) { printf( "%s in %s at line %d\n", cudageterrorstring( err ), file, line ); exit( EXIT_FAILURE ); }} Zpracování chyb #define HANDLE_ERROR( err ) (HandleError( err, FILE, LINE )) int main( void ) { cudadeviceprop prop; int whichdevice,n,i,j; cudaevent_t start, stop; float elapsedtime; float *hostm, *hostm2,*hostx,*hosty; float *devm,*devx,*devy; Vlastnosti GPU CUDA události Ukazatele

Násobení matic (CUDA v1) III HANDLE_ERROR( cudagetdevice( &whichdevice ) ); HANDLE_ERROR( cudagetdeviceproperties( &prop, whichdevice ) ); HANDLE_ERROR( cudaeventcreate( &start ) ); HANDLE_ERROR( cudaeventcreate( &stop ) ); Inicializace HANDLE_ERROR( cudamalloc( (void**)&devx, N * N* sizeof(float) ) ); HANDLE_ERROR( cudamalloc( (void**)&devy, N * N *sizeof(float) ) ); HANDLE_ERROR( cudamalloc( (void**)&devm, N * N * sizeof(float) ) ); HANDLE_ERROR( cudahostalloc( (void**)&hostx, N * N* sizeof(float), cudahostallocdefault ) ); HANDLE_ERROR( cudahostalloc( (void**)&hosty, N * N *sizeof(float), cudahostallocdefault ) ); HANDLE_ERROR( cudahostalloc( (void**)&hostm, N * N *sizeof(float), cudahostallocdefault ) ); HANDLE_ERROR( cudahostalloc( (void**)&hostm2, N * N *sizeof(float), cudahostallocdefault ) ); Alokace paměti na GPU Alokace paměti na CPU

Násobení matic (CUDA v1) IV cudamemcpy(devx,hostx,sizeof(int)*n*n,cudamemcpyhosttodevice); cudamemcpy(devy,hosty,sizeof(int)*n*n,cudamemcpyhosttodevice); Kopírování CPU -> GPU HANDLE_ERROR( cudaeventrecord( start, 0 ) ); Volání kernelu Mul_I<<<N,N>>>( devx, devy, devm, N ); cudathreadsynchronize(); HANDLE_ERROR( cudaeventrecord( stop, 0 ) ); Zjištění času HANDLE_ERROR( cudaeventsynchronize( stop ) ); HANDLE_ERROR( cudaeventelapsedtime( &elapsedtime, start, stop ) ); printf( GPU time taken: %g ms\n", elapsedtime ); cudamemcpy(hostm,devm,sizeof(float)*n*n,cudamemcpydevicetohost); Kopírování GPU -> CPU

Násobení matic (CUDA v1) V HANDLE_ERROR( cudaeventdestroy( start ) ); HANDLE_ERROR( cudaeventdestroy( stop ) ); HANDLE_ERROR( cudafreehost( hostx ) ); HANDLE_ERROR( cudafreehost( hosty ) ); HANDLE_ERROR( cudafreehost( hostm ) ); HANDLE_ERROR( cudafreehost( hostm2 ) ); HANDLE_ERROR( cudafree( devx ) ); HANDLE_ERROR( cudafree( devy ) ); HANDLE_ERROR( cudafree( devm ) );

Literatura [1] J. Sloup: přednášky z předmětu GPGPU, KPGI FEL ČVUT. [2] CUDA Programming Guide for CUDA Toolkit 3.1.1. [3] René Müller: Data Processing on GPUs and GPGPUs. Lecture in class 63-3502-00:Data Processing on Modern Hardware. ETH Zurich. Fall 2009. [4] http://www.root.cz/clanky/uvod-do-technologie-cuda/