2016-07-25 43 views
0

Ich frage mich, ob die maximale Bandbreite in programmierten E/A gegenüber DMA abweichen kann. Meine Verwirrung kommt von den folgendenProgrammierte E/A im Vergleich zu DMA

Wenn wir nur einen Bus für CPU, Speicher und E/A-Gerät haben und wir Programmed I/O verwenden, geht die Daten direkt von E/A zu Speicher, wenn wir etwas lesen oder es geht zuerst zur CPU, dann zum Speicher. Das heißt, wenn wir 10 Bytes pro Übertragung übertragen können und jede Übertragung 20 Millisekunden dauert, bedeutet das, dass mit programmierter E/A max Bandbreite pro Sekunde

10 * 20 * 10^-9?

oder muss ich die Tatsache berücksichtigen, dass es zuerst zur CPU und dann von CPU zu Speicher geht?

+0

Der größere Unterschied ist in CPU-Auslastung, siehe meine Antwort. Auch 10 Byte Chunks? Es wird eine Potenz von 2 sein, wie 16 Bytes. Und 20 ms pro Transfer? Läuft Ihre CPU mit 1 kHz? 20 ms sind 32 Millionen DRAM-Taktzyklen für 1600 MHz RAM. Natürlich haben moderne x86-CPUs geteilte Busse für RAM und Geräte-I/O, weil sie den Speichercontroller auf dem Chip haben. Siehe das Diagramm auf http://arstechnica.com/information-technology/2015/08/the-many-tricks-intel-skylake-uses-to-go-faster-and-use-less-power/ welches das System anzeigt Agent vs. Speicherbus. –

Antwort

1

Wenn Sie haben ein System angelegt, wie Sie in Ihrer Frage vorschlagen, und CPU < -> Northbridge Bandbreite war der Engpass, dann ja vielleicht Sie Daten aus einem extrem hohen Bandbreite Gerät in den Arbeitsspeicher schneller mit DMA bekommen könnten als PIO. Es klingt plausibel, dass dies möglicherweise in manchen Systemen mit sehr schnellen Geräten im Verhältnis zur Verbindung der CPU mit der Außenwelt passieren kann.

Natürlich haben moderne x86-Systeme nicht einmal a Northbridge, weil der Speichercontroller auf dem Chip ist. Das macht die Frage nach der Computerarchitektur nicht ungültig, macht sie aber weniger relevant. IDK was andere Chips (wie ARM) tun. Da jedoch ein hohes Maß an Integration üblich ist (einschließlich SoC (System on Chip)), wäre ich nicht überrascht, wenn separate Northbridges auch aus der Nicht-x86-Welt verschwinden würden.


Der Unterschied zwischen PIO und DMA ist meist nicht über die die höchste Bandbreite erreichen kann, die aber verlangsamt das System mehr nach unten. Das mehr oder weniger vollständige Ausführen einer Kopierschleife belegt einen CPU-Kern für die gesamte Kopierdauer. Dies war ein noch größerer Deal vor Multi-Core-CPUs.

Eine Kopierschleife belastet auch Caches, aber dies kann mit speziellen Cache-Bypass-Anweisungen meist vermieden werden.

Auf x86 können die in und out programmierten E/A-Anweisungen nicht besonders gut pipeline. Sie sind nicht serialisieren wie CPUID, aber they do drain the store buffer und sind nicht sehr freundlich zu Out-of-Order-Ausführung. Dies ist einer der Gründe, warum Speicher-Mapping-E/A mit regulären Lade-/Speicheroperationen gegenüber in/out für PIO bevorzugt wird. z.B. nur um IO-Register eines Geräts zu schreiben, um eine DMA-Übertragung zu initiieren, oder für kleine Transfers, bei denen DMA es nicht wert ist.

2

PIO geht normalerweise direkt zur CPU. Sogar CISC-Befehle, die von Speicher zu Speicher kopieren, müssen immer noch einen Befehlsschlitz in der CPU-Pipeline verwenden. Der Ladebefehl kann auch eine große Busverzögerung im Vergleich zu RAM-Lesevorgängen erfahren. Denken Sie auch an eine Schleifenanweisung, wenn Sie eine große Menge kopieren und es ist leicht einzusehen, warum DMA effizienter ist.

+0

Also, wenn wir PIO haben und wir Daten von der Festplatte in den Speicher übertragen müssen, sagen wir mal. Diese Daten gehen zuerst zur CPU und gehen dann in den Speicher? –

+0

Ja, die CPU zieht den Wert über den Bus. – PaulHK

+0

Sorry, ich bin ein wenig verwirrt, also CPU zieht Wert über den Bus zu seinen Registern/Cache und sendet es dann an Speicher? Nehmen wir an, der Bus kann 1 Byte pro Sekunde übertragen, und wir müssen 5 Bytes von der Festplatte in den RAM übertragen, dauert das 5 Sekunden oder 10 Sekunden? –