Top Banner
Paweł Nowak Generowanie i wizualizacja zbioru Mandelbrota na CUDA
19

Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Jan 23, 2017

Download

Technology

Paweł Nowak
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Paweł Nowak

Generowanie i wizualizacja zbioru

Mandelbrota na CUDA

Page 2: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Zbiór Mandelbrota (żuk Mandelbrota) -podzbiór płaszczyzny zespolonej, którego brzeg jest jednym ze sławniejszych fraktali. Nazwa tego obiektu została wprowadzona dla uhonorowania jego odkrywcy, francuskiego matematyka Benoit Mandelbrota.

Co to jest zbiór Mandelbrota?

Page 3: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

By zdefiniować zbiór Mandelbrota, zdefinujemy najpierw dla danego punktu p na płaszczyźnie zespolonej nieskończony ciąg liczb zespolonych z0, z1, z2, ... o wartościach zdefiniowanych następująco:z0 = 0zn+1 = zn2 + p

Zbiór Mandelbrota (ang. Mandelbrot Set) definiujemy jako zbiór liczb zespolonych p takich, że zdefiniowany powyżej ciąg nie dąży do nieskończoności.

Zbiór Mandelbrota z matematycznego punktu widzenia

Page 4: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Otóż fraktalem jest brzeg tego zbioru. W praktyce by narysować fraktale oblicza się kolejne przybliżenia zbioru, które oznacza się różnymi kolorami. I tak kolejne przybliżenia zdefiniujemy jako zbiór liczb zespolonych p takich, że:

• 1 przybliżenie: wszystkie punkty• 2 przybliżenie: |z1| < 2• 3 przybliżenie: |z1| < 2 oraz |z2| < 2• 4 przybliżenie: |z1| < 2 oraz |z2| < 2 oraz |z3| < 2• ... • n-te przybliżenie: |z1| < 2 oraz |z2| < 2, ... |zn-1|

< 2

Gdzie w tym wszystkim fraktal?

Page 5: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Jak ten fraktal wygląda?

Page 6: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

• CUDA (ang. Compute Unified Device Architecture) to opracowana przez firmę Nvidia uniwersalna architektura procesorów wielordzeniowych (głównie kart graficznych) umożliwiająca wykorzystanie ich mocy obliczeniowej do rozwiązywania ogólnych problemów numerycznych w sposób wydajniejszy niż w tradycyjnych, sekwencyjnych procesorach ogólnego zastosowania.

CUDA?

Page 7: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Integralną częścią architektury CUDA jest oparte na języku programowania C środowisko programistyczne wysokiego poziomu, w którego skład wchodzą m.in. specjalny kompilator (nvcc), debugger (cuda-gdb, który jest rozszerzoną wersją debuggera gdb umożliwiającą śledzenie zarówno kodu wykonywanego na CPU, jak i na karcie graficznej), profiler oraz interfejs programowania aplikacji. Dostępne są również biblioteki, które można wykorzystać w językach Python, Fortran, Java, C# oraz Matlab. Pierwsze wydanie środowiska wspierało systemy operacyjne Windows oraz Linux. Od wersji 2.0 wspierany jest również Mac OS X.

Jak programować na CUDA?

Page 8: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

• CUDA C rozszerza C pozwalając programiście na definiowanie funkcji C nazywanych kernelami (kernels), które są wykonywane N razy równolegle przez N wątków CUDA

• Kernele są definiowane poprzez dodanie specyfikatora __global__ przy deklaracji. Wywołanie kernelu odbywa się poprzez specjalną konstrukcję wywołania funkcji z modyfikatorem <<…>> w, którym jest podana ilość bloków i wątków, które wywołują kernel

Każdy wątek otrzymuje swoje specyficzne ID, które jest dostępne poprzez strukturę threadIdx

CUDA – Kernele

Page 9: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

// Kernel definition __global__ void VecAdd(float* A, float* B, float*C) {

int i = threadIdx.x; C[i] = A[i] + B[i];

}

int main() { ... // Kernel invocation with N threads

VecAdd<<<1, N>>>(A, B, C); }

CUDA – Kernele - Przykład

Page 10: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Dla wygody, threadIdx jest 3-elementowym wektorem, dlatego wątek może być identyfikowany poprzez 1-wymiarowy, 2-wymiarowy lub 3-wymiarowy indeks wątku, zawarty w 1-wymiarowym, 2-wymiarowym indeksie bloku.Bloki są organizowane w jedno- lub dwuwymiarowym gridzie (sieci)

CUDA – Hierarchia Wątków

Page 11: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

CUDA – Hierarchia Wątków - Ilustracja

Page 12: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

CUDA – Hierarcha Pamięci

Page 13: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

• Model programowania CUDA zakłada, że wątki CUDA, są wykonywane fizycznie na innym urządzeniu, które działa jako koprocesor dla hosta. Dlatego kernele wykonują się na GPU, gdy pozostała część kodu wykonuje się na CPU

• Model programowania CUDA zakłada, również, że host i device (GPU) posiadają oddzieloną od siebie własną pamięć RAM. Dlatego nie można dostać się do pamięci GPU z CPU tak po prostu. Należy wykonać funkcję odpowiedzialną za kopiowanie zawartości pamięci

CUDA – Heterogeniczne Programowanie

Page 14: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

CUDA – Heterogeniczne Programowanie Ilustracja

Page 15: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Architektura CUDA jest zbudowana wokół skalowalnej tablicy wielowątkowych Strumieni Multiprocesorowych. Kiedy grid kernelu jest wywoływany bloki gridu są wyliczane i przekazywane do multiprocesora. Wątki w bloku są wykonywane równocześnie na jednym multiprocesorze, i wiele bloków może być wykonywanych równocześnie na jednym multiprocesorze

CUDA - Architektura

Page 16: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Zamierzam zrównoleglić wyliczanie zbioru Mandelbrota na architekturze CUDA poprzez podzielenie obliczania całej płaszczyzny liczb zespolonych na fragmenty.Byłyby one wyliczane na przez poszczególne bloki wątków.

Zrównoleglenie wyliczania zbioru Mandelbrota

Page 17: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Zrównoleglenie wyliczania zbioru Mandelbrota Ilustracja

Page 18: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Zbiór Mandelbrota:http://en.wikipedia.org/wiki/Mandelbrot_setCUDA:http://www.nvidia.pl/object/cuda_home_new_pl.html

Linki:

Page 19: Generowanie i wizualizacja zbioru Mandelbrota na CUDA

Dziękuję za uwagę!

Prezentacja dostępna pod adresem:http://www.slideshare.net/nowy20/generowanie-i-wizualizacja-zbioru-mandelbrota-na-cuda