让我们说我有一个二维数组,我可以从文件优化布局
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-存储彼此相邻而不是位于远离元素?
这可以减少内存延迟问题。
让我们说我有一个二维数组,我可以从文件优化布局
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-存储彼此相邻而不是位于远离元素?
这可以减少内存延迟问题。
这取决于你的处理器,但假设你有一个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)
因此,在每个完整的瓦片:
因此,平均每个输出像素触及1.265625个缓存行,而天真情况下平均触及2.03125个缓存行。
我发现我一直在寻找。我正在寻找一种称为Morten排序的数组,该数组已显示可减少存储器访问时间。另一种方法是使用显示比Morten排序方法更有效的希尔伯特曲线方法。
我附上一个链接到一篇文章,解释这个
如果我不知道过滤器的大小,请问有什么可以继续吗?我想优化布局本身,这样的数据相互靠近的矩阵在内存中也很接近。我想知道是否可以使用像希尔伯特曲线布局这样的技术。 – Adi279