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)
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
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