JCuda Czy Java i CUDA mogą się polubić? Konrad Szałkowski



Podobne dokumenty
Libra.cs.put.poznan.pl/mailman/listinfo/skisrkolo.

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

Programowanie kart graficznych

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Programowanie Współbieżne

Programowanie aplikacji równoległych i rozproszonych

Programowanie procesorów graficznych GPGPU

Tesla. Architektura Fermi

Programowanie kart graficznych

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Programowanie Równoległe wykład 12. OpenGL + algorytm n ciał. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

CUDA obliczenia ogólnego przeznaczenia na mocno zrównoleglonym sprzęcie. W prezentacji wykorzystano materiały firmy NVIDIA (

CUDA część 1. platforma GPGPU w obliczeniach naukowych. Maciej Matyka

Programowanie CUDA informacje praktycznie i. Wersja

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Przetwarzanie Równoległe i Rozproszone

Architektury komputerów Architektury i wydajność. Tomasz Dziubich

Obliczenia na GPU w technologii CUDA

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

i3: internet - infrastruktury - innowacje

CUDA. cudniejsze przyk ady

Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych

CUDA. obliczenia na kartach graficznych. Łukasz Ligowski. 11 luty Łukasz Ligowski () CUDA 11 luty / 36

Programowanie CUDA informacje praktycznie i przykłady. Wersja

Programowanie Równoległe Wykład, CUDA praktycznie 1. Maciej Matyka Instytut Fizyki Teoretycznej

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Moc płynąca z kart graficznych

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

Podsystem graficzny. W skład podsystemu graficznego wchodzą: karta graficzna monitor

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Programowanie procesorów graficznych GPGPU

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

4 NVIDIA CUDA jako znakomita platforma do zrównoleglenia obliczeń

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Zastosowanie technologii nvidia CUDA do zrównoleglenia algorytmu genetycznego dla problemu komiwojażera

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Transformacja Fouriera i biblioteka CUFFT 3.0

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Programowanie współbieżne Wprowadzenie do programowania GPU. Rafał Skinderowicz

Programowanie PKG - informacje praktycznie i przykłady. Wersja z Opracował: Rafał Walkowiak

Procesory kart graficznych i CUDA wer

Raport Hurtownie Danych

Praca dyplomowa magisterska

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Julia 4D - raytracing

Programowanie kart graficznych. Kompilator NVCC Podstawy programowania na poziomie API sterownika

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Organizacja pamięci w procesorach graficznych

Procesory kart graficznych i CUDA wer

CUDA ćwiczenia praktyczne

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Programowanie procesorów graficznych w CUDA.

Autor: inż. Wojciech Zatorski Opiekun pracy: dr inż. Krzysztof Małecki

WIDEOS O ER E WER E ÓW

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Architektura von Neumanna

CUDA jako platforma GPGPU w obliczeniach naukowych

Wykorzystanie architektury Intel MIC w obliczeniach typu stencil

OpenGL - Open Graphics Library. Programowanie grafiki komputerowej. OpenGL 3.0. OpenGL - Architektura (1)

Jacek Matulewski - Fizyk zajmujący się na co dzień optyką kwantową i układami nieuporządkowanymi na Wydziale Fizyki, Astronomii i Informatyki

Procesory kart graficznych i CUDA wer PR

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

Architektura komputerów

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

GTX260 i CUDA wer

Dodatek A. CUDA. 1 Stosowany jest w tym kontekście skrót GPCPU (od ang. general-purpose computing on graphics processing units).

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

System obliczeniowy laboratorium oraz. mnożenia macierzy

CUDA PROGRAMOWANIE PIERWSZE PROSTE PRZYKŁADY RÓWNOLEGŁE. Michał Bieńkowski Katarzyna Lewenda

Karta przedmiotu. Podstawy programowania procesorów graficznych. realizowanego w ramach projektu PO WER

Załącznik nr 6 do SIWZ nr postępowania II MJ Zaoferowany. sprzęt L P. Parametry techniczne

Procesory kart graficznych i CUDA

MMX i SSE. Zbigniew Koza. Wydział Fizyki i Astronomii Uniwersytet Wrocławski. Wrocław, 10 marca Zbigniew Koza (WFiA UWr) MMX i SSE 1 / 16

Programowanie kart graficznych. Architektura i API część 1

Architektura komputerów

Obliczenia Wysokiej Wydajności

MESco. Testy skalowalności obliczeń mechanicznych w oparciu o licencje HPC oraz kartę GPU nvidia Tesla c2075. Stanisław Wowra

Klasyfikacja systemów komputerowych. Architektura von Neumanna Architektura harwardzka Zmodyfikowana architektura harwardzka. dr inż.

Karty graficzne możemy podzielić na:

dr inż. Jarosław Forenc

UTK ARCHITEKTURA PROCESORÓW 80386/ Budowa procesora Struktura wewnętrzna logiczna procesora 80386

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Welcome to the waitless world. Inteligentna infrastruktura systemów Power S812LC i S822LC

Metody optymalizacji soft-procesorów NIOS

Dr inż. hab. Siergiej Fialko, IF-PK,

Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski

Kto mówi? Inżynier systemów wbudowanych Linux, ARMv7, ARMv8

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Procesory. Schemat budowy procesora

CZYM JEST KARTA GRAFICZNA.

Wstęp do obliczeń równoległych na GPU

Kinowa Biblioteka Filmowa KINOSERWER. KinoSerwer

Podręcznik użytkownika PCI-x Karta przechwytująca 4xHDMI

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

RDZEŃ x86 x86 rodzina architektur (modeli programowych) procesorów firmy Intel, należących do kategorii CISC, stosowana w komputerach PC,

Transkrypt:

JCuda Czy Java i CUDA mogą się polubić? Konrad Szałkowski

Agenda GPU Dlaczego warto używać GPU Budowa GPU CUDA JCuda Przykładowa implementacja

Co to jest? GPU

GPU Graphical

GPU Graphical Processing

GPU Graphical Processing Unit

GPU Graphical Processing Unit Procesor graficzny.

Krótka historia GPU Terminale znakowe

Krótka historia GPU Terminale znakowe Renderowanie obrazu składającego się z pixeli

Krótka historia GPU Terminale znakowe Renderowanie obrazu składającego się z pixeli Akceleracja 2D, rysowanie kształtów, Z-bufory, sprite'y.

Krótka historia GPU Wejście w świat 3D - obliczenia na wektorach macierzach liczb zmiennoprzecinkowych

Krótka historia GPU Wejście w świat 3D - obliczenia na wektorach macierzach liczb zmiennoprzecinkowych Pojawienie się pierwszego GPU - NV10. Karta graficzna przejęła obliczenia T&L.

Krótka historia GPU Wejście w świat 3D - obliczenia na wektorach macierzach liczb zmiennoprzecinkowych Pojawienie się pierwszego GPU - NV10. Karta graficzna przejęła obliczenia T&L. Pojawienie się shaderów. Krótkich programów operujących na danych wewnątrz karty graficznej. (NV30)

Krótka historia GPU Wejście w świat 3D - obliczenia na wektorach macierzach liczb zmiennoprzecinkowych Pojawienie się pierwszego GPU - NV10. Karta graficzna przejęła obliczenia T&L. Pojawienie się shaderów. Krótkich programów operujących na danych wewnątrz karty graficznej. (NV30) Pojawienie się CUDA - dowolne programowanie na GPU (G80).

Dlaczego warto używać GPU Architektura procesora graficznego jest zoptymalizowana pod kątem obliczeń zmiennoprzecinkowych.

Dlaczego warto używać GPU Architektura procesora graficznego jest zoptymalizowana pod kątem obliczeń zmiennoprzecinkowych. Wydajność tego typu obliczeń jest aż do 5 razy większa niż CPU, w przypadku obliczeń podwójnej skali precyzji.

Dlaczego warto używać GPU Architektura procesora graficznego jest zoptymalizowana pod kątem obliczeń zmiennoprzecinkowych. Wydajność tego typu obliczeń jest aż do 5 razy większa niż CPU, w przypadku obliczeń podwójnej skali precyzji. I aż do 10 razy w przypadku pojedynczej skali precyzji.

Dlaczego warto używać GPU Prędkość pamięci DDR3-19200 ~ 19,2 GB/s

Dlaczego warto używać GPU Prędkość pamięci DDR3-19200 ~ 19,2 GB/s GDDR5 ~ 224 GB/s

Dlaczego warto używać GPU Prędkość pamięci DDR3-19200 ~ 19,2 GB/s GDDR5 ~ 224 GB/s Wydajność mocy Intel i7 Core 980XE: 220 GFLOPS / 130W = 1,7 GFLOPS/W

Dlaczego warto używać GPU Prędkość pamięci DDR3-19200 ~ 19,2 GB/s GDDR5 ~ 224 GB/s Wydajność mocy Intel i7 Core 980XE: 220 GFLOPS / 130W = 1,7 GFLOPS/W NVIDIA GTX 580: 1580 GFLOPS / 244 W = 6,5 GFLOPS/W

Dlaczego warto używać GPU Źródło:http://www.hardwareinsight.com/

Dlaczego warto używać GPU CPU Core 2 Duo Quad Q6600 2,4GHz 4GB DDR2-800 GPU NVidia GeForce GTX470 1296 MB GDDR5

Dlaczego warto używać GPU CPU Core 2 Duo Quad Q6600 2,4GHz 4GB DDR2-800 GPU NVidia GeForce GTX470 1296 MB GDDR5 Raytracer 4-8 FPS 80 FPS

Dlaczego warto używać GPU CPU Core 2 Duo Quad Q6600 2,4GHz 4GB DDR2-800 GPU NVidia GeForce GTX470 1296 MB GDDR5 Raytracer 4-8 FPS 80 FPS SGEMM 1000x1000 5924 ms 528 ms

Dlaczego warto używać GPU CPU Core 2 Duo Quad Q6600 2,4GHz 4GB DDR2-800 GPU NVidia GeForce GTX470 1296 MB GDDR5 Raytracer 4-8 FPS 80 FPS SGEMM 5924 ms 528 ms Sort 10^6 43 ms 547 ms Sort 10^8 1000 ms 800 ms

Do czego użyto GPU Symulacje objętościowe cieczy i gazów

Do czego użyto GPU Symulacje objętościowe cieczy i gazów Optymalizacja wydajności aerodynamicznej pojazdów

Do czego użyto GPU Symulacje objętościowe cieczy i gazów Optymalizacja wydajności aerodynamicznej pojazdów Analiza pogody

Do czego użyto GPU Symulacje objętościowe cieczy i gazów Optymalizacja wydajności aerodynamicznej pojazdów Analiza pogody Wizualizacje

Do czego użyto GPU Symulacje objętościowe cieczy i gazów Optymalizacja wydajności aerodynamicznej pojazdów Analiza pogody Wizualizacje Symulacja detonacji atomowej bomby plecakowej

Do czego użyto GPU Symulacje objętościowe cieczy i gazów Optymalizacja wydajności aerodynamicznej pojazdów Analiza pogody Wizualizacje Symulacja detonacji atomowej bomby plecakowej Problem n ciał i wiele innych.

Gdzie GPU, będzie skuteczne Algorytmy przetwarzania równoległego

Gdzie GPU, będzie skuteczne Algorytmy przetwarzania równoległego Mało komunikacji między wątkowej

Gdzie GPU, będzie skuteczne Algorytmy przetwarzania równoległego Mało komunikacji między wątkowej Masowe obliczenia zmienno przecinkowe SP

Zapraszam http://www.nvidia.pl/object/cuda_apps_flash_pl.html

GPU Piękne liczby, powodują dreszcze, ale gdzie jest haczyk?

GPU Piękne liczby, powodują dreszcze, ale gdzie jest haczyk? Wątki.

GPU Piękne liczby, powodują dreszcze, ale gdzie jest haczyk? Wątki. Dużo wątków.

GPU Piękne liczby, powodują dreszcze, ale gdzie jest haczyk? Wątki. Dużo wątków. Nawet 2^9 * 2^32 wątków.

CPU DRAM

CPU Cache DRAM

CPU CONTROL Cache DRAM

CPU CONTROL ALU ALU ALU ALU ALU ALU Cache DRAM

GPU DRAM

GPU DRAM

GPU DRAM

GPU CONT ROL Cache CONT ROL Cache CONT ROL Cache CONT ROL Cache DRAM

GPU CONT ROL ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU Cache ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU CONT ROL ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU Cache ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU CONT ROL ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU Cache ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU CONT ROL ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU Cache ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU ALU DRAM

GPU Piękne liczby, powodują dreszcze, ale gdzie jest haczyk? Wątki. Dużo wątków. Ok. 2^24 * 2^32 wątków. Pamięć. Zarządzanie. Transfer. Optymalne wykorzystanie.

GPU DRAM

GPU Pamięć tekstur Pamięć stałych DRAM

GPU Cache tekstur Cache stałych Pamięć tekstur Pamięć stałych DRAM

GPU Pamięć instrukcji Procesor Procesor Procesor Procesor Cache tekstur Cache stałych Pamięć tekstur Pamięć stałych DRAM

GPU Pamięć instrukcji Rejestry Rejestry Rejestry Rejestry Procesor Procesor Procesor Procesor Cache tekstur Cache stałych Pamięć tekstur Pamięć stałych DRAM

GPU Pamięć współdzielona Pamięć instrukcji Rejestry Rejestry Rejestry Rejestry Procesor Procesor Procesor Procesor Cache tekstur Cache stałych Pamięć tekstur Pamięć stałych DRAM

CUDA Compute Unified Device Architecture

CUDA Cytując stronę NVidii: CUDA jest opracowaną przez firmę NVIDIA, równoległą architekturą obliczeniową, która zapewnia radykalny wzrost wydajności obliczeń dzięki wykorzystaniu mocy układów GPU (graphics processing unit jednostka przetwarzania graficznego).

CUDA Jest to również synonim rozszerzenia standardowego języka C o składnię i biblioteki potrzebne do wygodnego przeprowadzania obliczeń na kartach graficznych.

JCuda Zestaw bibliotek opakowywujących natywne biblioteki CUDY z wykorzystaniem interfejsu JNI. Niestety, zależne od systemu operacyjnego/architektury procesora.

JCuda CUDA RUNTIME API CUDA DRIVER API

JCuda libjcudaruntime.so CUDA RUNTIME API libjcudadriver.so CUDA DRIVER API

JCuda JCudaRuntime.jar JCudaDriver.jar libjcudaruntime.so CUDA RUNTIME API libjcudadriver.so CUDA DRIVER API

Jęk zawodu na sali Niestety, zależne od systemu operacyjnego/architektury procesora.

Jęk zawodu na sali Niestety, zależne od systemu operacyjnego/architektury procesora. Należy jednak pamiętać, że API CUDY plus biblioteki to ok. 2500 różnych funkcji zmieniających się z każdym wydaniem.

Co to jest kernel? Funkcja ładowana do pamięci instrukcji multiprocesora.

Co to jest kernel? Funkcja ładowana do pamięci instrukcji multiprocesora. Przykład JCudaVectorAdd.cu: extern "C" global void add(int n, float *a, float *b, float *sum) { int i = blockidx.x * blockdim.x + threadidx.x; if (i<n) { sum[i] = a[i] + b[i]; } }

Organizacja przetwarzania struct dim3 { int x, y, z; } dim3 griddim, blockdim; dim3 blockidx, threadidx;

Organizacja przetwarzania Blok

Organizacja przetwarzania Każdy blok może zostać przydzielony do dowolnego multiprocesora. To w jaki sposób zostanie on przydzielony zależy od jego wymagań co do pamięci współdzielonej oraz rejestrów.

Organizacja przetwarzania Blok Blok Blok Blok Blok Blok Grid Blok Blok Blok Blok Blok Blok

Ograniczenia przetwarzania Ograniczenia: Maksymalna ilość wątków w bloku: 512 (256). Maksymalny wymiar grida 2^16 x 2^16 x 1. Do niedawna brak rekurencji. Do niedawna brak printf.

Ograniczenia przetwarzania Wątki w bloku formowane są w tzw. warpy po 32 wątki każdy i następnie są ładowane do multiprocesora. W ramach jednego warpa równolegle przez wątki może być wykonywana tylko jedna instrukcja. Jeśli nastąpi rozgałęzienie (if) zasada ta nadal obowiązuje i instrukcje gałęzi się przeplatają.

Typowy przebieg przetwarzania 1. Przygotowanie środowiska i kerneli 2. Alokacja pamięci na urządzeniu. 3. Ładowanie danych (wąskie gardło) 4. Wykonaniu obliczeń a. wykonywanie obliczeń GPU b. wykonywanie obliczeń CPU 5. Synchronizacja z kartą 6. Pobranie wyników obliczeń (wąskie gardło) 7. Dealokacja pamięci

Typowy przebieg przetwarzania 1. Przygotowanie środowiska i kerneli import static jcuda.driver.jcudadriver.*; // Enable exceptions and omit all subsequent error checks setexceptionsenabled(true); // Initialize the driver and // create a context for the first device. cuinit(0); CUdevice device = new CUdevice(); cudeviceget(device, 0); CUcontext context = new CUcontext(); cuctxcreate(context, 0, device);

Typowy przebieg przetwarzania 1. Przygotowanie środowiska i kerneli // Load the ptx file. // Create the PTX file by calling the NVCC String ptxfilename = prepareptxfile("jcudavectoraddkernel.cu"); CUmodule module = new CUmodule(); cumoduleload(module, ptxfilename); // Obtain a function pointer to the "add" function. CUfunction function = new CUfunction(); cumodulegetfunction(function, module, "add");

Typowy przebieg przetwarzania 2. Alokacja pamięci i ładowanie danych // Allocate the device input data, and copy the // host input data to the device CUdeviceptr deviceinputa = new CUdeviceptr(); cumemalloc(deviceinputa, numelements * Sizeof.FLOAT); cumemcpyhtod(deviceinputa, Pointer.to(hostInputA), numelements * Sizeof.FLOAT); CUdeviceptr deviceinputb = new CUdeviceptr(); cumemalloc(deviceinputb, numelements * Sizeof.FLOAT); cumemcpyhtod(deviceinputb, Pointer.to(hostInputB), numelements * Sizeof.FLOAT);

Typowy przebieg przetwarzania 2. Alokacja pamięci wyjściowej // Allocate device output memory CUdeviceptr deviceoutput = new CUdeviceptr(); cumemalloc(deviceoutput, numelements * Sizeof.FLOAT);

Typowy przebieg przetwarzania 3. Wykonanie obliczeń // Set up the kernel parameters: A pointer to an array // of pointers which point to the actual values. Pointer kernelparameters = Pointer.to( Pointer.to(new int[]{numelements}), Pointer.to(deviceInputA), Pointer.to(deviceInputB), Pointer.to(deviceOutput) );

Typowy przebieg przetwarzania 3. Wykonanie obliczeń // Call the kernel function. int blocksizex = 256; int gridsizex = (int) Math.ceil((double)numElements / blocksizex); culaunchkernel(function, gridsizex, 1, 1, // Grid dimension blocksizex, 1, 1, // Block dimension 0, null, // Shared memory size and stream kernelparameters, null // Kernel- and extra parameters ); cuctxsynchronize();

Typowy przebieg przetwarzania 4. Pobranie wyników obliczeń // Allocate host output memory and copy the device output // to the host. float hostoutput[] = new float[numelements]; cumemcpydtoh(pointer.to(hostoutput), deviceoutput, numelements * Sizeof.FLOAT);

Typowy przebieg przetwarzania 5. Dealokacja pamięci // Clean up. cumemfree(deviceinputa); cumemfree(deviceinputb); cumemfree(deviceoutput);

JCuda zmapowane biblioteki Biblioteki: Core mapowanie podstawowych funkcji zarówno Cuda Driver API jak i Cuda Runtime API JcuFFT biblioteka FFT JcuBLAS biblioteka operacji na macierzach JcuRAND biblioteka liczb losowych JcuDPP biblioteka operacji równoległych (scan, suma, redukcja) JcuSPARSE biblioteka operacji na macierzach rzadkich

Maven challenge Obecnie pracuję nad integracją biblioteki z mavenem. Niestety biblioteki będą zależne od architektury co psuje jedną z idei maven'a. CMake...?

Pytania?

Materiały JCUDA http://jcuda.org CUDA http://www.nvidia.com/object/cuda_home_new.html -> NVIDIA CUDA Programming Guide

Materiały Repozytorium svn://smijran.is-a-geek.org/jcuda login: visitor pass: access#52832 Godz. 8-24