it-swarm.dev

Was bedeuten die Begriffe "CPU-gebunden" und "E / A-gebunden"?

Was bedeuten die Begriffe "CPU-gebunden" und "E/A-gebunden"?

263
Developer

Es ist ziemlich intuitiv:

Ein Programm ist an die CPU gebunden, wenn es schneller laufen würde, wenn die CPU schneller wäre, d. H., Es verbringt den größten Teil seiner Zeit damit, einfach die CPU zu verwenden (Berechnungen durchzuführen). Ein Programm, das neue Stellen von π berechnet, ist in der Regel CPU-gebunden. Es gibt nur Zahlen an.

Ein Programm ist E/A-gebunden, wenn es schneller laufen würde, wenn das E/A-Subsystem schneller wäre. Welches genaue I/O-System gemeint ist, kann variieren; Normalerweise verbinde ich es mit Festplatte, aber natürlich sind auch Netzwerke oder Kommunikation im Allgemeinen üblich. Ein Programm, das in einer riesigen Datei nach Daten sucht, kann E/A-gebunden werden, da der Engpass dann das Lesen der Daten von der Festplatte ist (tatsächlich ist dieses Beispiel heutzutage vielleicht altmodisch mit Hunderten von MB/s kommen von SSDs).

371
unwind

CPU Bound bedeutet, dass die Geschwindigkeit, mit der der Prozess fortschreitet, durch die Geschwindigkeit der CPU begrenzt wird. Eine Task, die Berechnungen für einen kleinen Satz von Zahlen ausführt, beispielsweise das Multiplizieren kleiner Matrizen, ist wahrscheinlich CPU-gebunden.

E/A gebunden bedeutet, dass die Geschwindigkeit, mit der ein Prozess fortschreitet, durch die Geschwindigkeit des E/A-Subsystems begrenzt wird. Eine Task, die Daten von der Festplatte verarbeitet, z. B. die Anzahl der Zeilen in einer Datei, ist wahrscheinlich E/A-gebunden.

Speicher gebunden bedeutet, dass die Geschwindigkeit, mit der ein Prozess abläuft, durch die verfügbare Speicherkapazität und die Geschwindigkeit dieses Speicherzugriffs begrenzt ist. Eine Aufgabe, die große Mengen an Speicherdaten verarbeitet, beispielsweise das Multiplizieren großer Matrizen, ist wahrscheinlich speichergebunden.

Cache bound bezeichnet die Geschwindigkeit, mit der ein Prozessfortschritt durch die Menge und Geschwindigkeit des verfügbaren Caches begrenzt wird. Eine Aufgabe, die einfach mehr Daten verarbeitet, als in den Cache passen, wird cachegebunden.

I/O Bound wäre langsamer als Memory Bound wäre langsamer als Cache Bound wäre langsamer als CPU Bound.

Die Lösung, um E/A-gebunden zu sein, besteht nicht unbedingt darin, mehr Arbeitsspeicher zu erhalten. In einigen Situationen kann der Zugriffsalgorithmus auf die Einschränkungen von E/A, Speicher oder Cache ausgelegt sein. Siehe Cache-Oblivious-Algorithmen .

205
Sanjaya R

Multithreading

In dieser Antwort werde ich einen wichtigen Anwendungsfall für die Unterscheidung zwischen CPU- und IO -beschränkter Arbeit untersuchen: Beim Schreiben von Multithread-Code.

RAM I/O-gebundenes Beispiel: Vektorsumme

Betrachten Sie ein Programm, das alle Werte eines einzelnen Vektors summiert:

#define SIZE 1000000000
unsigned int is[SIZE];
unsigned int sum = 0;
size_t i = 0;
for (i = 0; i < SIZE; i++)
    /* Each one of those requires a RAM access! */
    sum += is[i]

Die Parallelisierung dieser Funktion durch gleichmäßige Aufteilung des Arrays für jeden Ihrer Kerne ist auf gängigen modernen Desktops nur eingeschränkt sinnvoll.

Zum Beispiel auf meinem Ubuntu 19.04, Lenovo ThinkPad P51 Laptop mit CPU: Intel Core i7-7820HQ CPU (4 Kerne/8 Threads), RAM: 2x Samsung M471A2K43BB1-CRC (2x 16GiB) bekomme ich folgende Ergebnisse:

enter image description here

Plotdaten .

Beachten Sie jedoch, dass zwischen den einzelnen Durchläufen große Abweichungen bestehen. Aber ich kann die Array-Größe nicht weiter erhöhen, da ich bereits bei 8 GB bin und ich heute nicht in der Stimmung bin, Statistiken über mehrere Läufe hinweg zu erstellen. Dies schien jedoch ein typischer Lauf nach vielen manuellen Läufen zu sein.

