[英]Efficient access matrix columns
高效訪問問題:我需要按列訪問大型矩陣(大於2000x2000),我的算法需要1行通過和1列通過。 行傳遞可以提高內存效率(緩存未命中),但是如何減少列傳遞中的緩存未命中呢? 我需要效率。
我唯一遇到的事情是:聲明n個局部變量(基於內存獲取大小),
int a1, a2, a3, a4; for ( int j = 0 ; j < DIM_Y ; j+=4 ) for ( int i = 0 ; i < DIM_X ; i++ ) a1 = matrix[i][j]; ... ; a4 = matrix[i][j+4]; // make the column processing on the 4 variables.
它使用C或C ++,以及array或int或char。
任何主張和評論都值得歡迎。
謝謝。
應用了兩種基本技術:
1)循環阻塞
代替
for (j=0;j<2000;j++)
for (i=0;i<2000;i++)
process_element(i,j);
采用
for (j=0;j<2000;j+=8)
for (i=0;i<2000;i+=8)
process_block_of_8x8(i,j);
2)2行跨步的非冪(例如8192字節+ 64)-必要時填充
在這種情況下,row [i] .. row [i + 7]將不會爭用同一條緩存行
數據應位於具有連續計算的填充的連續存儲區域中。
存儲2D矩陣的有效方法是使用C
樣式數組,如下所示:
| a11 a12 a13 |
| a21 a22 a23 | -> memory: [a11,a12,a13,a21,a22,a23,a31,a32,a33]
| a31 a32 a33 |
Element(i,j) = memory[N_COL*i+j]
其中i
是從0
開始的行號索引, j
是也從0
開始的列號索引,並且N_COL
是列號。
希望編譯器/ jit將所有值順序放置在內存中以便快速訪問。 通常,您越想欺騙編譯器(例如手動循環展開),就越會損害性能。 編寫干凈的代碼,然后讓編譯器執行其操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.