3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
第一種方法稍好一些,因?yàn)榉峙浣o的像元彼此相鄰放置。
第一種方法:
[ ][ ][ ][ ][ ] ....
^1st assignment
^2nd assignment
[ ][ ][ ][ ][ ] ....
^101st assignment
第二種方法:
[ ][ ][ ][ ][ ] ....
^1st assignment
^101st assignment
[ ][ ][ ][ ][ ] ....
^2nd assignment

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
在您的第二個(gè)代碼段中j,每次迭代中的更改都會(huì)產(chǎn)生一種空間局部性較低的模式。請記住,在幕后,數(shù)組引用會(huì)計(jì)算:
( ((y) * (row->width)) + (x) )
考慮一個(gè)簡化的L1緩存,該緩存具有足夠的空間來容納數(shù)組的50行。對(duì)于前50個(gè)迭代,您將為50個(gè)緩存未命中付出不可避免的代價(jià),但是接下來會(huì)發(fā)生什么呢?對(duì)于從50到99的每次迭代,您仍將緩存未命中,并且必須從L2(和/或RAM等)獲取。然后,x更改為1并重新y開始,導(dǎo)致另一個(gè)高速緩存未命中,因?yàn)殛嚵械牡谝恍幸褟母咚倬彺嬷兄鸪?,依此類推?/p>
第一個(gè)片段沒有這個(gè)問題。它以行優(yōu)先的順序訪問數(shù)組,從而獲得更好的局部性-您僅需為每行最多一次(如果在循環(huán)開始時(shí)數(shù)組中的行不存在于高速緩存中)支付高速緩存未命中的費(fèi)用。
話雖如此,這是一個(gè)非常依賴于體系結(jié)構(gòu)的問題,因此您必須考慮細(xì)節(jié)(L1緩存大小,緩存行大小等)才能得出結(jié)論。您還應(yīng)該同時(shí)衡量這兩種方式,并跟蹤硬件事件,以獲取具體的數(shù)據(jù)以得出結(jié)論。
- 3 回答
- 0 關(guān)注
- 636 瀏覽
添加回答
舉報(bào)