2017-09-15 81 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/