Benchmark-Code:

Ich kenne nicht genug Computerarchitektur, um die Form der Kurve vollständig zu erklären, aber eines ist klar: Die Berechnung wird nicht 8x schneller als naiv erwartet, da ich alle meine 8 Threads verwende! Aus irgendeinem Grund waren 2/3-Threads das Optimum, und das Hinzufügen von mehr macht die Dinge viel langsamer.

Vergleichen Sie dies mit CPU-gebundener Arbeit, die tatsächlich 8-mal schneller wird: Was bedeuten "real", "user" und "sys" in der Ausgabe von time (1)?

Der Grund dafür ist, dass alle Prozessoren einen einzigen Speicherbus gemeinsam nutzen, der mit dem RAM verbunden ist:

CPU 1   --\    Bus    +-----+
CPU 2   ---\__________| RAM |
...     ---/          +-----+
CPU N   --/

so wird der Speicherbus schnell zum Engpass, nicht zur CPU.

Dies liegt daran, dass das Hinzufügen von zwei Zahlen einen einzelnen CPU-Zyklus benötigt und das Lesen des Speichers etwa 100 CPU-Zyklen in 2016-Hardware dauert.

Aus diesem Grund ist die pro Byte der Eingabedaten geleistete CPU-Arbeit zu gering, und wir nennen dies einen IO-gebundenen Prozess.

Die einzige Möglichkeit, diese Berechnung weiter zu beschleunigen, besteht darin, einzelne Speicherzugriffe mit neuer Speicherhardware, z. Mehrkanalspeicher .

Ein Upgrade auf einen schnelleren CPU-Takt wäre zum Beispiel nicht sehr nützlich.

Andere Beispiele

  • die Matrixmultiplikation ist auf RAM und GPUs CPU-gebunden. Die Eingabe enthält:

    2 * N**2
    

    zahlen, aber:

    N ** 3
    

    es werden Multiplikationen durchgeführt, und das ist genug, damit sich die Parallelisierung für ein praktisches großes N. lohnt.

    Aus diesem Grund existieren parallele CPU-Matrix-Multiplikationsbibliotheken wie die folgenden:

    Die Cache-Nutzung hat einen großen Einfluss auf die Geschwindigkeit der Implementierung. Siehe zum Beispiel dieses didaktisches GPU-Vergleichsbeispiel .

  • GPUs haben einen IO Engpass bei der Datenübertragung zur CPU.

    Sie sind so konzipiert, dass die Renderausgabe (ein Rechteck aus Pixeln) direkt in den Videospeicher ausgegeben werden kann, um das CPU-Roundtrip zu vermeiden.

  • Die Vernetzung ist das prototypische IO-gebundene Beispiel.

    Selbst wenn wir ein einzelnes Datenbyte senden, dauert es noch lange, bis das Ziel erreicht ist.

    Die Parallelisierung kleiner Netzwerkanforderungen wie HTTP-Anforderungen kann zu einem enormen Leistungsgewinn führen.

    Wenn das Netzwerk bereits voll ausgelastet ist (z. B. Herunterladen eines Torrents), kann die Parallelisierung die Latenz noch erhöhen (z. B. können Sie eine Webseite "zur gleichen Zeit" laden).

  • Eine Dummy-C++ - CPU-gebundene Operation, die eine Zahl benötigt und diese sehr stark knirscht:

So stellen Sie fest, ob Sie CPU- oder IO -gebunden sind

Nicht-RAM IO gebunden wie Festplatte, Netzwerk: ps aux, Dann theck if CPU% / 100 < n threads. Wenn ja, sind Sie IO gebunden, z. Das Blockieren von reads wartet nur auf Daten und der Scheduler überspringt diesen Prozess. Verwenden Sie dann weitere Tools wie Sudo iotop, Um zu entscheiden, welches IO genau das Problem ist.

Oder, wenn die Ausführung schnell ist und Sie die Anzahl der Threads parametrisieren, können Sie leicht anhand von time erkennen, dass sich die Leistung verbessert, wenn die Anzahl der Threads für CPU-gebundene Arbeit zunimmt: Was bedeutet "echt"?) , 'user' und 'sys' bedeuten in der Ausgabe von time (1)?

RAM-IO gebunden: Schwer zu sagen, da RAM Wartezeit in CPU% Messungen enthalten ist. Vielleicht ist das Beste, was Sie tun können, Cache-Fehler zu schätzen.

Siehe auch:

CPython Global Intepreter Lock (GIL)

Als kurze Fallstudie möchte ich auf die Python globale Interpretersperre (GIL) hinweisen: Was ist die globale Interpretersperre (GIL) in CPython?

