具有最少内存访问时间的2D阵列的最佳布局

时间:2017-09-15 20:32:56

标签: memory multidimensional-array

我们假设我有一个可以从文件中读取的2D数组

1 2 3 4   
5 6 7 8  
9 10 11 12  
13 14 15 16  

我希望将它们存储为1D阵列arr [16] 我知道行式和列式存储 这会弄乱阵列的结构。说我想用2X2过滤器来解决这个问题。然后在conv(1,1)处,我将在1,2,5,6位置访问记忆  相反,我可以以一种模式优化数据的存储,使得元素1,2,5,6彼此相邻存储而不是远离它们吗?  这可以减少内存延迟问题。

2 个答案:

答案 0 :(得分:0)

这取决于您的处理器,但假设您的典型英特尔高速缓存行大小为64字节,那么选择每个64字节大小的方形子区域就像一个聪明的举动。

如果你的每个元素都是一个字节,那么8x8 subtiles是有意义的。所以,例如。

#define index(x, y) (x&7) | ((y&7) << 3) | \
    ((x&~7) << 6) | ((y&~7) ... shifted and/or multiplied as per size of x)

所以在每个完整的瓷砖中:

  • 在每64个案例中有49个案例中,所有数据都将在同一个缓存行中;
  • 在另外14个中,它将跨越两个缓存行;和
  • 在64的一个案例中,它将需要四个。

因此,每个输出像素触摸的平均缓存线数为1.265625,而在幼稚情况下则为2.03125。

答案 1 :(得分:0)

我发现了我在找什么。我正在寻找一种被称为Morten排序的数组,它已经证明可以减少内存访问时间。另一种方法是使用希尔伯特曲线方法,该方法被证明比morten排序方法更有效。

我附上了解释此

的文章的链接

w3schools