高效访问矩阵列
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++,数组或 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 将所有值按顺序放在内存中以便快速访问。通常,您越是试图欺骗编译器(例如手动循环展开),就越会在性能上伤害自己。编写干净的代码,让编译器做它的事情。
相关文章:
- 回旋/修改阵列访问
- 访问特定阵列位置/索引时出现分段错误
- 如何将1D阵列访问为2D阵列
- 分配/访问2d阵列,使得2d子块是连续的
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 访问多个阵列时 CPU 缓存的作用是什么?
- OpenMP 环路阵列访问中的错误共享
- 访问字符阵列中不可用的内存位置(超出范围值)
- 将std ::向量转换为阵列和当时的p/调用它会导致访问违规例外,在编组期间mscorlib.dll
- C 使用坐标结构的访问阵列元素
- C 私有阵列访问和存储
- 是二维阵列访问/修改时间组
- 阵列访问期间出现分段错误
- 动态2D阵列访问侵犯剩余
- 为什么2D数组访问要比1D阵列访问更快
- 2D阵列访问元素和地址
- 为什么unordered_set不提供阵列访问运算符
- 哪种方式更适合阵列访问
- 为什么这样做?阵列访问不正常
- 2D阵列访问冲突