Dieses CPython-Implementierungsdetail verhindert, dass mehrere Python - Threads die CPU-gebundene Arbeit effizient nutzen. Die CPython-Dokumente sagen:

CPython-Implementierungsdetail: In CPython kann aufgrund der globalen Interpretersperre nur ein Thread Python Code gleichzeitig ausführen (auch wenn bestimmte leistungsorientierte Bibliotheken diese Einschränkung möglicherweise umgehen). Wenn Sie möchten, dass Ihre Anwendung die Rechenressourcen von Multi-Core-Computern besser nutzt, sollten Sie multiprocessing oder concurrent.futures.ProcessPoolExecutor Verwenden. Threading ist jedoch immer noch ein geeignetes Modell, wenn Sie mehrere E/A-gebundene Tasks gleichzeitig ausführen möchten.

Daher haben wir hier ein Beispiel, in dem CPU-gebundener Inhalt nicht geeignet ist und E/A-gebunden ist.

CPU-gebunden bedeutet, dass die CPU oder die Zentraleinheit einen Engpass beim Programm hat, während E/A gebunden bedeutet, dass die E/A oder die Eingabe/Ausgabe einen Engpass beim Programm haben, z. B. Lesen oder Schreiben auf die Festplatte , Netzwerk usw.

Im Allgemeinen wird bei der Optimierung von Computerprogrammen versucht, den Engpass herauszufinden und zu beseitigen. Zu wissen, dass Ihr Programm CPU-gebunden ist, hilft, damit man nicht unnötig etwas anderes optimiert.

[Und mit "Engpass" meine ich die Sache, die Ihr Programm langsamer laufen lässt, als es sonst der Fall wäre.]

28
Chris W. Rea

Ein anderer Weg, um dieselbe Idee auszudrücken:

  • Wenn das Beschleunigen der CPU Ihr Programm nicht beschleunigt, ist es möglicherweise an E/A gebunden.

  • Wenn die Beschleunigung der E/A (z. B. durch Verwendung einer schnelleren Festplatte) nicht hilft, ist Ihr Programm möglicherweise an die CPU gebunden.

(Ich habe "möglicherweise" verwendet, weil Sie andere Ressourcen berücksichtigen müssen. Speicher ist ein Beispiel.)

16
gimel

Wenn Ihr Programm auf E/A wartet (z. B. ein Datenträger mit Lese-/Schreibzugriff oder ein Netzwerk mit Lese-/Schreibzugriff usw.), kann die CPU andere Aufgaben ausführen, auch wenn Ihr Programm gestoppt ist. Die Geschwindigkeit Ihres Programms hängt hauptsächlich davon ab, wie schnell dieses IO geschehen kann. Wenn Sie es beschleunigen möchten, müssen Sie die E/A beschleunigen.

Wenn Ihr Programm viele Programmanweisungen ausführt und nicht auf E/A wartet, wird dies als CPU-gebunden bezeichnet. Durch die Beschleunigung der CPU wird das Programm schneller ausgeführt.

In beiden Fällen besteht der Schlüssel zur Beschleunigung des Programms möglicherweise nicht darin, die Hardware zu beschleunigen, sondern das Programm zu optimieren, um die benötigte Menge an IO oder CPU zu reduzieren oder die Ein-/Ausgabe zu veranlassen während es auch CPU-intensive Sachen macht.

9
Paul Tomblin

E/A-Bindung bezieht sich auf einen Zustand, in dem die Zeit, die zum Abschließen einer Berechnung benötigt wird, hauptsächlich durch die Zeitspanne bestimmt wird, die zum Abschließen von Eingabe-/Ausgabeoperationen aufgewendet wird.

Dies ist das Gegenteil einer Aufgabe, die CPU-gebunden ist. Dieser Umstand tritt auf, wenn die Rate, mit der Daten angefordert werden, langsamer ist als die Rate, mit der sie verbraucht werden, oder mit anderen Worten, es wird mehr Zeit für die Anforderung von Daten aufgewendet als für deren Verarbeitung.

5
FellyTone84

E/A-gebundene Prozesse: Verbringen Sie mehr Zeit mit IO als mit Berechnungen, haben Sie viele kurze CPU-Bursts. CPU-gebundene Prozesse: Verbringen Sie mehr Zeit mit Berechnungen, wenige sehr lange CPU-Bursts

4
dua

E/A-gebundener Prozess: - Wenn der Großteil der Lebensdauer eines Prozesses im E/A-Status verbracht wird, handelt es sich um einen E/A-gebundenen Prozess. Beispiel: -calculator, Internet Explorer

CPU-gebundener Prozess: - Wenn der größte Teil der Prozesslebensdauer in der CPU verbracht wird, handelt es sich um einen CPU-gebundenen Prozess.

0
K.Abhishek