Část 2
POROVNÁNÍ VÝKONNOSTI A POUŽITELNOSTI ARCHITEKTUR V TYPICKÝCH APLIKACÍCH
Paralelizace kódu Rozdíl v přístupu k paralelizaci kódu si ukážeme na operaci násobení matice maticí: • Mějme tři čtvercové matice A, B a C uložené v 2D polích • Řád všech matic je size. • Matice A a B vynásobíme do matice C tak, že do každého prvku C[i][j] přiřadíme hodnotu skalárního součinu i-tého řádku z matice A a j-tého sloupce z matice B.
2
Násobení matic (sekvenční kód) for(row = 0; row < size; row++) { for (column = 0; column < size; column++) { pom= 0; for(int position = 0; position < size; position++) { pom + = MA[row][position] * MB[position][column];} MC[row][column]=pom; }} Složitost je O(size^3) Úvaha: Každý prvek výstupní matice C je počítán nezávisle. Pak pro maximální míru paralelismu je dobré pro každý prvek vytvořit vlastní vlákno, které vypočítá jeho hodnotu. To znamená vynásobí řádek matice A sloupcem matice B. 3
Násobení matic ( pomocí OpenMP) #pragma parallel for numthreads(size*size) schedule(static,1) \ shared(A, B, C, size) private(column, row, position) collapse(2) for(row = 0; row < size; row++) { for (column = 0; column < size; column++) { pom=0; for(int position = 0; position < size; position++) { pom+ = MA[row][position] * MB[position][column];} MC[row][column] = pom; }}
4
Násobení matic (GPU kód) void kernel (int row, int column) { int position ; float pom=0.0; for(int position = 0; position < size; position++) { pom += MA[row][position] * MB[position][column]; MC[row][column]=pom;} void main() { Nakopíruj data (matice A a B) z hlavní paměti do paměti GPU. Spusť size*size vláken (instancí kernelu) s příslušnými parametry row a column. Nakopíruj data (matice C) z paměti GPU do hlavní paměti. }
Zajímavé je, že se „ztratily“ dva for cykly. 5
Násobení matic (CPU) - závěry • CPU verze má problémy s vytvoření velkého počtu vláken (stovky až tisíce). • Výpočet má příliš velkou granularitu, paralelizace nepokryje režii tvorby, synchronizace a zániku vláken. • Na CPU je nejefektivnější (u úloh tohoto typu) vytvářet počet vláken rovný počtu fyzických jader. To znamená neparalelizovat výpočet na úrovni prvků matice C, ale na úrovni bloků for cyklu pro proměnou row (cyklus nejvíce vně). • Výkon upravené CPU verze není velký (toto je způsobeno naivní implementací), ale zrychlení je lineární.
6
Násobení matic (GPU) - závěry • GPU verze nemá (díky HW akceleraci) problémy s vytvoření velkého počtu vláken (stovky až tisíce). • Další zjemňování nemá smysl, ale nemá velký dopad na výkon. • Výkon této GPU verze není velký, toto je způsobeno naivní implementací.
7
ANSYS Mechanical V145sp-5 and Xeon Phi • It supports only SMP in ANSYS Mechanical—DMP support is part of the Intel MKL roadmap.
Figure 1: Best run times for ANSYS Mechanical on V145sp-5 • With two cores, the Intel Xeon Phi coprocessor provided a nearly 2X performance improvement over the baseline.
ANSYS Mechanical V145sp-5 and Xeon Phi
• With only two licensed CPU cores and the Intel Xeon Phi coprocessor (which counts as a third core for license purposes), the benchmark ran 1.72x faster with Intel Xeon Phi coprocessor support.
ANSYS and CUDA • NVIDIA GPUs support the following products: Mechanical: ANSYS® Mechanical® 15.0 supports a full feature set including use on multiple GPUs. • Fluids: ANSYS® Fluent® 15.0 offers GPU support for pressure-based coupled solver and for radiation heat transfer models. • ANSYS® Nexxim™ 15.0 supports a full feature set; ANSYS® HFSS™ supports transient solver in 15.0.
ANSYS and CUDA
ANSYS and CUDA
LU factorization (Xeon Phi, MKL DGETRF)
MMM (Xeon Phi, MKL)
cuBLAS
• K40m: max. perf. 4.3 Tflops for SP and 1.3 Tflops for DP (GEMM= MMM, SYMM=MMM for symmetric matrix, TRSM= solves a triangular matrix equation, SYRK = a symmetric rank-k update)
cuBLAS vs MKL
• cuBLAS on K40m, ECC ON, input and output data on device. MKL 11.0.4 on Intel IvyBridge single socket 12 core E5-2697 v2 @ 2.70GHz ???? operace
cuSOLVER Dense vs. MKL
cuSPARSE: Sparse linear algebra routines 4x Faster than MKL Optimized sparse linear algebra BLAS routines for matrix-vector, matrix-matrix, triangular solve Support for variety of formats (CSR, COO, block variants) Incomplete-LU and Cholesky preconditioners New in CUDA 7.0: Graph Coloring
cuSOLVER Sparse QR
NPP Speedup vs. Intel IPP
cuDNN Version 2
SI porovnání architektur CPU +silné 1 vlákno - nejnižší max. výkonnost -- SIMD + uniformita vláken - režie synchro
Xeon Phi +-slabší 1 vlákno ++ vyšší max. výkonnost - SIMD + uniformita vláken - režie synchro - vlastní paměť + paměť rychlejší + cache srovnatelná ++ možno efektivně použít OpenMP +++ jednodušší portace
GPU --slabé 1 vlákno +++ nejvyšší max. výkonnost ? SIMT - nutno rozdělit na bloky vláken + synchronizace / komunikace v bloku - synchronizace / komunikace mimo blok - vlastní paměť + paměť rychlejší - Nutnost CUDA