在 Arm 體系結構中,我們知道大多數的 normal memory 的配置都是 write allocation 和 read allocation 的,即當寫一塊內存或讀一塊內存的時候,如果 miss 了,那么會將該物理內存緩存到 cache 中。
那么就帶來一個這樣的思考,如果我執行 memset(a, b, len),len 是一個很大的數,即對一大塊內存清 0,那么這一大塊內存數據 (此時都是 0 的數據) 都需要被緩存到 cache 嗎?這豈不是造成 cache 的浪費?一下就把 cache 占滿了?
在之前的微架構,也許是真的存在此問題的。然后在近些年的微架構中,可通過 “Write streaming mode” 解決。具體介紹如下,我們就以 Cortex-A720 為例,進一步說明。
Cortex-A720 核心支持 Write streaming mode,有時也稱為讀分配模式,對于 L1 和 L2 緩存都支持。
在讀不命中或寫不命中時,會向 L1 或 L2 緩存分配緩存行。然而,寫入大塊數據可能會使緩存中充滿不必要的數據。這不僅會浪費電力,也會降低性能,因為整個線路會被后續寫入覆蓋(例如使用 memset() 或 memcpy())。
在某些情況下,不需要在寫入時分配緩存行。例如,當執行 C 標準庫的 memset() 函數來將大塊內存清零為已知值時。
為了防止不必要的緩存行分配,內存系統會檢測 core 何時寫入了一系列完整的緩存行。如果在可配置數量的連續線路填充上檢測到這種情況,那么它會切換到寫入流模式。
在寫入流模式下,加載操作行為與正常情況相同,仍然可能引起線路填充。
寫入仍然在緩存中查找,但如果未命中,則會寫入 L2 或 L3 緩存,而不會啟動線路填充 L1。
在內存系統切換到寫入流模式之前,CHI 主控器或 AXI 主控器接口可能會觀察到超過指定數量的線路填充。
寫入流模式保持啟用,直到以下情況之一發生:
檢測到一個不是完整緩存行的可緩存寫入突發。
存在后續加載操作,其目標與未完成的寫入流相同。
當 Cortex-A720 核心切換到寫入流模式后,內存系統會繼續監視總線流量。當它觀察到一系列完整的緩存行寫入時,會向 L2 或 L3 緩存發出信號,以進入寫入流模式。
寫入流閾值定義了在存儲操作停止引起緩存分配之前,連續寫入的緩存行數量。您可以通過寫入寄存器 IMP_CPUECTLR_EL1 來配置每個緩存(L1、L2 和 L3)的寫入流閾值。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120235 -
Cache
+關注
關注
0文章
129瀏覽量
28332 -
Cortex-A7
+關注
關注
0文章
34瀏覽量
16493
發布評論請先 登錄
相關推薦
評論