高效访问矩阵列

Efficient access matrix columns

本文关键字:阵列 访问 高效      更新时间:2023-10-16

>高效访问问题:我需要逐列访问一个大型矩阵(超过 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。

欢迎任何建议和评论。

谢谢。

两种基本技术适用:

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 将所有值按顺序放在内存中以便快速访问。通常,您越是试图欺骗编译器(例如手动循环展开),就越会在性能上伤害自己。编写干净的代码,让编译器做它的事情。