簡體   English   中英

高效的訪問矩陣列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM