INF1-2015-Wykl-08-Dzienne [tryb zgodności]

Transkrypt

INF1-2015-Wykl-08-Dzienne [tryb zgodności]
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
2/19
Plan wykładu nr 8
Mnożenie macierzy
Informatyka 1
Metody skrócenia czasu mnożenia macierzy
metoda Strassena
zmiana implementacji algorytmu
biblioteka Intel Math Kernel Library (MKL)
Politechnika Białostocka - Wydział Elektryczny
środowisko CUDA, biblioteka CUBLAS
Elektrotechnika, semestr II, studia stacjonarne I stopnia
Rok akademicki 2014/2015
Wykład nr 8 (15.06.2015)
dr inż. Jarosław Forenc
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, 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 2014/2015, 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 2014/2015, 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 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
7/19
Mnożenie macierzy - optymalizacja algorytmu
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 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
8/19
Mnożenie macierzy - optymalizacja algorytmu
rozpatrzmy dwa algorytmy mnożenia macierzy:
Algorytm nr 1
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 2014/2015, 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
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:
bez optymalizacji: 268,021 [s]
z optymalizacją:
92,053 [s]
Algorytm nr 2:
bez optymalizacji:
z optymalizacją:
49,409 [s]
6,270 [s]
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
9/19
Mnożenie macierzy - optymalizacja algorytmu
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
10/19
Mnożenie macierzy - optymalizacja algorytmu
Metoda przechowywania macierzy w pamięci liniowej
Algorytm nr 1
M
C
A
B
C
A
B
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
dr inż. Jarosław Forenc
[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
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 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
Biblioteka numeryczna BLAS
11/19
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
12/19
Biblioteka numeryczna BLAS
BLAS - Basic Linear Algebra Subprograms
Wyróżnia się 3 poziomy abstrakcji algorytmów BLAS
Zbiór procedur służących do wykonywania operacji
na podstawowych obiektach algebry liniowej:
BLAS Level 1
skalarach
operacje typu wektor-wektor (dodawanie wektorów,
normy wektora, iloczyn skalarny wektorów)
wektorach
y ← αx + y
macierzach
Strona główna: http://www.netlib.org/blas
Rok publikacji: 1979
Oryginalnie napisana w języku Fortran 77
Obsługuje liczby:
BLAS Level 2
operacje typu macierz-wektor (mnożenie macierzy przez wektor)
y ← αAx + y
BLAS Level 3
rzeczywiste pojedynczej i podwójnej precyzji
operacje typu macierz-macierz (mnożenie macierzy przez macierz)
zespolone pojedynczej i podwójnej precyzji
C ← αA ⋅ B + C
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
13/19
BLAS - Nazwy procedur
dr inż. Jarosław Forenc
14/19
BLAS - Implementacje
DGEMV - mnożenie macierzy przez wektor, macierz i wektor
zawierają liczby rzeczywiste podwójnej precyzji
Strona główna: http://www.netlib.org/blas
Strona główna zawiera niezoptymalizowaną bibliotekę BLAS
y ← α ⋅ A ⋅ x + β ⋅ y lub y ← α ⋅ AT ⋅ x + β ⋅ y
MKL (Intel)
Intel Math Kernel Library (Intel MKL) v11
SGEMM - mnożenie macierzy przez macierz, macierze zawierają
liczby rzeczywiste pojedynczej precyzji
https://software.intel.com/en-us/intel-mkl
C ← α ⋅ op( A) ⋅ op(B) + β ⋅ C
ACML (AMD)
AMD Core Math Library
op( X) = X, op( X) = X , op( X) = conjg ( X )
T
T
http://developer.amd.com/tools-and-sdks/cpu-development/amd-coremath-library-acml/
SSWAP - zamiana wektorów zawierających liczby rzeczywiste
pojedynczej precyzji
ATLAS (open source)
x↔y
Automatically Tuned Linear Algebra Software
http://math-atlas.sourceforge.net/
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 8
15/19
Mnożenie macierzy - MKL
16/19
GPGPU i CUDA
?gemm - computes a scalar-matrix-matrix product and adds the
result to a scalar-matrix product
C ← α ⋅ op( A) ⋅ op(B) + β ⋅ C
dr inż. Jarosław Forenc
GPGPU - General Purpose computing on Graphics Processing Units
CUDA (Compute Unified Device Architecture)
op( X) = X, op( X) = X , op( X) = conjg ( X )
T
T
hardware - równoległa architektura obliczeniowa GPU
software - kompilator nvcc, biblioteki i inne narrzędzia
Syntax - Fortran 77:
sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CBLAS - the C interface to the Basic Linear Algebra Subprograms
(BLAS) implemented in Intel® MKL
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum
CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE
TransB, const int M, const int N, const int K, const float alpha, const
float *A, const int lda, const float *B, const int ldb, const float beta,
float *C, const int ldc);
NVIDIA Corporation (USA)
Pierwsza wersja: luty 2007
Strona: http://www.nvidia.pl/object/cuda-parallel-computing-pl.html
Strona: https://developer.nvidia.com/cuda-zone
Licencja: freeware
Informatyka 1, studia stacjonarne I stopnia
Rok akademicki 2014/2015, 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 2014/2015, Wykład nr 8
dr inż. Jarosław Forenc
Mnożenie macierzy - CUDA + 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.0)
Network Installer - 8 MB
inicjalizacji biblioteki CUBLAS: cublasCreate()
Local Installer - 939 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 2014/2015, Wykład nr 8
18/19
dr inż. Jarosław Forenc
Koniec wykładu nr 8
Dziękuję za uwagę!
19/19