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