# Avoid Waiting for Memory in Write Through 當處理器需要 write cache 並將數據同步到主記憶體時,使用 Write Through 策略時會出現等待記憶體的情況。 這是因為在 write cache 後,處理器必須等待將數據 write 主記憶體,以確保數據的一致性和持久性。然而,主記憶體的 write 操作速度通常比較慢,這就會導致處理器在等待期間被阻塞,無法執行其他任務,這樣的情況是不希望出現的。 ## Write Buffer 為了解決這個問題,可以引入 Write Buffer 的概念。 write Buffer是一個暫存區,它暫時保存了處理器要 write 主記憶體的數據,以減輕處理器等待記憶體的負擔。當處理器將數據 write cache後, write Buffer會立即接收到這些數據。然後, write Buffer中的數據會逐步被傳輸到主記憶體,而不需要處理器等待。 write Buffer通常實現為一個先進先出(FIFO)的結構,其中存儲了將要 write 主記憶體的數據。它具有一定的容量,典型情況下大約有4個條目,這意味著它可以同時處理多個待 write 的數據。 然而,當處理器的 write 操作頻率高於主記憶體的 write 速度時, write Buffer可能會出現飽和的情況,即 write Buffer已滿,無法再接受新的 write 請求。這將導致CPU被阻塞,無法繼續執行任務,這對於記憶系統設計師來說是一個噩夢。因此,在設計 write Buffer時,需要考慮到處理器的 write 頻率以及主記憶體的 write 速度,以避免出現 write Buffer飽和的情況,進而導致CPU被阻塞。 ## Write-Back Write-Back 是一種快取管理策略,與 Write-Through 相對應。在 Write-Back 策略中,當處理器要寫入數據時,它首先將數據寫入快取中的相應塊,而不是立即將其寫入主記憶體。當這個塊被標記為“髒”(dirty)時,表示其內容已被修改,與主存儲器中的內容不同步。當這個塊需要被替換時,才會將它的內容 Write-Back 到主存儲器中。 這種策略的優點在於減少了對主存儲器的寫入操作次數,因為多次對同一塊的讀寫操作只需要在快取中進行,而不需要每次都同步到主存儲器。這樣可以減少主存儲器的訪問延遲,提高了系統的性能。 在Write-Back策略中,還需要維護一個“髒”位(dirty bit),用於跟蹤每個塊的修改狀態。當一個塊被修改時,將其標記為髒位。當這個塊需要被替換時,只有當髒位被標記時,才需要將其Write-Back到主存儲器中,以確保數據的完整性。 此外,為了解決在 Write-Back 操作期間可能出現的問題,例如當需要替換的塊正在被讀取時,可以使用寫入緩衝器(Write Buffer)來暫存這些需要 Write-Back 的數據。這樣可以先讓需要替換的塊被讀取,而不必等待Write-Back操作完成,從而提高了系統的效率和吞吐量。 ## Write Allocation Write Allocation(寫入配置)是處理器在寫入操作遇到快取未命中時採取的策略。以下是對Write Allocation的不同情況進行詳細解釋: * Write Miss(寫入未命中): 在寫入未命中時,意味著處理器試圖將數據寫入快取,但在快取中未找到相應的塊。在這種情況下,需要決定如何處理這個未命中的寫入操作。 Write-Through的替代方案: * Allocate on Miss(在未命中時進行分配):這意味著在發生寫入未命中時,將從主存中拉取相應的塊並將數據寫入快取,以便日後的讀取和寫入操作能夠從快取中受益。這種策略確保了寫入的一致性,但可能會導致對主存的頻繁訪問。 * Write Around(略過寫入):在寫入未命中時,不從主存中拉取相應的塊,而是直接將數據寫入主存。這種方法適用於程序通常在寫入一整個塊之前並不會立即需要讀取該塊的情況,例如初始化操作。這樣可以減少對主存的訪問,但可能會導致後續讀取操作的性能下降。 Write-Back(寫回)的情況下: 在使用寫回策略時,通常會在發生寫入未命中時從主存中拉取相應的塊,這是因為寫回需要在替換髒塊(dirty block)之前將其寫回主存,以確保數據的完整性和一致性。 ## Example: Intrinsity FastMATH Intrinsity FastMATH 是一款嵌入式的 MIPS 處理器,具有以下特性: 1. 12 級流水線(12-stage pipeline):這意味著在處理器執行指令的過程中,將指令的執行劃分為 12 個階段。這有助於提高指令的並行執行效率。 2. 每個時鐘週期(cycle)可以進行指令和數據存取:這意味著在每個時鐘週期中,處理器都可以同時進行指令和數據的存取操作,從而提高了效率。 3. 分離的快取(Split cache):FastMATH 使用了分離的指令快取(I-cache)和數據快取(D-cache),這樣可以使指令和數據的存取互不影響,從而提高了存取效率。 4. 每個快取大小為 16KB:每個快取大小為 16KB,其中包含了 256 個塊,每個塊包含了 16 個字(words/block)。 5. 數據快取支持寫通過(write-through)或寫回(write-back):用戶可以根據具體應用場景和需求來選擇使用寫通過還是寫回策略。 根據 SPEC2000 測試,快取的未命中率為: * 指令快取(I-cache)的未命中率為 0.4%。 * 數據快取(D-cache)的未命中率為 11.4%。 * 加權平均未命中率為 3.2%。 這些數據提供了用戶對於該處理器在不同工作負載下的快取性能的評估和參考。未命中率越低,表示快取系統的效率越高,可以更好地利用快取來減少對主存的訪問,從而提高系統整體的性能。 ## Memory Design to Support Cache 要增加記憶體頻寬並減少快取未命中的處罰,可以採用以下幾種記憶體設計策略: * 增加記憶體匯流排寬度:擴展記憶體匯流排的寬度可以在單個時鐘周期內傳輸更多的數據。這可以有效地增加記憶體頻寬,減少從記憶體中提取數據所需的時間,從而減少快取未命中的處罰。 * 實現多通道記憶體架構:多通道記憶體架構使用多個記憶體通道並行訪問記憶體。通過同時通過多個通道訪問記憶體,可以顯著提高整體記憶體頻寬,減少與從記憶體中提取數據相關的延遲。 * 使用更高頻率的記憶體:使用具有更高時鐘頻率的記憶體模塊可以增加數據在記憶體和處理器之間傳輸的速率。這有助於減少記憶體訪問延遲,提高記憶體頻寬,最終減少快取未命中的處罰。 * 實現快取策略:在實際需要之前,將數據預取並預先加載到快取中的快取策略。預取有助於通過主動從記憶體中提取數據到快取中來減少快取未命中的影響,從而減少與快取未命中相關的延遲。 * 優化記憶體訪問模式:優化記憶體訪問模式以最小化快取未命中。這可能涉及重新排列數據結構或算法,以改善空間和時間局部性,有助於最大化快取利用率,減少快取未命中的處罰。 * 使用非阻塞式記憶體訪問:實現非阻塞式記憶體訪問技術,如無序執行或推測性執行,允許處理器在等待記憶體訪問時繼續執行指令。這有助於隱藏記憶體訪問延遲,提高整體系統性能。 * 採用高速記憶體技術:考慮使用高速記憶體技術,如DDR5或HBM(高帶寬記憶體),與較老的記憶體技術相比,這些高速記憶體技術提供了更高的記憶體頻寬。這些高速記憶體技術有助於減少記憶體訪問延遲,提高整體系統性能。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up