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

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

CUDA jako platforma GPGPU w obliczeniach naukowych

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

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

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

Programowanie Współbieżne

Programowanie kart graficznych

Technologia GPGPU na przykładzie środowiska CUDA

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

CUDA ćwiczenia praktyczne

Wstęp do Programowania, laboratorium 02

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

Obliczenia na GPU w technologii CUDA

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

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

Programowanie Równoległe wykład 12. Thrust C Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie aplikacji równoległych i rozproszonych

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

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

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

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

Programowanie procesorów graficznych GPGPU

Programowanie procesorów graficznych w CUDA.

Wstęp do programowania

Operacje wejścia/wyjścia odsłona pierwsza

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

Programowanie kart graficznych

Podstawy Programowania.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy Programowania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

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

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Wartości domyślne, przeciażenia funkcji

Wartości domyślne, przeciażenia funkcji

CUDA. cudniejsze przyk ady

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

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

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Języki i techniki programowania Ćwiczenia 2

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Co nie powinno być umieszczane w plikach nagłówkowych:

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy Programowania Obiektowego

Podstawy programowania w języku C++

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Programowanie Proceduralne

Zajęcia 4 procedury i funkcje

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Programowanie kart graficznych. Sprzęt i obliczenia

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

I - Microsoft Visual Studio C++

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Ćwiczenie 1. Przygotowanie środowiska JAVA

Moc płynąca z kart graficznych

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Programowanie współbieżne i rozproszone

Algorytmy sortowania w języku C. Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (Sortowanie)

Programowanie CUDA informacje praktycznie i. Wersja

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Struktury systemów operacyjnych

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Podstawy algorytmiki i programowania - wykład 1 Tablice powtórzenie Tablice znaków Tablice dwuwymiarowe

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Wstęp do informatyki- wykład 11 Funkcje

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Argumenty wywołania programu, operacje na plikach

Podstawy programowania komputerów

Wstęp do informatyki- wykład 9 Funkcje

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Pola i metody statyczne

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

ZARZĄDZANIE PAMIĘCIĄ W TECHNOLOGII CUDA

Przetwarzanie Równoległe i Rozproszone

Proste algorytmy w języku C

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Programowanie komputerowe. Zajęcia 4

Programowanie Proceduralne

Wstęp do programowania. Wykład 1

Spis treści. Język interpretowany vs język kompilowany

Proste algorytmy w języku C

Spis treści. 1 Java T M

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

2 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Część 4 życie programu

Programowanie komputerowe. Zajęcia 5

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Podstawy programowania

lekcja 8a Gry komputerowe MasterMind

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

Tesla. Architektura Fermi

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Transkrypt:

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

Motywacja l CPU vs GPU (anims)

Plan CUDA w praktyce Wykład 1: CUDA w praktyce Wykład 2: Cuda + Opengl Wykład 3: Thrust

Kompilacja LINUX Korzystamy z pracowni 426 Komputery mają zainstalowane karty nvidia GeForce Środowisko CUDA jest zainstalowane Kompilacja (plik program.cu) > nvcc program.cu >./a.out Kompilacja CUDA + GLUT (OpenGL) > nvcc main.cpp kernels.cu -lglut lglu >./a.out

Hello World Pierwszy prosty program w CUDA 1. CPU wywołuje funkcję na GPU Funkcja wstawia do pamięci GPU ciąg Hello world! 2. Kopiujemy dane z GPU do pamięci CPU 3. Dane wypisujemy przy pomocy funkcji i/o (cout etc.)

