Transcript A(i,:,end)

Użytkowanie i programowanie Matlaba

Metody optymalizacji i przyspieszania obliczeń.

Obliczenia równoległe

Metody optymalizacji i przyspieszania obliczeń

• • Wektoryzacja obliczeń -

Jak najmniej pętli for Prealokacja

(rezerwowanie) pamięci dla macierzy/tablic • Nie modyfikować w kodzie funkcji dużych zmiennych przekazywanych jako parametry wywołania

Metody optymalizacji i przyspieszania obliczeń

• • • • • • • • • • Pisać funkcje niż skrypty Używać load/save zamiast funkcji I/O Stosować numeryczne typy danych m. in. double logical Nie stosować bez potrzeby cell, sparce, structure Stosować skalary logiczne w operatorach if, elseif, while Nie pisać więcej niż jednej operacji w linii Unikać zmiany typu danych dla zmiennej lub kształtu zmiennej Wywoływać wbudowane funkcje Matlaba Stosować małe tablice Dołączać kod skompilowany

Metody optymalizacji i przyspieszania obliczeń

• •

Stosować obliczenia równoległe Stosować obliczenia równoległe

Kiedy stosować obliczenia równoległe/rozproszone • • Długi czas wykonywania obliczeń Duże zbiory danych

Obliczenia równoległe

Materiały z wykładu Obliczenia równoległe i rozproszone wśrodowisku MATLAB, Miłosz Augustyński, ONT Kraków

Obliczenia równoległe • Obliczenia na wielu rdzeniach/procesorach komputera • Obliczenia na klastrze • Oblicznia na karcie graficznej

Trzy poziomy wykorzystania obliczeń równoległych • Prosty • Umiarkowany • Zaawansowany

Prosty poziom wykorzystania obliczeń równoległych • Włączenie obliczeń równoległych

matlabpool open

• Wiele funkcji w Matlabie ma wbudowane wsparcie dla obliczeń równoległych i rozproszonych • Na koniec

matlabpool close

Przykładowe narzędzia z wsparciem obliczeń równoległych • Optimization Toolbox • Global Optimization Toolbox • Statistics Toolbox • Simulink

Umiarkowany poziom wykorzystania obliczeń równoległych • • • • Proste operatory i funkcje w skryptach MATLAB

parfor batch spmd pmode

Zaawansowany poziom wykorzystania obliczeń równoległych • Przydzielanie klastrów obliczeniowych • Definiowanie zadań

job

, ich wykonywanie i kontrola • Definiowanie wątków

task

MATLAB Distributed Computing Server

Rodzaje obliczeń równoległych

Materiały z wykładu Obliczenia równoległe i rozproszone wśrodowisku MATLAB, Miłosz Augustyński, ONT Kraków

Wykorzystanie licencji przy obliczeniach równoległych Parallel Computing Toolbox – 1 licencja: • Obliczenia równoległe na maszynie lokalnej (do 8 procesorów) • Obliczenia z wykorzystaniem karty grafiki (NVIDIA CUDA) • Połączenie z klastrem obliczeniowym MATLAB Distributed Computing Server • Osobna licencja na workery • Licencjonowanie dynamiczne

Obliczenia równoległe - definicje • • • • •

Scheduler

– system zarządzający zadaniami Matlabowymi w systemie wieloprocesorowym.

Worker

– środowisko obliczeniowe Matlaba pracujące na pojedynczym procesorze.

Klient

– interaktywna sesja Matlaba, z poziomu której definiowane są zadania.

Job

– zadanie.

Task

– podzadanie

Obliczenia równoległe - definicje • Zadanie –

job

– to program rozwiązujący określony problem. Zadanie rozdzielane jest na równolegle wykonywane podzadania.

• Podzadanie –

task

– to fragment programu, np. funkcja, działający na określonym zestawie danych. Podzadania mogą być niezależne.

• Tworzą program rozproszony – trywialnej równoległości.

distributed job

. Odpowiada to • Podzadania mogą być od siebie wzajemnie zależne. Tworzą program równoległy –

parallel job

. Programy równoległe pracują najczęściej w trybie

SPMD

się danymi.

