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

Podobne dokumenty
Programowanie współbieżne i rozproszone

Programowanie Komponentowe Zarządzanie obiektami: kontenery

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

Szablon klasy std::vector

Programowanie i struktury danych

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

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

STL: Lekcja 1&2. Filozofia STL

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Programowanie obiektowe W3

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Wprowadzenie do szablonów szablony funkcji

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Programowanie Obiektowo Zorientowane w języku C++ Biblioteka STL

Wprowadzenie do szablonów szablony funkcji

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Szablon klasy std::list

Szablony funkcji i szablony klas

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

Wydajność użycia funktorów z biblioteką STL języka C++

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Struktury Danych i Złożoność Obliczeniowa

Języki i techniki programowania Ćwiczenia 2

STL Standardt Template Library (wprowadzenie)

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

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

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

Jak Windows zarządza pamięcią?

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

Programowanie procesorów graficznych w CUDA.

Paradygmaty programowania

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

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

Programowanie. Sylwester Arabas. prowadzący ćwiczenia: Magdalena Kuich, Krzysztof Piasecki, Łukasz Dulny. Wydział Fizyki Uniwersytetu Warszawskiego

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Algorytmy i Struktury Danych. Anna Paszyńska

W przypadku STL w specyfikacji nazwy pliku nagłówkowego brak rozszerzenia tj. <string> <string.h> zamiast

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

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

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Język ludzki kod maszynowy

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Programowanie - wykład 4

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

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Programowanie procesorów graficznych GPGPU

Szablony klas, zastosowanie szablonów w programach

Wstęp do programowania 1

C-struktury wykład. Dorota Pylak

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

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie. Sylwester Arabas. prowadzący ćwiczenia: Magdalena Kuich, Krzysztof Piasecki, Łukasz Dulny. Wydział Fizyki Uniwersytetu Warszawskiego

Część 4 życie programu

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Programowanie obiektowe i C++ dla matematyków

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Style programowania - krótki przeglad

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Kompletna dokumentacja kontenera C++ vector w -

Stałe, tablice dynamiczne i wielowymiarowe

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Zaawansowane programowanie w C++ (PCP)

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Przeciążanie operatorów

Programowanie i struktury danych

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

I - Microsoft Visual Studio C++

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Podstawy algorytmiki i programowania - wykład 4 C-struktury

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Wstęp do programowania obiektowego, wykład 7

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Programowanie kart graficznych

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

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Transkrypt:

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

Co to jest Thrust C++? Thrust C++ biblioteka szablonów Interfejs w pewnym sensie spójny z STL Biblioteka wysokiego poziomu Cel: maksymalnie ułatwić programowanie GPU

Instalacja i kompilacja W CUDA > 4.0 Thrust jest w standardzie! #include <thrust/version.h> #include <iostream> int main(void) { int major = THRUST_MAJOR_VERSION; int minor = THRUST_MINOR_VERSION; std::cout << "Thrust v" << major << "." << minor << std::endl; } return 0; http://code.google.com/p/thrust/wiki/quickstartguide

Podstawy W kodzie C++ używamy przestrzeni nazw Thrust:: Najprostsze kontenery wektory w pamięci urządzenia (device) i w pamięci cpu (host) Przykłady Wektor 100 int w pamięci CPU thrust::host_vector<int> h_vec(100); Wektor 150 double w pamięci GPU thrust::device_vector<double> d_vec(150);

Kopiowanie Kopiowanie przy pomocy operatora = CPU->GPU GPU->CPU CPU->CPU GPU->GPU Przykład: thrust::host_vector<int> h_vec(100); thrust::device_vector<int> d_vec2, d_vec3; d_vec2 = h_vec; d_vec3 = d_vec2; Można też np. tak: thrust::copy (h_vec.begin(), h_vec.end(),d_vec2.begin());

Hello world #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <iostream> int main (void) { thrust::host_vector <int> h_vec(1<<3); thrust::generate(h_vec.begin(),h_vec.end(), rand); thrust::device_vector<int> d_vec = h_vec; for (int i = 0; i < h_vec.size(); i++) std::cout << h_vec[i] << " " << d_vec[i] << std::endl; } return 0;

