2016-07-25 38 views
0

我想知道程序I/O與DMA的最大帶寬是否會有所不同。我的困惑來自以下內容編程I/O與DMA

如果我們只有一條總線用於CPU,內存和I/O設備,並且我們正在使用程序化I/O,那麼當我們正在讀取某些內容時,數據是直接從I/O傳輸到內存或者先進入CPU然後進入內存。這意味着如果我們每傳輸10個字節並且每個傳輸需要20毫秒,這是否意味着每秒編程I/O最大帶寬是

10 * 20 * 10^-9?

還是我需要考慮的事實是,它首先到CPU,然後從CPU到內存?

+0

更大的區別是在CPU負載,請參閱我的答案。另外,10字節塊?它將是2的冪,如16個字節。每次傳輸20毫秒?你的CPU運行在1kHz?對於1600MHz的RAM,20ms是3200萬個DRAM時鐘週期。當然,現代x86 CPU具有分離RAM與設備I/O的總線,因爲它們具有片上存儲器控制器。請參閱http://arstechnica.com/information-technology/2015/08/the-many-tricks-intel-skylake-uses-to-go-faster-and-use-less-power/上的圖表,其中顯示系統代理與內存總線。 –

回答

1

如果你有佈局就像你在你的問題建議的系統,以及CPU < - >北橋帶寬是瓶頸,那麼是也許你可以使用DMA比得到一個非常高的帶寬的設備數據到RAM更快PIO。這聽起來似乎是合理的,這可能會發生在某些有非常快的設備相對於CPU與外部世界的連接的系統中。

當然,現代x86系統甚至沒有a Northbridge,因爲內存控制器是片內的。這並不會使有關計算機體系結構的問題失效,但它確實使它不那麼重要。 IDK的其他芯片(如ARM)傾向於做什麼。但是由於高集成度很常見(包括SoC(片上系統)),如果單獨的Northbridge從非x86世界消失,我也不會感到驚訝。


PIO和DMA之間的區別主要不在於哪個可以實現最高的帶寬,但會降低系統的速度。在複製的整個過程中,運行復制循環或多或少地完全佔用CPU內核。在多核CPU之前,這是一個更大的交易。

複製循環也會污染高速緩存,但這可以通過特殊的高速緩存旁路指令來避免。

在x86上,inout編程的I/O指令不能很好地傳輸。它們不像序列號CPUID,但they do drain the store buffer,並且對亂序執行不太友好。這是存儲映射I/O的常規加載/存儲操作優於PIO的in/out的原因之一。例如只是寫一個設備的IO寄存器來啓動DMA傳輸,或者對於DMA不值得的小型傳輸。

2

PIO通常直接進入CPU。即使從存儲器複製到存儲器的CISC指令仍然需要使用CPU流水線上的指令槽。與RAM讀取相比,加載指令可能會遇到大的總線延遲。如果您要複製大量數據並且很容易明白爲什麼DMA更高效,那麼還要考慮循環指令。

+0

所以,如果我們有PIO,我們需要將數據從磁盤傳輸到內存。該數據首先進入CPU,然後進入內存? –

+0

是的,CPU通過總線提取值。 – PaulHK

+0

對不起,我有點困惑,所以CPU把總線上的值拉到它的寄存器/緩存,然後發送到內存?因此,讓我們說總線可以每秒傳輸1個字節,我們需要從磁盤傳輸5個字節到RAM,這需要5秒鐘還是10秒鐘? –