作者wtchen (沒有存在感的人)
看板C_and_CPP
標題Re: [問題] 如何利用cache讓程式整體效率提高?
時間Mon Oct 12 02:24:46 2015
借原標題一問
原文是說用連續資料讓cache增加執行效率
如果我並不是用陣列,而是用struct把我需要用來運算的變數連在一起,
這樣cache能增加執行效率嗎?
ex:
typeedf struct {
int a;
float b;
float c;
} TempABC;
float example( TempABC *t) {
int i=0;
float ans = 0;
for (i=0; i<100000; ++i) {
a += b*a+c; // 這邊三行程式純粹亂打,只是代表abc都不斷變化
b -= c/a;
c *= 2;
}
return ans;
}
這個程式的效率會比我不用struct -> float example(int *a, float *b, float *c)
來的快嗎?
謝謝指教
※ 引述《NEWG5 (ggggg)》之銘言:
: 會在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), 來自: 90.41.42.66
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1444587888.A.271.html
推 littleshan: cache有associativity,現代的CPU在L1就是8-way 10/12 11:48
→ littleshan: 所以你的這個情況恐怕不會有明顯差異 10/12 11:48
→ wtchen: 那在arm上會有差異嗎 10/12 14:50
推 Killercat: gprof一下你就知道了啊.... :P 10/12 17:07
推 johnjohnlin: 我想沒差吧,反而如果對齊不好 footprint 會變大 10/12 20:13
→ johnjohnlin: 原因如同一樓說明 10/12 20:13
→ johnjohnlin: 而且如果是 GPU 或是 SIMD 指令的話 10/12 20:14
→ johnjohnlin: structure of array 比較好 10/12 20:14