OpenMP版本矩陣相乘

2021-09-11 13:38:12 字數 1414 閱讀 9363

說明:

通過編寫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...