說明:
通過編寫openmp版本的矩陣乘法(sgemm)熟悉openmp程式設計模型,鼓勵嘗試不同的優化策略。
在數學領域中,矩陣乘法將兩個矩陣進行相乘,得出另乙個矩陣。
矩陣乘法在實際應用中有廣泛的使用,並被不同的程式語言所實現。2023年制定的基礎線性代數子程式標準(blas)描述了基本的線性代數運算,包括矩陣乘法。
blas分為三個級別,而矩陣-矩陣運算屬於第**。 下式中,a、b為常數,a、b、c為矩陣。
c = aab + bc
根據記憶體大小測不同規模矩陣的處理速度(gflops/s),並給出計算公式
請計算系統的理論峰值,如果沒有達到理論峰值,嘗試給出原因
1.實現openmp下的普通版本的矩陣相乘:
2.優化版:
1)利用矩陣分塊
將矩陣乘法的計算轉化為其各自分塊矩陣相乘而後相加,能夠有效減少乘數矩陣和被乘數矩陣調入記憶體的次數,可加快程式執行。
2)用一維陣列表示二維
二維陣列在記憶體中也是一維陣列,但是可以通過轉換的公式,減少實際的乘法次數,以達到優化效果
注:分塊和一維表示不能同時進行。
(同時進行會報錯,可能是涉及到分塊的問題,一維的位置規則和分塊的位置不太一樣)
實驗1.實驗環境
本機: cpu:i5-4210u 記憶體:8g os: windows10 1607
實驗室:cpu: i7-7700k gpu:gtx 1080 記憶體:8g ddr4 os:ubuntu 16.04
2.結果及分析
不同規模矩陣處理速度公式:
speed = 2*n^3/time gflops
(對結果矩陣c分析知,每個迴圈進行一次加和乘操作)
gpu理想值:單精度浮點運算運算能力是9tflops 乙個tflops(teraflops)等於每秒一萬億(=10^12)次的浮點運算
256512
1024
2048
本地0.37
3.72
50.81
/gpu
0.049
0.47
3.68
104.3
256512
1024
2048
分塊0.046
0.46
3.75
29.9
一維陣列
0.019
0.364
2.91
82.1
注:每個時間是執行三次取平均值的結果(執行緒數量均為64)
p.s max=2048下執行緒數量從64換到256,時間上沒有任何的進步……
結論在gpu環境下,矩陣相乘的執行速度明顯提高,但在維度較大的情況下,對**進行優化會有更好的效果。
個人github:icarusintheworld
CULA矩陣相乘和CUBLAS矩陣相乘
cula的矩陣相乘 culadevicedgemm n n n,m,k,alpha,b device,n,b k x n a device,k,a m x k beta,c device,n 上式表示 c a b的矩陣相乘方法,而且資料型別為double,也可以使用float型別資料的函式 cula...
矩陣冪(矩陣相乘)
題目描述 給定乙個n n的矩陣,求該矩陣的k次冪,即p k。第一行 兩個整數n 2 n 10 k 1 k 5 兩個數字之間用乙個空格隔開,含義如上所示。接下來有n行,每行n個正整數,其中,第i行第j個整數表示矩陣中第i行第j列的矩陣元素pij且 0 pij 10 另外,資料保證最後結果不會超過10 ...
C 矩陣相乘
void matrixmulti int a,int b,int c,int n1,int m,int n2 for i 0 ifor i 0 ia 0 0 1 a 0 1 2 a 0 2 3 a 1 0 2 a 1 1 3 a 1 2 1 b 0 0 1 b 0 1 2 b 0 2 3 b 0 3...