2016-02-29 26 views
1

有許多的方法來提高矩陣的矩陣乘法的性能(使用第二矩陣利用的參考局部性的轉置例如,使用算法方法等Strassen等)除了使用循環展開之外,有沒有優化向量 - 矩陣乘法的方法?

但有一種方法提高向量矩陣乘法的性能? (甚至谷歌搜索這將重定向到矩陣矩陣乘法改進方法。)我知道我們可以使用loop unrolling來獲得一些性能改進,但是有沒有其他方法?

回答

1

在過去,我使用了比二維矩陣快得多的一維矩陣。他們也沒有那麼更難使用,你可以使用類似訪問每個元素:

int i, j; 
for (i = 0; i < COLUMN_LENGTH; i++) 
{ 
    for (j = 0; j < ROW_LENGTH; j++) 
    { 
     printf("%f\n", A[i * ROW_LENGTH + j]); 
    } 
} 

這是一個行主序矩陣。

數學庫LAPACK是您可以在應用程序中使用的東西,矩陣函數已針對各種體系結構進行了高度調整。否則,您可以閱讀可能會爲您自己的優化提供一些想法的源代碼。

+0

沒有使用圖書館,我試圖自己做改進。我會嘗試一維數組的東西,看看它會如何執行。 –

2

根據定義,矩陣向量乘法是一系列不相關的點積。由於它們不相關,它們可以並行執行。

GPU matrix-vector product (gemv)給出了一個非常好的&對於gem?操作的不同GPU並行化的詳細比較。

與任何GPU相關的問題一樣,問題需要足夠大才能保證GPU調用開始時的設置開銷。據推測,如果矩陣的列維數足夠長,即使CPU線程並行化也可以加快速度。


不同的方向與你寫的關於循環展開的內容有關。循環展開只需利用計算機體系結構有一定的瞭解,即高速緩存未命中可以安全地執行在這裏亂序執行

// Code fragment for calculating the ith product entry. 
for(size_t j = 0; j < n, j += 4) 
{ 
    sum0 += m[i][j] * v[j]; 
    sum1 += m[i + 1][j] * v[j]; 
    sum2 += m[i + 2][j] * v[j]; 
    sum3 += m[i + 3][j] * v[j]; 
} 

BLAS庫,例如,OpenBLAS執行許多這樣的微型優化,其中一些依靠非常體系結構特有的功能。

+0

我一直在尋找不使用並行的東西(因此沒有嘗試GPU)。不管怎麼說,還是要謝謝你! –

+0

沒問題。祝你好運。 –

0

我認爲通用解決方案不存在。但是,我們可以通過使用快速內存​​向量,緩存內存屬性等來加速計算,並關注通過計算方法的具體特徵。