有許多的方法來提高矩陣的矩陣乘法的性能(使用第二矩陣利用的參考局部性的轉置例如,使用算法方法等Strassen等)除了使用循環展開之外,有沒有優化向量 - 矩陣乘法的方法?
但有一種方法提高向量矩陣乘法的性能? (甚至谷歌搜索這將重定向到矩陣矩陣乘法改進方法。)我知道我們可以使用loop unrolling來獲得一些性能改進,但是有沒有其他方法?
有許多的方法來提高矩陣的矩陣乘法的性能(使用第二矩陣利用的參考局部性的轉置例如,使用算法方法等Strassen等)除了使用循環展開之外,有沒有優化向量 - 矩陣乘法的方法?
但有一種方法提高向量矩陣乘法的性能? (甚至谷歌搜索這將重定向到矩陣矩陣乘法改進方法。)我知道我們可以使用loop unrolling來獲得一些性能改進,但是有沒有其他方法?
在過去,我使用了比二維矩陣快得多的一維矩陣。他們也沒有那麼更難使用,你可以使用類似訪問每個元素:
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是您可以在應用程序中使用的東西,矩陣函數已針對各種體系結構進行了高度調整。否則,您可以閱讀可能會爲您自己的優化提供一些想法的源代碼。
根據定義,矩陣向量乘法是一系列不相關的點積。由於它們不相關,它們可以並行執行。
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執行許多這樣的微型優化,其中一些依靠非常體系結構特有的功能。
我一直在尋找不使用並行的東西(因此沒有嘗試GPU)。不管怎麼說,還是要謝謝你! –
沒問題。祝你好運。 –
我認爲通用解決方案不存在。但是,我們可以通過使用快速內存向量,緩存內存屬性等來加速計算,並關注通過計算方法的具體特徵。
沒有使用圖書館,我試圖自己做改進。我會嘗試一維數組的東西,看看它會如何執行。 –