對稱正定矩陣 Cholesky 分解 之 GPU 加速研究
description
Transcript of 對稱正定矩陣 Cholesky 分解 之 GPU 加速研究
對稱正定矩陣 Cholesky 分解之 GPU 加速研究
吳博雋淡江大學資訊管理學系研究生[email protected]
2
大綱 緒論 文獻探討 研究方法與目前作法分析 改進與測試 結論與未來發展
3
緒論 數值問題求解過程常需求共變異矩陣之反矩陣,共變異矩陣滿足對稱正定特性,適合用 Cholesky 分解,其速度比傳統 LU 分解還快 矩陣分解傳統有 LAPACK 函式庫可用,隨著硬體進步逐漸發展出多核多緒版本,如
MKL 、 異 質 訊 息 傳 遞 版 本 , 如ScaLAPACK 、 GPU 版本,如 MAGMA
4
緒論 ( 續 ) GPU 採 用 SIMD(Single Instruction Multiple
Data) 架構,可擁有數百核同時執行相同指令,比 CPU 之少數核更適合矩陣平行運算 本研究之研究目標及方法為,就現有之
GPU 版本 Cholesky 分解之公開程式,分析各版本程式演算法不同之處,評比其時間效能,並嘗試各種方法企圖增快運算速度以提昇效能。
5
文獻探討 Cholesky 分解 BLAS 函式庫 LAPACK 函式庫 矩陣乘法之時間複雜度
6
Cholesky 分解 適用於求解對稱正定矩陣之反矩陣,具有唯一性,複雜度為 n3/3+O(n2)
高斯消去法複雜度為 O(n3) , LU 分解複雜度為 2n3/3+O(n2)
7
BLAS 函式庫 (Basic Linear Algebra Subprograms)
包含 3 類矩陣向量運算,本研究用到如下函式 GEMM(GEneral Matrix Multiplication)
C = op(A)op(B) + Cα β SYRK(SYmmetrix Rank K update)
C = op(A)op(A)α T + Cβ TRSM(TRiangular Solve Multiple rhs)
op(A)X = BαXop(A) = Bα
平行化版本: NVIDIA 公司推出使用 GPU CUDA架構之 CUBLAS
8
LAPACK 函式庫 (Linear Algebra PACKage)
提供數值線性代數運算 包含各種聯立線性方程、平方差、特徵值問題求解函式 相關矩陣分解函式有 LU 分解、 QR 分解、 SVD 分解、 Cholesky 分解 本研究用到如下 Cholesky 分解函式
POTRF(POsitive-definite TRiangular Factorization)
spotrf(uplo, n, a, lda, info) 平行化版本
CPU 版 : Intel 公 司 推 出 之 MKL(Math Kernel Library) 函 式庫、 PLASMA(Parallel Linear Algebra Software for Multicore Architectures ) 、 ScaLAPACK(Scalable LAPACK)
GPU 版: MAGMA(Matrix Algebra on GPU and Multicore Architectures) 、CULA(CUda Linear Algebra)
本研究用到 MKL 與 MAGMA
9
矩陣乘法之時間複雜度 一般矩陣乘法: O(n3) Strassen 演算法: O(n2.807) Coppersmith-Winograd 演算法: O(n2.3737)
Stothers : O(n2.3736) Williams : O(n2.3727)
10
研究方法與目前作法分析 蒐集公開版本 GPU 求解 Cholesky 分解之原始碼
Bouckaert http://www.cs.waikato.ac.nz/~remco/
Volkov http://forums.nvidia.com/index.php?showtopic=89084
Henry http://runtime.bordeaux.inria.fr/shenry/papers/HS_Cholesky.pdf
MAGMA http://icl.cs.utk.edu/magma/software
分析其 CPU 與 GPU 使用情形 差異性分析
11
Bouckaert 與 Volkov 版本
12
Bouckaert 與 Volkov 版本( 續 )
13
Henry 版本
14
MAGMA 版本
15
MAGMA 版本 ( 續 )
16
4 版本使用函式情形表
+ : CPU 使用 MKL 函式庫* : GPU 使用 CUBLAS 函式庫
Bouckaert Volkov Henry MAGMA
POTRF CPU CPU+ GPU CPU+
SYRK GPU* GPU*GPU
GPU*
GEMM GPU* GPU* GPU*
TRSM CPU CPU+ GPU GPU*
17
差異性分析 Bouckaert 版本與 Volkov 版本
POTRF 與 TRSM Bouckaert 版本:自製 Volkov 版本: MKL 函式庫
MAGMA 版本與 Volkov 版本 TRSM
MAGMA 版本: GPU Volkov 版本: CPU
區塊大小不同
18
改進與測試 測試平台 改進方案
MKL 函式庫之使用 區塊大小 最佳區塊大小
相關考量
19
測試平台OS : CentOS 5.7 Kernel 2.6.18-274.12.1.el5 #1
SMP x86_64CPU : Intel Xeon E5620 (2.4GHz, 4 Cores) x 2 +
8GB RAMGPU : Nvidia C2050 (1.15GHz, 14
MultiProcessors, 448 Cores, 3GB GDDR3) x 2CUDA 版本: cudatoolkit_4.0.11_linux_64_rhel5.5MKL 版本: l_mkl_10.3.2.137MAGMA 版本: magma_1.1.0
20
整合各版本程式後之原始加速比
1000 2000 3000 4000 5000 6000 7000 8000 9000 100000
0.5
1
1.5
2
2.5
3
3.5
VolkovBouckaertHenryMAGMA
21
Bouckaert 版本使用 MKL 函式庫後之Cholesky 分解加速比
1000 2000 3000 4000 5000 6000 7000 8000 9000 100000
0.5
1
1.5
2
2.5
VolkovBouckaertBouckaert_MKL
22
Bouckaert_MKL 版本之區塊大小修改為64 後之加速比
1000 2000 3000 4000 5000 6000 7000 8000 9000 100000
0.5
1
1.5
2
2.5
Volkov
Bouckaert_MKL
Bouckaert_MKL_NB64
23
區塊大小統一為 MAGMA 版本給法後之加速比
1000 2000 3000 4000 5000 6000 7000 8000 9000 100000
0.5
1
1.5
2
2.5
3
3.5
4
VolkovVolkov_NBMAGMA
24
Volkov 版本矩陣維度 1000 至 10000 時不同區塊之運算時間表 (ms) 維度區塊 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
32 7.7 22.9 54.7 109.3 196.0 317.5 483.7 701.1 986.7 1331.2
64 7.2 19.3 45.3 91.5 164.2 262.7 403.8 577.6 810.8 1097.8
96 7.0 19.1 43.6 86.4 153.8 248.6 377.2 539.9 704.2 880.9
128 7.1 18.0 41.2 82.7 149.3 239.4 336.0 453.2 610.0 792.7
160 5.9 17.1 40.7 80.3 142.6 212.5 310.7 424.5 580.6 761.3
192 5.8 16.9 40.0 79.9 137.7 196.4 295.2 398.5 558.2 715.7
224 6.4 16.3 39.6 75.8 125.4 192.9 286.3 395.0 546.8 721.1
256 6.5 16.7 39.8 72.7 124.0 191.2 288.3 394.7 549.5 723.4
288 5.7 16.6 40.3 70.8 116.8 183.2 280.2 379.5 536.7 686.8
320 6.5 17.9 41.0 69.7 119.2 184.9 277.4 381.5 532.9 703.1
352 5.9 17.5 39.6 69.4 120.8 185.8 281.6 385.9 538.3 709.8
384 5.6 18.2 39.4 68.7 114.2 179.3 275.2 371.7 527.1 674.4
416 5.6 19.0 41.6 69.5 119.1 184.3 275.1 380.3 526.0 695.1
448 7.7 19.7 44.1 74.1 122.9 188.7 279.9 383.8 534.7 703.5
25
使用適合本平台最佳區塊大小後之加速比
1000 2000 3000 4000 5000 6000 7000 8000 9000 100000
0.5
1
1.5
2
2.5
3
3.5
4
Volkov_NBVolkov_BestNB
26
相關考量 誤差值 MAGMA 版本特定矩陣維度較佳原因 CPU 緒數影響 不同平台改進方案有效性
27
誤差值 ( 單精度 )N Volkov Bouckaert Henry MAGMA MKL
1000 6.26E-14 5.39E-14 8.81E-14 3.25E-14 6.62E-14
2000 1.49E-13 1.39E-13 2.16E-13 6.16E-14 1.66E-13
3000 1.16E-13 1.27E-13 1.90E-13 4.11E-14 1.00E-13
4000 1.06E-13 1.31E-13 1.96E-13 3.59E-14 9.41E-13
5000 3.05E-13 3.96E-13 6.21E-13 1.00E-13 2.75E-13
6000 2.95E-13 3.99E-13 6.06E-13 8.53E-14 2.57E-13
7000 2.80E-13 3.90E-13 6.04E-13 7.66E-14 2.45E-13
8000 2.78E-13 3.93E-13 6.08E-13 6.79E-14 2.49E-13
9000 2.73E-13 3.92E-13 5.89E-13 5.87E-14 2.38E-13
10000 2.71E-13 4.02E-13 6.16E-13 5.42E-14 2.43E-13
28
誤差值 ( 雙精度 )N Volkov Bouckaert Henry MAGMA MKL
1000 2.33E-31 1.89E-31 3.54E-14 9.06E-32 2.43E-31
2000 5.10E-31 4.78E-31 5.89E-14 1.93E-31 5.82E-31
3000 3.99E-31 4.54E-31 4.40E-14 1.36E-31 3.51E-31
4000 3.66E-31 4.36E-31 4.19E-14 1.03E-31 3.17E-31
5000 1.08E-30 1.40E-30 5.35E-14 3.41E-31 9.66E-31
6000 1.03E-30 1.39E-30 4.12E-14 2.87E-31 8.58E-31
7000 9.60E-31 1.39E-30 3.93E-14 2.52E-31 8.60E-31
8000 9.72E-31 1.39E-30 4.48E-14 2.24E-31 8.58E-31
9000 9.10E-31 1.37E-32 4.28E-14 2.05E-31 8.44E-31
10000 9.14E-31 1.42E-30 3.88E-14 1.93E-31 8.21E-31
29
MAGMA 版本矩陣維度 4000 較佳原因N 區塊 SYRK MEMCPY
CPU→GPUGEMM POTRF MEMCPY
GPU→CPUTRSM SUM
3000
128* 4.67 0.39 34.60 13.15 0.61 16.54 70.16
224 4.32 0.42 29.01 7.79 0.70 13.64 56.09
288 6.21 0.47 26.20 10.83 0.81 13.77 58.52
4000
128 7.99 0.58 75.18 16.18 0.83 23.39 124.34
224* 11.22 0.63 50.68 10.23 0.94 18.48 92.37
288 13.64 0.70 36.53 14.25 1.09 20.03 86.45
5000
128 12.21 0.77 157.11 20.65 1.03 32.70 224.68
224 27.51 0.82 138.47 12.97 1.19 27.72 208.90
288* 20.15 0.92 131.60 17.81 1.36 31.24 203.34
30
MAGMA 版本矩陣維度 8000 較佳原因N 區塊 SYRK MEMCPY
CPU→GPUGEMM POTRF MEMCPY
GPU→CPUTRSM SUM
7000
128 54.61 1.34 410.51 28.56 1.43 51.53 547.97
224 67.75 1.44 381.21 17.97 1.66 44.87 514.90
288* 41.27 1.62 366.80 24.89 1.91 54.67 491.17
8000
128 97.40 1.52 507.47 32.68 1.65 61.11 701.83
224 94.73 1.63 384.81 20.50 1.89 52.66 556.21
288* 57.20 1.84 272.62 28.36 2.18 64.48 426.69
9000
128 146.48 1.71 876.37 37.06 1.85 74.14 1137.61
224 121.37 1.86 819.71 23.18 2.13 65.79 1034.04
288* 69.52 2.09 796.71 32.03 2.47 83.95 986.77
31
MAGMA 版本矩陣維度 8000 較佳原因( 續 )N SYRK
MEMCPYCPU→GPU
GEMM POTRFMEMCPY
GPU→CPUTRSM SUM
7000 41.27 1.62 367.33 26.84 1.90 54.58 493.55
7100 45.88 1.64 381.33 25.28 1.94 55.59 511.66
7200 43.65 1.65 189.07 25.90 1.96 52.61 314.84
7300 44.87 1.68 421.15 26.13 1.99 58.22 554.05
7400 48.94 1.70 436.59 26.36 2.02 59.26 574.88
7500 48.09 1.73 455.44 26.95 2.06 60.98 595.25
7600 52.75 1.73 474.63 27.30 2.07 60.14 618.61
7700 53.37 1.78 492.56 27.43 2.11 63.61 640.85
7800 52.29 1.79 512.31 27.97 2.13 65.58 662.07
7900 57.45 1.82 532.32 28.45 2.14 60.55 682.74
8000 57.23 1.84 272.71 30.28 2.17 64.47 428.72
8100 56.58 1.88 583.30 29.03 2.25 69.98 743.03
8200 61.64 1.91 599.20 29.21 2.26 70.87 765.09
8300 62.02 1.95 643.05 30.24 2.30 72.71 812.28
8400 60.65 1.96 644.48 30.75 2.32 72.00 812.16
8500 66.23 1.99 668.08 30.31 2.34 75.78 844.73
8600 66.59 2.01 688.13 30.87 2.39 77.18 867.16
8700 65.15 2.04 716.88 31.23 2.41 79.05 896.75
8800 70.23 2.05 372.16 31.46 2.42 76.38 554.71
8900 71.37 2.10 769.83 31.99 2.46 82.30 960.04
9000 69.52 2.09 797.40 33.83 2.46 83.87 989.18
32
各版本於維度 10000 時不同 CPU 緒數之Cholesky 分解時間表 (ms)
緒數 Volkov_NB MAGMA MKL
1 1168.64 1286.05 19457.86
2 771.14 1285.62 9637.81
3 715.46 1286.74 6430.87
4 698.17 1286.67 4888.04
5 693.67 1285.03 3921.19
6 693.92 1285.39 3354.44
7 697.94 1286.87 2898.38
8 696.40 1286.07 2653.25
33
不同平台改進方案有效性OS : CentOS 6.2 Kernel 2.6.32-220.4.1.el6.x86_54
#1 SMPCPU : Intel Core i7 970 (3.20GHz, 6 Cores) +
24GB RAMGPU : Nvidia Geforce GTX 590 (1.22GHz, 16
MultiProcessors, 512 Cores, 1.5GB GDDR3) x 4CUDA 版本: cudatoolkit_4.1.11_linux_64_rhel5.5MKL 版本: l_mkl_10.3.2.137MAGMA 版本: magma_1.1.0
34
於另一 GPU 平台實驗最後結果之加速比
1000 2000 3000 4000 5000 6000 7000 8000 9000 100000
1
2
3
4
5
6
VolkovVolkov_NBMAGMA
35
結論 蒐集四種公開版本使用 GPU 作 Cholesky 分解程式,將各版本程式整合測試後,發現 Cholesky 分解 運 算 速 度 之 快 慢 順 序 分 別 為
Volkov 、 MAGMA 、 Bouckaert 、 MKL 、 Henry Bouckaert 版本於矩陣維度 6000 以下時, CPU端運算若有使用 MKL 函式庫則效能較佳;矩陣維度 6000 以上時,使用 MKL 函式庫與自製函式無太大差別。故使用 MKL 函式庫雖然為較好之選擇,但仍會受其他參數影響而無法明顯提升效能
36
結論 ( 續 ) 區塊大小對運算速度有重要影響, Volkov 版本將區塊大小由固定 64 改為與 MAGMA 版本同為隨矩陣維度變動方式時,效能明顯提升,尤其在矩陣維度 10000 時,加速比達到 3.5 倍以上 適用不同矩陣維度之最佳區塊大小也隨平台硬體而不同,本文針對 C2050 硬體平台,以排班單位 warp 大小之倍數,窮舉找出適合此平台之矩陣維度 1000 至 10000 ,及其最佳區塊大小之關係
37
未來發展 由於 MAGMA 也有提供多 GPU 分解原始碼,期待也能透過類似技術提升分解效能 目前已有利用 GPU 實現特殊矩陣乘法之文獻,期待此技術可取代 GEMM 以更加提升效能