繁体   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