Ist Multi-Thread-Speicherzugriff schneller als Single-Thread-Speicherzugriff?
Nehmen wir an, wir sind in C Sprache. Ein einfaches Beispiel ist wie folgt. Wenn ich ein gigantisches Array A
habe und ich möchte A
in das Array B
mit der gleichen Größe wie A
kopieren. Verwenden Sie Multithreading, um Speicherkopien schneller als mit einem einzelnen Thread zu erstellen? Wie viele Threads eignen sich für diese Art von Speichervorgang?
BEARBEITEN: Lassen Sie mich die Frage enger stellen. Vor allem betrachten wir den GPU-Fall nicht. Die Speicherzugriffsoptimierung ist sehr wichtig und effektiv bei der GPU-Programmierung. Meiner Erfahrung nach müssen wir immer auf die Speicheroperationen achten. Auf der anderen Seite ist es nicht immer der Fall, wenn wir an der CPU arbeiten. Betrachten wir auch nicht die SIMD-Anweisungen wie avx und sse. Diese zeigen auch Probleme mit der Speicherleistung, wenn das Programm zu viele Speicherzugriffsoperationen im Gegensatz zu vielen Rechenoperationen hat. Angenommen, wir arbeiten mit einer x86-Architektur mit 1-2 CPUs. Jede CPU hat mehrere Kerne und eine vierkanalige Speicherschnittstelle. Der Hauptspeicher ist DDR4, wie es heute üblich ist.
Mein Array ist ein Array von Gleitkommazahlen mit doppelter Genauigkeit, deren Größe der Größe des L3-Caches einer CPU entspricht, also etwa 50 MB. Jetzt habe ich zwei Fälle: 1) kopiere dieses Array in ein anderes Array mit der gleichen Größe, indem du elementweise kopiere oder memcpy verwendest. 2) Kombiniere viele kleine Arrays in dieses gigantische Array. Beide sind Echtzeitoperationen, was bedeutet, dass sie so schnell wie möglich ausgeführt werden müssen. Gibt Multithreading eine Beschleunigung oder ein Dropdown? Welcher Faktor beeinflusst in diesem Fall die Leistung von Speicheroperationen?
Jemand hat gesagt, dass es hauptsächlich von der DMA-Leistung abhängt. Ich denke es ist, wenn wir memcpy machen. Was passiert, wenn wir elementweise kopieren, wird der CPU-Cache zuerst durchlaufen?
Es hängt von vielen Faktoren ab. Ein Faktor ist die Hardware, die Sie verwenden. Auf moderner PC-Hardware wird Multithreading höchstwahrscheinlich nicht zu einer Leistungsverbesserung führen, da die CPU-Zeit nicht der begrenzende Faktor für Kopiervorgänge ist. Der begrenzende Faktor ist die Speicherschnittstelle. Die CPU wird höchstwahrscheinlich den DMA-Controller verwenden, um das Kopieren auszuführen, so dass die CPU beim Kopieren von Daten nicht zu beschäftigt ist.
Im Laufe der Jahre hat die CPU-Leistung stark zugenommen, buchstäblich potenziert. RAM Leistung konnte nicht aufholen. Es machte den Cache tatsächlich wichtiger. Besonders nach Celeron.
Sie können also die Leistung erhöhen oder verringern:
Abhängig von
Einfach den Code für den Cache optimieren, dann entscheidet die Qualität der CPU über die Performance.
Beispiel:
FX8150 hat schwächere Kerne als ein i7-4700:
Es sieht so aus, als könnte AMD eine feinere Performance für Threads bereitstellen, während INTEL einem einzelnen Thread die nötige Power verleiht. (Ratsversammlung gegen Monarchie) Vielleicht ist AMD deshalb besser bei GPU und HBM.
Wenn ich die Spekulation stoppen müsste, würde ich mich nur um den Cache kümmern, da er in CPU nicht änderbar ist, während RAM viele Kombinationen auf einem Motherboard haben kann.
Annahme der AMD / Intel64-Architektur.
Ein Kern ist nicht in der Lage, die Speicherbandbreite zu sättigen. Aber das bedeutet nicht, dass Multithreading schneller ist. Dafür müssen sich die Threads auf unterschiedlichen Kernen befinden und so viele Threads starten, wie physikalische Cores vorhanden sind. Dies sollte beschleunigt werden, da das Betriebssystem die Threads wahrscheinlich verschiedenen Kernen zuweisen würde. In Ihrer Threading-Bibliothek sollte jedoch eine Funktion vorhanden sein, die einen Thread bindet zu einem bestimmten Kern, ist dies die beste Geschwindigkeit. Eine andere Sache, über die Sie nachdenken sollten, ist NUMA, wenn Sie ein Multi-Socket-System haben. Für maximale Geschwindigkeit sollten Sie auch über die Verwendung von AVX-Anweisungen nachdenken.
Tags und Links c memory multithreading