0

高效访问问题:我需要按列访问大型矩阵(超过 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++ 中,在数组或 int 或 char 中。

欢迎任何提议和评论。

谢谢。

4

2 回答 2

1

应用两种基本技术:

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] 不会争夺同一个缓存行

数据应位于具有手动计算填充的连续内存区域中。

于 2013-02-04T10:41:17.103 回答
0

存储 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以及列数。j0N_COL

希望编译器/jit 将所有值按顺序放置在内存中以便快速访问。通常,您试图欺骗编译器的次数越多(例如手动展开循环),您对性能的伤害就越大。编写干净的代码,让编译器完成它的工作。

于 2013-02-02T21:58:11.840 回答