. Wszystkie podzadania są takie same. Różnią się prywatnymi danymi. Podzadania zależne od siebie mogą wymieniać

Tryby wieloprocesorowe w MATLAB • Tryb interakcyjny • Tryb wsadowy • Tryb interakcyjny

matlabpool matlabpool pmode

• Tryb równoległy – parallel • Tryb rozproszony – distributed

clear A for i = 1:8 A(i) = i; end A

Pętla

parfor clear A parfor i = 1:8 end A A(i) = i;

Działanie: • Zakres zmienności zmiennej sterującej dzielony pomiędzy workerów • Dane konieczne dla poszczególnych iteracji są rozsyłane do workerów • Każdy worker wykonuje swoją pulę iteracji • Wyniki są zwracane do klienta

Pętla

parfor clear A for i = 1:8 end A A(i) = A(i-1); clear A parfor i = 1:8 end A A(i) = A(i-1);

• Iteracje pętli muszą być wzajemnie niezależne!

• Kolejność wykonywania iteracji jest niedeterministyczna • Wykonanie iteracji jest niesynchronizowane.

• Błąd pojedynczej iteracji powoduje zakończenie działania wszystkich iteracji…

Pętla

parfor A = zeros(4, 11); parfor i = 1:4 for j = 1:10 A(i,j+1) = i+j; end end A = zeros(4, 11); parfor i = 1:4 for j = 2:11 A(i,j+1) = i+j-1; end end

• Nie wolno stosować podwójnych indeksowań w wyrażeniach • Nie można zagnieżdżać pętli parfor ani spmd • Nie można stosować zmiennych globalnych i statycznych • Nie wolno stosować wyrażeń break i return • Nie wolno używać funkcji typu clear, who, whos, save, load • Nie wolno wykonywać operacji graficznych

Pętla

parfor A = zeros(4, 10); parfor i = 1:4 for j = 1:10 A(i,j)=i+j; end disp(A(i, 1)) end A = zeros(4, 10); parfor i = 1:4 v = zeros(1, 10); for j = 1:10 v(j) = i + j; end disp(v(1)) A(i, :) = v; end

• Nie wolno stosować indeksowanej tablicy poza pętlami

Pętla

parfor A = zeros(4, 10); parfor i = 1:4 for end j = 1:5 A(i,j) = i+j; end for end k = 6:10 A(i, k) = pi; A = zeros(4, 10); parfor i = 1:4 for j = 1:10 if j < 6 A(i, j) = i+j; else end A(i, j) = pi; end end

• Nie wolno stosować różnego indeksowania

Pętla

parfor A = zeros(4, 10); parfor i = 1:4 for end j = 1:5 A(i,j) = i+j; end for end k = 6:10 A(i, k) = pi; A = zeros(4, 10); parfor i = 1:4 for j = 1:10 if j < 6 A(i, j) = i+j; else end A(i, j) = pi; end end

• Nie wolno stosować różnego indeksowania

Pętla

parfor A=zeros(100, 200); parfor i=1:size(A,1) for j=1:size(A,2) A(i,j)=plus(i,j); end end A = zeros(100, 200); n = size(A, 2); parfor i=1:size(A,1) for j = 1:n end A(i,j)=plus(i,j); end

• Podpętla loop musi być indeksowana stałą wartością

Pętla

parfor B = @sin; for ii = 1:100 A(ii) = B(ii); end B = @sin; parfor ii = 1:100 A(ii)=feval(B,ii); end

• Nie można korzystać z referencji do funkcji

Rodzaje zmiennych Loop variables Sliced variables Broadcast variables Reduction variables Temporary variables

Loop variables

parfor i = 1:n end i = i + 1; a(i) = i;

Sliced Variables

parfor i = 1:length(A) B(i) = f(A(i)); end

A.q{i,12}

Sliced Variables

A{i,12}.q

• Wymagany pierwszy poziom indeksowania

Sliced Variables

parfor i = 1:k B(:) = h(A(i),A(i+1)); end parfor i = 1:k B(:) = f(A(i)); C(:) = g(A{i}); end

• Wymagana jednakowa wartość indeksu

Praca domowa

