暫存記憶體(scratchpad memory)
快取就像一位機靈的助理,悄悄把你最近用過的書複本擺在附近的架子上,猜你接下來會想要什麼——很方便,但你無法控制它。暫存記憶體則是相反的安排:它是你自己那張小巧、快速的書桌,你明確決定要放哪些書、何時放回去。沒有猜測、沒有自動行為——軟體刻意地把資料放進暫存記憶體、再把它移走。它是處於程式直接控制下的快速片上記憶體。
具體來說,暫存記憶體是晶片上一塊快速的 SRAM,和快取一樣,但有一個關鍵差別:它沒有標籤、沒有自動填入、沒有替換策略、沒有一致性機制。快取透明地映照主記憶體並自行決定保留什麼;暫存記憶體只是一塊位於它自己固定位址的小型私有記憶體,程式(或編譯器)發出明確指令,把資料從主記憶體拷進來、在上面運算、再把結果拷回去。因為它不做快取那些猜測,同樣大小的暫存記憶體佔用更少面積與能量,而且——最重要的——它的時序完全可預測:每次存取一定命中,不會有意外的快取未命中。
加速器為何愛它:對於資料模式已知且規則的領域(像流經深度學習加速器的矩陣),編譯器早已確切知道何時需要哪筆資料,所以快取那套聰明的猜測是浪費的開銷,它不可預測的未命中更是個負擔。暫存記憶體讓軟體完美地把資料就位,依已知的時程持續餵飽算術單元,且不在快取邏輯上花一個電晶體。誠實的代價是:這份負擔如今落到程式設計師或編譯器身上——手動管理暫存記憶體比依賴自動快取更難,這正是為什麼在存取模式不可預測的通用 CPU 上,快取占主導地位。
深度學習加速器把一塊權重與一塊輸入從主記憶體拷進它的暫存記憶體一次,然後在許多次乘加中重複使用,再把結果寫回去。因為程式刻意放好了那筆資料,算術陣列從不會因意外的未命中而停頓——每次存取暫存記憶體都是保證命中。
暫存記憶體相對於快取:明確、可預測、由軟體管理——沒有標籤、沒有猜測、沒有意外未命中。
暫存記憶體不是把魔法關掉的快取——它完全沒有快取的自動機制,這既是它的強項(可預測、便宜),也是它的負擔(軟體必須親手管理每一次搬移)。