PDF_4na1, 134 kB - Wydział Elektryczny

Transkrypt

PDF_4na1, 134 kB - Wydział Elektryczny
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
2/19
Plan wykładu nr 8
Mnożenie macierzy
Informatyka 1
metoda Strassena
wpływ pamięci podręcznej na czas mnożenia
biblioteki algebry liniowej (BLAS)
zastosowanie procesora karty graficznej (GPU)
Politechnika Białostocka - Wydział Elektryczny
Elektrotechnika, semestr II, studia stacjonarne I stopnia
Rok akademicki 2015/2016
Wykład nr 8 (13.06.2016)
(13.06.2016)
dr inż. Jarosław Forenc
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
3/19
Mnożenie macierzy
c13 
c23  = N
c33 
K
4/19
Operacja: C = A ⋅ B (A[N][M], B[M][K], C[N][K])
A[N][M] - macierz N×M - elementowa
B[M][K] - macierz M×K - elementowa
C[N][K] - macierz N×K - elementowa
N
dr inż. Jarosław Forenc
Mnożenie macierzy
Operacja: C = A ⋅ B
 c11 c12
c
 21 c22
 c31 c32
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
N
(i)
 a11 a12
a
 21 a22
 a31 a32
a13  b11 b12
a23  ⋅ b21 b22
a33  b31 b32
M
K
b13 
b23 
b33 
M
c11 = a11b11 + a12b21 + a13b31
c12 = a11b12 + a12b22 + a13b32
c13 = a11b13 + a12b23 + a13b33
c21 = a21b11 + a22b21 + a23b31
c22 = a21b12 + a22b22 + a23b32
c23 = a21b13 + a22b23 + a23b33
c31 = a31b11 + a32b21 + a33b31
c32 = a31b12 + a32b22 + a33b32
c33 = a31b13 + a32b23 + a33b33
 c11 c12
c
 21 c22
 c31 c32
c13 
c23  = N
(i)
c33 
 a11 a12
a
 21 a22
 a31 a32
K (k)
a13  b11 b12
a23  ⋅ b21 b22
a33  b31 b32
b13 
b23 
b33 
M
(j)
K (k)
M (j)
Program w języku C:
for (i=0; i<N; i++)
for (k=0; k<K; k++)
{
C[i][k] = 0.0;
for (j=0; j<M; j++)
C[i][k] += A[i][j] * B[j][k];
}
M
cik = ∑ aij ⋅ b jk ,
j =1
i = 1,2, K, N
k = 1,2,K, K
Koszt algorytmu: O (n 3 )
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
5/19
Mnożenie macierzy - metoda Strassena
obliczamy 7 pomocniczych macierzy mi o rozmiarze n/2 × n/2:
m1 = ( A12 − A 22 ) ⋅ (B 21 + B 22 )
m 2 = ( A11 + A 22 ) ⋅ (B11 + B 22 )
m 3 = ( A11 − A 21 ) ⋅ (B11 + B12 )
C12 
C
C =  11

 C21 C22 
obliczamy niezależnie każdą z podmacierzy Cij korzystając ze wzoru:
obliczamy składowe Cij macierzy wynikowej C:
jedno mnożenie macierzy A ⋅ B zastępowane jest zatem ośmioma
mnożeniami macierzy Aij ⋅ Bij
C11 = m1 + m 2 − m 4 + m 6
C12 = m 4 + m 5
O(n3 )
koszt powyższego algorytmu wynosi:
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
7/19
Mnożenie macierzy
na szybkość wykonywania obliczeń wpływa nie tylko liczba operacji
zmiennoprzecinkowych, ale także sposób pobierania danych z pamięci
komputera
obliczenia są efektywnie wykonywane, gdy odbywają się
na zmiennych znajdujących się w jak najszybszej pamięci
C21 = m 6 + m 7
C22 = m 2 − m 3 + m 5 − m 7
O (n log 2 7 ) = O (n 2,808 )
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
8/19
Mnożenie macierzy - język C
rozpatrzmy dwa algorytmy mnożenia macierzy:
Algorytm nr 1 (IKJ)
obecne systemy komputerowe mają hierarchiczną budowę pamięci:
rejestry procesora
pamięć podręczna (cache)
pamięć operacyjna
pamięć zewnętrzna
m 4 = ( A11 + A12 ) ⋅ B 22
m 5 = A11 ⋅ (B12 − B 22 )
m 6 = A 22 ⋅ (B 21 − B11 )
m 7 = ( A 21 + A 22 ) ⋅ B11
Cij = A i1 ⋅ B1 j + A i 2 ⋅ B 2 j , i, j = 1,2
koszt obliczeniowy powyższego algorytmu
jest taki sam jak algorytmu standardowego:
6/19
pomysłem na przyspieszenie algorytmu jest zmniejszenie liczby mnożeń
podmacierzy z ośmiu do siedmiu
dzielimy każdą macierz A, B, C na cztery podmacierze o rozmiarach
n/2 × n/2
B12 
Β
B =  11
,
 B 21 B 22 
