2011年2月10日 星期四

之前提過的" Cache 堵塞"。

之前 Shady 曾經說過在 16KB 的測試下於沒有執行 dcbf(); 時,
函式測試之結果都會變慢,
其原因被 Shady 稱作" Cache 堵塞",
而正確的稱呼為" Cache 飽和"。

因為 L2 Cache 為 write-back 設計,
又因配置記憶體的相關函式,
它可能於記憶體配置完成時也將 L1 Data Cache (DCache) 塞滿了,
所以當 DCache、L2 Cache 要將資料丟回記憶體時,
就會造成大量資料堵塞住 Cache 和記憶體之間的 Bus,
而且當資料量愈大時,
就會有部分資料在 DCache、L2 Cache中,
而另一部分資料還在記憶體中,
如此又會造成從記憶體區的資料要搬進 Cache 時,
會遇到舊的資料還在 write-back 中,
因此又造成等待時間加長。

在這邊 Shady 要列出一些 DCache 相關組語指令:
dcbt:將資料從記憶體搬入 DCache,
      預備給 load 相關動作使用,
      但若資料不在 L2 Cache 中,
      此指令只會將資料搬到 L2 Cache。
dcbtst:將資料從記憶體搬進 DCache 和 L2 Cache,
        預備給 store 相關動作使用。
dcbst:將資料從 DCache 和 L2 Cache 中更新回記憶體,
       但保留此 Cache line 在 DCache 和 L2 Cache 中。
dcbf:將資料從 DCache 和 L2 Cache 中更新回記憶體,
      但不保留此 Cache line 在 DCache 和 L2 Cache 中。
dcbz:將被指定的 Cache line 設置為零。

當中的 Cache line 又稱為 Cache block,
其長度有 128Bytes,
所以資料要盡量對齊 128Byte 位址,
以方便資料搬進 Cache 中。

還有盡量只使用 dcbt 和 dcbz 指令,
因為其它 DCache 相關指令不會比較快,
而 dcbt 需連續拿取六個不同位址且對齊 128Byte 之資料,
也就是六個 Cache line,
這樣才能掩蓋記憶體延遲,
而 dcbz 需連續拿取四個。
另外將資料 load 進或 store 出暫存器會有四個 CPU 週期,
所以當第一行指令為 load、store 相關指令時,
需再通過三行無相依指令才能於第五行以後的指令使用此暫存器。

以下列出 PS3 的階層式記憶體架構之延遲值:
Memory 到 L2 Cache:~ 400 cycles。
L2 Cache 到 DCache、ICache (註1):~ 40 cycles。
DCache 到 Register:4 cycles。
ICache 到 IB (註2):4 cycles。

註1:L1 Instruction Cache 的簡寫。
註2:Instruction Buffer 的簡寫。

沒有留言:

張貼留言