看板 C_and_CPP 關於我們 聯絡資訊
借原標題一問 原文是說用連續資料讓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