我正在對矩陣轉置的快取高效演算法進行一些測驗,并且在回圈阻塞技術中,當我的塊大小較小時,我會獲得更高的速度。由于我們通過將更多資料帶入快取來減少記憶體訪問次數,因此更大的塊大小不應該導致更高的速度嗎?
這是演算法:
for (int i = 0; i < n; i = blocksize) {
for (int j = 0; j < n; j = blocksize) {
for (int k = i; k < i blocksize; k) {
for (int l = j; l < j blocksize; l) {
dst[k l*n] = src[l k*n];
}
}
}
}
uj5u.com熱心網友回復:
好吧,這取決于,盡管它通常是正確的。
在您的(轉置)代碼中,訪問是連續完成的,src但對于dst. 當塊大小較小時,dst可以在快取中重復使用的快取行,因此損失不大。但是,當塊大小很大時,需要獲取大量快取行,并且就stridek=0而言,它們可能不適合快取中的所有行。實際上,快取通常是N 路組關聯的,并且使用大的二次方步長往往會導致快取垃圾。在最壞的情況下,只能保留很少的高速快取行(L1 高速快取通常是 4 或 8 路關聯的)。在這種情況下,對于,由于沖突未命中,需要重新獲取所有快取行k=1. 避免此問題的一個很好的解決方案是添加一些填充,以大大減少沖突未命中。另一種解決方案是制作副本,以避免大步讀取/寫入資料太多。或者,非臨時指令也可以有所幫助。這篇相關文章提供了有關此類問題的一些詳細見解。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519855.html
標籤:C表现