dr inż. Jarosław Forenc
Mnożenie macierzy - metoda Strassena
załóżmy, że macierze są kwadratowe n × n i n jest potęgą liczby 2
A12 
A
A =  11
,
 A 21 A 22 
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
for (i=0; i<N; i++)
for (k=0; k<N; k++)
for (j=0; j<N; j++)
C[i][k] += A[i][j]*B[j][k];
Algorytm nr 2 (IJK)
for (i=0; i<N; i++)
for (j=0; j<N; j++)
for (k=0; k<N; k++)
C[i][k] += A[i][j]*B[j][k];
macierze:
2048 × 2048
procesor:
Intel Core i5-2410M
2,30 GHz
kompilator: Microsoft Visual C++
2008 Standard Edition
Algorytm nr 1 (IKJ):
bez optymalizacji: 268,021 [s]
z optymalizacją:
92,053 [s]
Algorytm nr 2 (IJK):
bez optymalizacji:
z optymalizacją:
49,409 [s]
6,270 [s]
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
9/19
Mnożenie macierzy - język C
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
10/19
Mnożenie macierzy - język C
Metoda przechowywania macierzy w pamięci liniowej
Algorytm nr 1 (IKJ)
C
A
B
C
A
B
M
for (i=0; i<N; i++)
for (k=0; k<K; k++)
for (j=0; j<M; j++)
C[i][k] += A[i][j] * B[j][k];
[0][0] [0][1] [0][2] [0][3]
N
[1][0] [1][1] [1][2] [1][3]
[2][0] [2][1] [2][2] [2][3]
macierz w pamięci liniowej (wektor)
Algorytm nr 2 (IJK)
macierz
for (i=0; i<N; i++)
for (j=0; j<M; j++)
for (k=0; k<K; k++)
C[i][k] += A[i][j] * B[j][k];
Pamięć podręczna (cache memory)
[0][0] [0][1] [0][2] [0][3]
[1][0] [1][1] [1][2] [1][3]
[2][0] [2][1] [2][2] [2][3]
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
11/19
Mnożenie macierzy - Matlab
N = 512; A = rand(N); B = rand(N);
C = zeros(N);
tic
for i = 1:N
for j = 1:N
for k = 1:N
C(i,j) = C(i,j) + A(i,k)*B(k,j);
end
end
end
toc
C = zeros(N);
tic
for i = 1:N
for j = 1:N
C(i,j) = C(i,j) + A(i,:)*B(:,j);
end
end
toc
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
Biblioteka numeryczna BLAS
C = zeros(N);
tic
C = C + A*B;
toc
BLAS - Basic Linear Algebra Subprograms
Zbiór procedur służących do wykonywania operacji
na podstawowych obiektach algebry liniowej:
skalarach
macierze: 512 × 512
Intel Core i5-2410M, 2.3 GHz
Matlab 7.5.0 (R2007b)
Metoda 1 (trzy pętle)
2.045686 seconds
Metoda 2 (dwie pętle):
1.537615 seconds
Metoda 3 (operator *):
0.032251 seconds
wektorach
macierzach
Strona główna: http://www.netlib.org/blas
Rok publikacji: 1979 (ostatnia wersja 3.6.0, listopad 2015)
Oryginalnie napisana w języku Fortran 77
Obsługuje liczby:
rzeczywiste pojedynczej i podwójnej precyzji
zespolone pojedynczej i podwójnej precyzji
12/19
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
13/19
Biblioteka numeryczna BLAS
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
14/19
BLAS - Nazwy procedur
Wyróżnia się 3 poziomy abstrakcji algorytmów BLAS
DGEMV - mnożenie macierzy przez wektor, macierz i wektor
zawierają liczby rzeczywiste podwójnej precyzji
BLAS Level 1
y ← α ⋅ A ⋅ x + β ⋅ y lub y ← α ⋅ AT ⋅ x + β ⋅ y
operacje typu wektor-wektor (dodawanie wektorów,
normy wektora, iloczyn skalarny wektorów)
SGEMM - mnożenie macierzy przez macierz, macierze zawierają
liczby rzeczywiste pojedynczej precyzji
y ← αx + y
y ← α ⋅ op( A) ⋅ op(B) + β ⋅ C
BLAS Level 2
operacje typu macierz-wektor (mnożenie macierzy przez wektor)
y ← αAx + y
op( X) = X, op( X) = XT , op( X) = conjg ( XT )
SSWAP - zamiana wektorów zawierających liczby rzeczywiste
pojedynczej precyzji
BLAS Level 3
x↔y
operacje typu macierz-macierz (mnożenie macierzy przez macierz)
C ← αA ⋅ B + C
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
15/19
BLAS - Implementacje
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
16/19
GPGPU i CUDA
Strona główna: http://www.netlib.org/blas
GPGPU - General Purpose computing on Graphics Processing Units
Strona główna zawiera niezoptymalizowaną bibliotekę BLAS
CUDA (Compute Unified Device Architecture)
hardware - równoległa architektura obliczeniowa GPU
MKL (Intel)
Intel Math Kernel Library (Intel MKL) v11.3
https://software.intel.com/en-us/intel-mkl
ACML (AMD)
GPUOpen
software - kompilator nvcc, biblioteki i inne narrzędzia
NVIDIA Corporation (USA)
Pierwsza wersja: luty 2007
AMD Core Math Library
Strona: http://www.nvidia.pl/object/cuda-parallel-computing-pl.html
http://developer.amd.com/tools-and-sdks/cpu-development/amd-coremath-library-acml/
Strona: https://developer.nvidia.com/cuda-zone
ATLAS (open source)
Automatically Tuned Linear Algebra Software
http://math-atlas.sourceforge.net/
Licencja: freeware
Systemy operacyjne: Windows, Linux, Mac OSX
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
17/19
CUDA - Jak używać
używać??
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
dr inż. Jarosław Forenc
CUBLAS
Sprawdzić czy karta graficzna w komputerze obsługuje CUDA
wszystkie nowe karty graficzne NVIDIA są kompatybilne z CUDA
Biblioteka CUBLAS - implementacja BLAS (Basic Linear Algebra
Subprograms) dla kart graficznych NVIDIA i środowiska CUDA
Zastosowanie CUBLAS (wersja 5.5) w programie wymaga:
Ściągnąć oprogramowanie CUDA (CUDA 7.5)
Network Installer - 8,5 MB
inicjalizacji biblioteki CUBLAS: cublasCreate()
Local Installer - 962,4 MB
przydzielenia pamięci GPU na macierze: cudaMalloc ()
przesłania macierzy o pamięci GPU: cublasSetMatrix()
Zainstalować oprogramowanie CUDA
wywołania odpowiednich funkcji CUBLAS: cublasSgemm()
Użyć szablonu (template project) do stworzenia własnego
programu wykorzystującego CUDA
przesłania wyników obliczeń z pamięci GPU do pamięci RAM
komputera: cublasGetMatrix()
zwolnienia pamięci GPU: cudaFree()
zakończenia pracy biblioteki CUBLAS: cublasDestroy()
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2015/2016, Wykład nr 8
18/19
dr inż. Jarosław Forenc
Koniec wykładu nr 8
Dziękuję za uwagę!
19/19