2017-04-26 117 views
0

在運行Android/Linux的一個臂的SoC,我觀察到以下:緩存讀取系統存儲器VS CPU讀取系統存儲器

  1. 分配的存儲區域作爲未緩存設備DMA輸入。 DMA完成後,此存儲區的內容被複制到另一個系統存儲區。
  2. 爲設備DMA輸入分配一個內存區域爲緩存。 DMA完成後,存儲器範圍無效,然後將該存儲區的內容複製到另一個系統存儲區。

分配的內存區大小約爲2MB,大於緩存大小(L2緩存大小爲256KB)。

方法2是X10大於方法快1

即:方法2的存儲器複製操作是X10大於方法快1

我推測,用方法2緩存通過讀從系統內存緩存行大小複製時,方法1需要通過總線事務處理大小讀取CPU從繞過緩存硬件的系統內存中讀取CPU。

但是,我找不到明確的解釋。我很欣賞誰能幫助提供詳細的解釋。

+0

不是簡單的「緩存」版本能夠通過緩存訪問服務所有後續請求的問題,而未緩存版本必須始終通過內存獲取數據。您提到的 –

回答

0

有這麼多的硬件項目,很難給出具體細節。 SOC決定了很多。但是,您觀察到的是現代ARM系統的典型性能指標。

主要因素是。所有的DRAM都由「行」和「列」構成。 DRAM history在DRAM芯片上,可以一次讀取整個「行」。也就是說,有一個晶體管矩陣,並且有一個物理點/佈線可以讀取整行(實際上可能有SRAM來將ROW存儲在芯片上)。當你閱讀另一個'列'時,你需要'取消/充電'接線來訪問新的'行'。這需要一些時間。主要的一點是DRAM可以在大塊中快速讀取順序存儲器。而且,由於存儲器在每個時鐘沿都流出,所以沒有命令開銷。

如果您將內存標記爲未緩存,則CPU/SOC可能會發出單個節拍讀取。通常這些將在單次讀/寫期間「預充電」消耗額外的週期,並且許多額外的命令必須被髮送到DRAM設備。

SDRAM也有'銀行'。銀行有一個單獨的'ROW'緩衝區(靜態RAM /多晶體管存儲器),允許您從一個銀行讀取到另一個銀行而不必重新充值/重新讀取。銀行往往相隔甚遠。如果您的操作系統在物理上將「未緩存」的內存分配到與「緩存」區域不同的庫中,那麼這還會增加額外的效率。它在操作系統中通常分開管理緩存/未緩存的內存(對於MMU問題)。記憶池通常足夠遠,可以分開放入銀行。

+0

:如果您將內存標記爲未緩存,則CPU/SOC可能會發出單節拍讀取。緩存情況如何?我知道它可能取決於實現,對於數據如何讀取(通過緩存控制器)是否有一種常見做法?謝謝 – jazzzz

+0

緩存是一個命中(在緩存中)或未命中。如果它是一個小姐,那麼它被放入緩存中,但必須被驅逐。這是通過「方式」機制以及隨機或LRU(最近一次使用)更換完成的。但是,對於memcpy(),緩存並不重要。你**不要**重複使用數據,所以緩存沒有提供一個寫得很好的'memcpy()'的好處。 –

+0

'常見的做法'總是一條緩存線。它通常是一個或兩個SDRAM突發讀/寫大小(不是行長度)。你不需要重新發出命令(預充電),你是順序讀一行。典型的最大DDR bw大約是時鐘頻率。即,由於命令開銷,16bit 500MHz DDR大約爲1GB/s。 –