Re: [問題] 如何利用cache讓程式整體效率提高?

看板C_and_CPP (C/C++)作者 (ggggg)時間14年前 (2012/03/28 03:13), 編輯推噓4(407)
留言11則, 4人參與, 最新討論串2/3 (看更多)
會在L1或L2我不知道... 但是只要在cache裡連續存取速度就差很多了 一般而言 CPU會從主記憶體抓連續的4個資料 出來到cache 而一維陣列可以保證資料皆連續 二維陣列就沒有了 所以以後請愛用一維陣列來存資料 雖然有時容易搞混 不過要是想增加效率 就都改用一維陣列吧 對了 你這矩陣乘法寫法是最慢的... 把矩陣拆成4*4大小來做會比較快 詳細做法和原理當然就是和cache有關 程式碼上網google一下應該有 6層迴圈就做得出來 ※ 引述《heymei0421 (heymei)》之銘言: : 大家好 : 我想讓cache增加執行效率 : 比如說 兩個矩陣相乘 每個矩陣的維度為1000 : 其程式碼假設如下 : int i,j,k; : int sum; : int a[1000][1000],b[1000][1000],c[1000][1000]; : for(i=0;i<1000;i++) : { : for(k=0;k<1000;k++) : { : sum=0.0; : for(j=0;j<1000;j++) : sum=sum+a[i][j]*b[j][k]; : c[i][k] = sum; : } : } : 由上可知 a[i][j]這個資料會反覆的利用在第一列 : 我要怎麼才能確定a[i][j]會在cache L1 或者 L2? : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.162.1.12

03/28 03:40, , 1F
所以照您的說法,用2維陣列抓出來就不會連續,所以就
03/28 03:40, 1F

03/28 03:40, , 2F
不會被抓到cache嗎?
03/28 03:40, 2F

03/28 03:42, , 3F
還有您說的4*4比較快,是在說Strassen algorithm嗎?
03/28 03:42, 3F

03/28 03:43, , 4F
二維陣列不是連續的嗎??
03/28 03:43, 4F

03/28 03:44, , 5F
03/28 03:44, 5F

03/28 03:51, , 6F
做矩陣相乘總是有人要直的跑下來 這是不可避免的
03/28 03:51, 6F

03/28 03:52, , 7F
因此拆成許多 4*4 的用意就是讓這直的跑下來不會跑出 cache
03/28 03:52, 7F

03/28 03:52, , 8F
所謂不會連續的意思其實就是在指這直的跑下來的動作
03/28 03:52, 8F

03/28 04:05, , 9F
原來如此,了解
03/28 04:05, 9F

03/28 04:46, , 10F
我想請問一下,x64/x86從主記憶體抓到cache都是32byte?
03/28 04:46, 10F

03/28 08:47, , 11F
i7的 line size就是64bytes了
03/28 08:47, 11F
文章代碼(AID): #1FSX5dQ0 (C_and_CPP)
文章代碼(AID): #1FSX5dQ0 (C_and_CPP)