Hello World Pierwszy prosty program w CUDA 1. CPU wywołuje funkcję na GPU Funkcja wstawia do pamięci GPU ciąg Hello world! 2. Kopiujemy dane z GPU do pamięci CPU 3. Dane wypisujemy przy pomocy funkcji i/o (cout etc.)

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; char napis_host[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; int main(void) helloworldondevice <<< 1, 1 >>> (); cudamemcpyfromsymbol (napis_host, napis_device, sizeof(char)*14, 0, cudamemcpydevicetohost); printf("%s",napis_host);

Deklaracja funkcji na GPU Funkcja uruchamiana na GPU to kernel (jądro) Zmienne na GPU przedrostek device Preambuła jądra - przedrostek global char napis_device[14]; void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; CPU device char napis_device[14]; global void helloworldondevice(void) napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; GPU

Wywołanie funkcji na GPU Wywołanie funkcji GPU: funkcja <<< numblocks, threadsperblock >>> ( parametry ); numblocks liczba bloków w macierzy wątków threadsperblock liczba wątków na blok W naszym przykładzie <<<1,1>>> oznaczało uruchomienie jądra na jednym wątku który zawierał się w jednym jedynym bloku macierzy wątków.

numblocks, threadsperblock <<< 1, 1 >>> <<< 1, 4 >>> <<< 4, 1 >>> <<< dim3(3,2,1), 4 >>>

A tak to widzi nvidia CUDA Programming Guide 3.2 <<< dim3(3,2,1), dim3(4,3,1) >>>

Hello World wielowątkowo 1. CPU wywołuje funkcję na GPU Funkcja wstawia do pamięci GPU ciąg Hello world! jedna litera na jeden wątek!

Hello World wielowątkowo jedna litera na jeden wątek stwórzmy 14 bloków po 1 wątku Każdy wątek zna swój numer i numer bloku Numer bloku -> miejsce w tablicy do skopiowania

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) int idx = blockidx.x; napis_device[idx] = hw[idx]; helloworldondevice <<< 14, 1 >>> (); idx zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) int idx = blockidx.x; napis_device[idx] = hw[idx]; helloworldondevice <<< 14, 1 >>> (); idx zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) int idx = blockidx.x; napis_device[idx] = hw[idx]; helloworldondevice <<< 14, 1 >>> (); idx zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) int idx = blockidx.x; napis_device[idx] = hw[idx]; helloworldondevice <<< 14, 1 >>> (); idx zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU

Hello World wielowątkowo Jedno z zadań na ćwiczenia to napisanie programu helloworld_parallel.cu tak, by wykonywany był przez 14 wątków w jednym bloku.

Projekt wieloplikowy w CUDA kernels.cu kernels.h main.cpp (#include <kernels.h>) Kernele GPU trzymam w *.cu Interfejsy C++ do kerneli GPU w *.cu Deklaracje interfejsów trzymam w *.h W plikach C++ ładuję ww deklaracje interfejsów A w praktyce?

Projekt wieloplikowy CUDA main.cpp #include <cuda.h> #include <cuda_runtime.h> #include <stdio.h> #include "kernels.h" int main(void) call_helloworld();... printf("%s\n",napis_host);

Projekt wieloplikowy CUDA main.cpp #include <cuda.h> #include <cuda_runtime.h> #include <stdio.h> #include "kernels.h" int main(void) call_helloworld();... printf("%s\n",napis_host); kernels.h void call_helloworld(void);

Projekt wieloplikowy CUDA kernels.cu #include <cuda.h> device char napis_device[14]; constant device char hw[] = "Hello World!\n\0"; main.cpp #include <cuda.h> #include <cuda_runtime.h> #include <stdio.h> #include "kernels.h" int main(void) call_helloworld(); global void helloworldondevice(void) int idx = threadidx.x; napis_device[idx] = hw[idx]; void call_helloworld(void) helloworldondevice <<< 1, 15 >>> (); +rozkazy cuda api... printf("%s\n",napis_host); kernels.h void call_helloworld(void);

Ćwiczenia 2013-01-07: 1. Napisz prosty program Hello world jak na wykładzie. 2. Przepisz program tak, aby kolejne litery wypisywane były przez osobne wątki w ramach jednego bloku. 3. Przerób program na projekt wieloplikowy (c++, cu, h). Uwaga: zadanie jest na ocenę, czas: 2h.