parfor i = 1:k B(:) = h(A(i),A(i+1)); end

• Co napisać, aby można było w wykonywać tą czynność w pętli

Sliced Variables

A(i+f(k),j,:,3) A(i,20:30,end) A(i,:,s.field1) A(i+k,j,:,3) A(i,:,end) A(i,:,k)

• Prawidłowe i nieprawidłowe indeksowanie

Sliced Variables

A(i,:) = []; A(end + 1) = 1;

• Nie można zmieniać kształtu/rozmiaru

Broadcast Variables Jest rozsyłany do wszystkich wątków

Reduction Variables Akumulują wartości po wszystkich pętlach

Reduction Variables

x = 0; parfor i = 1:10 x = x + i; end x x2 = []; n = 10; parfor i = 1:n x2 = [x2, i]; end x2

Reduction Variables

X = X .* expr X = X * expr X = X & expr X = X | expr X = [X, expr] X = [X; expr] X = {X, expr} X = {X; expr} X = expr .* X X = expr * X X = expr & X X = expr | X X = [expr, X] X = [expr; X] X = {expr, X} X = {expr; X} X = min(X, expr) X = max(X, expr) X = min(expr, X) X = max(expr, X) X = union(X, expr) X = union(expr, X) X = intersect(X, expr) X = intersect(expr, X)

Reduction Variables

parfor i = 1:n if testLevel(k) A = [A, 4+i]; else A = [r(i), A]; end end parfor i = 1:n if testLevel(k) A = [A, 4+i]; else A = [A, r(i)]; end end

Przykład

a = 0 ; r = rand(1,10) ; z = 0 ; c = 4 ; parfor i = 1 : 10 a = i ; end z = z + i ; b(i) = r(i) ; if i <= c d = 2*a ; end

SPMD Single Program Multiple Data – spmd Równoległe wykonanie tego samego kodu Spmd umożliwia łączenie kodu seryjnego z kodem równoległym Bloki kodu zamknięte w ramy spmd wykonywane są jednocześnie na kilku wątkach Zmienne pochodzące z wnętrza bloku spmd są dostepnew kliencie (zmienne typu Composite) Zastosowanie Długotrwałe programy – spmd pozwala na obliczenia jednoczesne Programy operujące na dużych zbiorach danych – spmd pozwala na rozproszenie danych pomiędzy laby

Single Program Multiple Data – spmd Single Program…Jeden kod programu Uruchamiany na kliencie – część seryjna wykonywana na kliencie, część równoległa wykonywana na zasobach matlabpool …MultipleData Pomimo jednego kodu każdy lab może pracować na innych danych

Single Program Multiple Data – spmd

spmd(n) end Spmd

wymaga działającego trybu

matlabool n

–liczba labów na których ma się uruchomić dany blok

spmd

(

opcjonalne

)

n <= matlabpool(‘size’) Działanie

blok

spmd

na każdym labie uruchamia polecenia zawarte w bloku każdy lab ma własną przestrzeń roboczą (w pamięci workera) każdy lab jest unikalny i identyfikowalny możliwa jest komunikacja między labami

Single Program Multiple Data – spmd

labindex

zmienna przechowująca numer labu, na którym wykonywany jest program rozróżnia laby wykorzystywana np. do wczytywania różnych danych lub wyliczania zakresu pracy numer labu adresuje komunikację

numlabs

z mienna przechowująca liczbę wszystkich labów wykonujących dany program

SPMD -tablice rozproszone Tablice podzielone pomiędzy zasoby pamięciowe labów Ze strony klienta –

DistributedArray matlabpool open local 2 W = ones(6,6); W = distributed(W); spmd T = W*2; end matlabpool close

Ze strony labu –

CodistributedArray matlabpool open local 2 spmd codist = codistributor1d(3, [4, 12]); Z = codistributed.zeros(3, 3, 16, codist); Z = Z + labindex; end matlabpool close

Pmode

GPU

Rg = gpuArray.rand(1,4) G = gpuArray(ones(100, 'uint32')); D = gather(G); X = rand(1000); G = gpuArray(single(X)); result = arrayfun(@myFunction, arg1, arg2); gpuDeviceCount gpuDevice(2)

