乙個矩陣乘法的問題

2021-06-22 10:05:05 字數 981 閱讀 7428

問題:1024階雙精度浮點矩陣相乘,矩陣滿秩

經典**:

for (i = 0; i < n; i++)

}}

這是比較經典的方式,發現乙個問題,1024階的時間居然比1025階的時間多不少,很令人費解,於是加了一些類似gettimeofday這種函式統計計算每乙個行,每乙個結果的時間,發現在1024的時候沒隔一定個數的元素,時間都會有乙個比較大的增加(一般是加倍),而1025則不會,個人的猜想是cache造成的影響,1024的情況,每行正好是cache line size的整數倍,而1025則不是,可能會有一些預取,而在這種乘法訪問順序的情況下,會出現「跳著」訪問,這樣這些預取就會使得效能有所提公升。

對原有乘法做一些改變:

for (i = 0; i < n; i++)

}}

師兄說這是乙個比較經典的矩陣相乘方法,自習想了想才想通,字面上看是把二三層的迴圈調換了一下順序,其實把加法均攤,實現了對a陣列、b陣列都順序訪問,這樣就是cache效能提公升了很多,整體效能就提公升了,而且這樣修改後,1025和1024的時間也正常了,階數多的時間長。

完整**:

#include #include 

#include

//#define n 1023

int main(int argc, char*argv)

}gettimeofday(&start, null);

for (i = 0; i < n; i++)}}

gettimeofday(&end, null);

printf(

"line %d\t%d\n

", i, 1000000*(end.tv_sec - start.tv_sec) + end.tv_usec -start.tv_usec);

free(a);

free(b);

free(c);

return0;

}

乙個用GPU寫的矩陣乘法

這個過程相當繁瑣,個人認為有優化的可能 先說一下思路,矩陣相乘a矩陣乘b矩陣相當於a矩陣和b矩陣的轉置做內積.所以我就先把b矩陣做了轉置,再做內積.其中有兩個核函式是在主函式中執行的,先執行轉置,再執行乘法.再乘法函式中又巢狀了乙個內積函式.這樣充分的利用了並行化.如圖所示 以3 3矩陣為例.我先開...

矩陣乘法問題

給定n個矩陣 a1,a2,an,其中ai與ai 1是可乘的,i 1,2 n 1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。矩陣乘法 在矩陣乘法中,第乙個矩陣的行數和第二個矩陣的列數必須是相同的。先來看乙個簡單的例子 之所以這樣要求,是因為矩陣的乘法定義中,就要求了,...

由乙個矩陣得到乙個掩模矩陣

1.假設有乙個不完整的資料,如下 2030251 51830 317810 0232930112 1815 0import pandas as pd import numpy as np read data data pd.read csv data.csv a np.isnan data get ...