Ist Multi-Thread-Speicher schneller als Single-Thread-Speicherzugriff?

8

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?

    
user3677630 07.02.2017, 21:01
quelle

3 Antworten

8

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.

    
Xaver 07.02.2017 21:12
quelle
3

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

  • Speicherabruf und Speichereinheiten pro Kern
  • Speicher-Controller-Module
  • Pipeline-Tiefe von Speichermodulen und Aufzählung von Speicherbänken
  • Speicherzugriffsmuster für jeden Thread (Software)
  • Ausrichtungen von Daten-Chunks, Instruktions-Blobs
  • Sharing und seine Datenpfade von gemeinsamen Hardware-Ressourcen
  • Betriebssystem macht zu viel Vorkaufsrecht für alle Threads

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:

  • FX-Cores können mit zusätzlichen Threads skaliert werden, aber i7-Tops mit nur einem Thread (ich meine speicherintensive Codes)
  • FX hat mehr L3, aber es ist langsamer
  • FX kann mit höher frequentem RAM arbeiten, aber i7 hat eine bessere Inter-Core Datenbandbreite (falls 1 Thread Daten an einen anderen Thread sendet)
  • FX-Pipeline ist zu lang und zu lang, um nach einer Verzweigung wiederhergestellt zu werden

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.

    
quelle
0

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.

    
fhtuft 26.03.2017 10:37
quelle

Tags und Links