Hello world #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <iostream> int main (void) { thrust::host_vector <int> h_vec(1<<3); thrust::generate(h_vec.begin(),h_vec.end(), rand); thrust::device_vector<int> d_vec = h_vec; for (int i = 0; i < h_vec.size(); i++) std::cout << h_vec[i] << " " << d_vec[i] << std::endl; } return 0;

Hello world #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <iostream> int main (void) { STL! thrust::host_vector <int> h_vec(1<<3); thrust::generate(h_vec.begin(),h_vec.end(), rand); thrust::device_vector<int> d_vec = h_vec; for (int i = 0; i < h_vec.size(); i++) std::cout << h_vec[i] << " " << d_vec[i] << std::endl; } return 0;

Hello world #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <iostream> int main (void) { thrust::host_vector <int> h_vec(1<<3); thrust::generate(h_vec.begin(),h_vec.end(), rand); thrust::device_vector<int> d_vec = h_vec; for (int i = 0; i < h_vec.size(); i++) std::cout << h_vec[i] << " " << d_vec[i] << std::endl; } return 0;

Hello world #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <iostream> int main (void) { thrust::host_vector <int> h_vec(1<<3); thrust::generate(h_vec.begin(),h_vec.end(), rand); thrust::device_vector<int> d_vec = h_vec; for (int i = 0; i < h_vec.size(); i++) std::cout << h_vec[i] << " " << d_vec[i] << std::endl; } return 0; i/o z GPU (kopia, ale wygodne!)

Iteratory Iteratory kontenerów STL - odpowiadniki wskaźników (ale niosą więcej informacji) h_vec.begin(), d_vec.end() etc. zwracają iteratory W Thrust w zależności od umiejscowienia (GPU i CPU) iteratory mają różne typy Na poziomie kompilacji wstawiane są funkcje pracujące na odpowiednich typach (static dispatching)

Praca z własnymi danymi Można mapować wskaźnik na pamięć urządzenia na kontener Thrust Alokacja pamięci w CUDA: int N = 10; int *raw_ptr; cudamalloc (( void **) & raw_ptr, N * sizeof ( int )); Mapowanie adresu + wywołanie funkcji Thrust thrust::device_ptr <int > dev_ptr ( raw_ptr ); thrust::fill ( dev_ptr, dev_ptr + N, ( int ) 0);

Praca z własnymi danymi Można zmapować wskaźnik na pamięć urządzenia na kontener Thrust Alokacja pamięci w CUDA: int N = 10; int *raw_ptr; cudamalloc (( void **) & raw_ptr, N * sizeof ( int )); Mapowanie adresu + wywołanie funkcji Thrust thrust::device_ptr <int> dev_ptr ( raw_ptr ); thrust::fill ( dev_ptr, dev_ptr + N, ( int ) 0);

Niedostatki Thrust Thrust nie implementuje pełnego STL na GPU Na przykład brak kontenera std::list Ale, możemy użyć std::list na CPU do inicjalizacji wektora na GPU Znów przykład z dokumentacji:

std::list -> thrust::device_vector #include <thrust/device_vector.h> #include <thrust/copy.h> #include <list> #include <vector> int main (void) { std::list <int> stl_list ; stl_list.push_back (10) ; stl_list.push_back (20) ; stl_list.push_back (30) ; stl_list.push_back (40) ; thrust::device_vector <int> D(stl_list.begin(), stl_list.end()); std::vector <int> stl_vector (D. size ()); thrust::copy(d.begin(), D.end(), stl_vector.begin()); } return 0;

Algorytmy Wiele z algorytmów Thrust jest odpowiednikiem STL Przykład: thrust::sort i std::sort Wszystkie algorytmy Thrust są dostarczone w wersjach CPU i GPU (static dispatching) thrust::device_vector <int> X(10); thrust::device_vector <int> Y(10); thrust::device_vector <int> Z(10); // Y = X % Z thrust::transform(x.begin(), X.end(), Z.begin(), Y.begin(), thrust::modulus<int>() ); // print Y thrust::copy(y.begin(), Y.end(), std::ostream_iterator<int>( std::cout, "\n")); (Przypisanie do std::ostream_iterator wypisuje elementy z opcjonalnym delimiterem)