Współpraca Matlaba z innymi programami • Matlab  • Program  plik  program plik (ASCII, EXEL)  Matlab • Matlab  plik MAT  Program (C lub Fortran) • Matlab  plik  program  plik  Matlab • Matlab  funkcja (C/C++, Fortran lub Java) • Program (C/C++, Fortran lub Java)  Matlab

Matlab

plik

program

plik

Matlab

• Przykład m-pliku z funkcją interfejsu do zewnętrznego programu „topar.m”

Współpraca z innymi programami • Matlab  • Program  plik  program plik (ASCII, EXEL)  Matlab • Matlab  plik MAT  Program (C lub Fortran) • Matlab  plik  program  plik  Matlab • Matlab  funkcja (C lub Fortran) • Program (C lub Fortran)  Matlab

Rodzaje funkcji bibliotecznych • • • •

mx*

– operacje na typach Matlaba

mex*

– komunikacja ze środowiskiem Matlaba

eng*

– korzystanie z mechanizmów Matlaba

mat*

– operacje na plikach z danymi Matlaba

Dodawanie kodu w C i Fortranie – tworzenie MEX-funkcji • Standardowa nazwa funkcji • Biblioteka

mx*

do operacji na tablicach/strukturach Matlabowskich • Biblioteka

mex*

do komunikacji ze środowiskiem Matlaba

Operowanie na plikach MAT • Biblioteka

mat*

do czytania i pisania do pliku tablic Matlabowskich • Biblioteka

mx*

do operacji na tablicach Matlabowskich

Eksploatacja mechanizmu Matlaba z programu • Biblioteka

mx*

do operacji na tablicach/strukturach Matlabowskich • Bibloteka

eng*

do otwarcia „silnika” Matlaba, exportu i importu danych oraz wykonywania polecen w Matlabie

Dodawanie kodu w C i Fortranie – tworzenie MEX-funkcji • Standardowa nazwa funkcji • Biblioteka

mx*

do operacji na tablicach Matlabowskich • Biblioteka

mex*

do komunikacji ze środowiskiem Matlaba

Standardowa funkcja MEX w C

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { /* program ... */ }

C C

Standardowa funkcja MEX w Fortranie

subroutine mexFunction(nlhs, plhs, nrhs, prhs) integer nlhs, nrhs integer plhs(*), prhs(*) program ...

Przykłady biblioteki

mx*

mxMalloc, mxFree

na zmienne (w C ) – przydzielanie i zwalnianie pamięci • • • • • • Typy danych/struktury Matlaba, np.

mxArray mxCreateDoubleMatrix, mxCreateDoubleScalar

tworzenie tablicy Matlaba

mxDestroyArray mxGetM, mxGetN

– usuwanie tablicy Matlaba – określanie rozmiarów tablic –

mxIsClass, mxIsDouble

, itd. – badanie typu danych

mxGetPr, mxGetPi, mxGetScalar

danych double – dostęp do

Przykłady biblioteki

mex*

• • • • • •

mexEvalString, mexCallMatlab

polecenia i funkcji z matlaba – wykonywanie

mexWarnMsgTxt, mexErrMsgTxt, mexPrintf

wypisywanie komunikatów w Matlabie –

mexLock mexSet

– zatrzymanie MEX pliku w pamięci – ustawienie właściwości np. grafiki

mexIsGlobal

globalna – badanie czy istnieje dana zmienna

mexFunctionName

funkcji – odczytanie nazwy bieżącej

Kody przykładowych funkcji MEX w C • trgmtst.c

• trgtitch.c

• tstumss6.c (umss6.m)

Kompilacja MEX funkcji • Można stosować własny kompilator powszechny kompilator, np. Visual C++, Borland C, Watkom • Matlab posiada własny kompilator. Wywoływany poleceniem mex np.

mex funkcja.c

mex procedura.F funkcje.F

Kompilator Matlaba Kompilacja M-plików i tworzenie: • kodów źródłowych w C dla MEX plików • kodów źródłowych w C i C++ dla samodzielnych programów • kodów w C z S-funkcjami dla Simulinka • pluginów EXEL-a • obiektów COM