2017-09-15 84 views
0

让我们说我有一个二维数组,我可以从文件优化布局

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

阅读我期待它们存储为一维数组ARR [16]。
我知道行方向和列明智的存储空间。
这会扰乱数组的结构。假设我想用2X2滤波器进行卷积。然后在conv(1,1)处,我将访问位置1,2,5,6处的内存。
相反,我可以优化数据的存储在一个图案,使得1,2,5,6-存储彼此相邻而不是位于远离元素?
这可以减少内存延迟问题。

回答

0

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

如果您的个人元素是一个字节每8×8,然后让子瓦感。所以,例如

#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个缓存行。

+0

如果我不知道过滤器的大小,请问有什么可以继续吗?我想优化布局本身,这样的数据相互靠近的矩阵在内存中也很接近。我想知道是否可以使用像希尔伯特曲线布局这样的技术。 – Adi279

0

我发现我一直在寻找。我正在寻找一种称为Morten排序的数组,该数组已显示可减少存储器访问时间。另一种方法是使用显示比Morten排序方法更有效的希尔伯特曲线方法。

我附上一个链接到一篇文章,解释这个

https://insidehpc.com/2015/10/morton-ordering/