Dostępne operacje struct thrust::plus< T > struct thrust::minus< T > struct thrust::multiplies< T > struct thrust::divides< T > struct thrust::modulus< T > struct thrust::negate< T > Przykład z dokumentacji: ( http://wiki.thrust.googlecode.com/hg/html/index.html ) Uwaga: - nie zawsze efektywne, - niekiedy lepiej zaimplementować własną operację

Zdefiniowanie funktora Efektywne wykonanie operacji SAXPY (BLAS) y <- a * x + y x wektor y - wektor a liczba

Zdefiniowanie funktora Struktura funktora: struct saxpy_functor { const float a; saxpy_functor ( float _a) : a(_a) {} host device float operator() (const float & x, const float &y) const { return a * x + y; } }; Wywołanie: void saxpy_fast (float A, thrust::device_vector <float > &X, thrust::device_vector<float> &Y) { // Y <- A * X + Y thrust::transform (X.begin(), X.end(), Y.begin(), Y.begin(), saxpy_functor(a)); }

Zdefiniowanie funktora Struktura funktora: struct saxpy_functor { const float a; saxpy_functor ( float _a) : a(_a) {} host device float operator() (const float & x, const float &y) const { return a * x + y; } }; Wywołanie: void saxpy_fast (float A, thrust::device_vector <float > &X, thrust::device_vector<float> &Y) { // Y <- A * X + Y thrust::transform (X.begin(), X.end(), Y.begin(), Y.begin(), saxpy_functor(a)); }

Redukcja (suma) Wykonuje redukcję (tu suma) na wektorze od first do last init wartość początkowa (prawie zawsze 0) #include <thrust/reduce.h>... int data[6] = {1, 0, 2, 2, 1, 3}; int result = thrust::reduce(data, data + 6, 1); // result == 10

Redukcja (ogólnie) binary_op funkcja binarna #include <thrust/reduce.h> #include <thrust/functional.h>... int data[6] = {1, 0, 2, 2, 1, 3}; int result = thrust::reduce(data, data + 6, -1, thrust::maximum<int>()); // result == 3

Operacje redukcji Inne operacje redukcji na wektorach Thrust thrust::count_if, thrust::min_element, thrust::max_element, thrust::is_sorted, thrust::inner_product Przykład: iloczyn skalarny #include <thrust/inner_product.h>... float vec1[3] = {-1.0f, 12.0f, 1.0f}; float vec2[3] = {1.0f, 2.0f, 3.0f}; float result = thrust::inner_product(vec1, vec1 + 3, vec2, 0.0f); // 26.0f Uwaga: kolejność dodawań nie musi być zachowana (inaczej niż w stl::inner_product)

Szybki przegląd algorytmów Sumy cząstkowe (prefix-sums, scan) thrust::inclusive_scan Operacje grupowania Kopiowanie, usuwanie, przegrupowanie w zależności od wyniku testów (predykaty) np. thrust::copy_if Sortowanie thrust::sort, thrust::stable_sort, thrust::sort_by_key

Koniec Dziękuję za uwagę

Literatura Wykład na podstawie: CUDA Toolkit 4.0 Thrust Quick Start Guide (2011)

Iteratory Thrust (oparte o BoostC+ +) Iteratory dostępu do kontenera Thrust constant_iterator counting_iterator transform_iterator permutation_iterator zip_iterator

Ćwiczenia 1. Zdefiniuj prostą operację na wektorach (może być z BLAS: http://en.wikipedia.org/wiki/basic_linear_algebra_subprograms) 2. Zaimplementuj wersję korzystającą z funktorów wbudowanych Thrust 3. Zaimplementuj własny funktor realizujący ww zadanie 4. Zbadaj wydajność własnego funktora (czas w funkcji rozmiaru problemu) względem operacji wbudowanych Thrust. 5. (*) Dla zainteresowanych porównaj wydajność do wydajności analogicznej funkcji w bibliotece CUBLAS