2017-11-27 4 views
0

Hallo Forum - Ich habe ein paar ähnliche/verwandte Fragen über SIMD intrinsisch, für die ich online einschließlich stackoverflow suchte, aber keine guten Antworten gefunden habe, so dass Sie Ihre Hilfe anfordern.SIMD intrinsic und Speicherbusgröße - Wie CPU alle 128/256 Bits in einem einzelnen Speicher liest liest?

Im Grunde versuche ich zu verstehen, wie eine 64-Bit-CPU alle 128 Bits in einem einzigen Lesevorgang abruft und welche Voraussetzungen für eine solche Operation erforderlich sind.

  1. Würde die CPU alle 128 Bits aus dem Speicher in einem einzigen Speicher abrufen oder zwei 64-Bit-Lesevorgänge ausführen?
  2. Verlangen die CPU-Hersteller eine bestimmte Größe des Speicherbusses, zum Beispiel für eine 64-Bit-CPU, würde Intel einen 128-Bit-Bus für SSE-Speicheroperationen benötigen?
  3. Sind diese Operationen abhängig von Speicherbusgröße, Anzahl der Kanäle und Anzahl der Speichermodule?

Antwort

4

Lasten/Geschäfte gehen nicht direkt den Speicher (es sei denn Sie sie auf einem uncachebar Speicherbereich verwenden). Sogar NT-Speicher gehen in einen Schreibkombinations-Füllpuffer.

Laden/Speichern zwischen Ausführungseinheiten und L1D-Cache. CPUs haben intern breite Datenpfade von Cache zu Ausführungseinheiten und von L1D zu äußeren Caches. Siehe How can cache be that fast? auf electronics.SE, über Intel IvyBridge.

z.B. IvB hat 128b Datenpfade zwischen Ausführungseinheiten und L1D. Haswell erweiterte das auf 256 Bits. Nicht aufeinander abgestimmte Ladungen/Speicher haben die volle Leistung, solange sie keine Cache-Line-Grenze überschreiten. Skylake-AVX512 erweitert dies auf 512 Bit, so dass es 2 64-Byte-Ladevorgänge und einen 64-Byte-Speicher in einem einzigen Taktzyklus ausführen kann. (Solange Daten im L1D-Cache heiß sind).

AMD CPUs einschließlich Ryzen handhaben 256b Vektoren in 128b Chunks (auch in den Ausführungseinheiten, im Gegensatz zu Intel nach Pentium M). Ältere CPUs (z. B. Pentium III und Pentium-M) teilten 128b Ladungen/Speicher (und Vektor-ALU) in zwei 64-Bit-Hälften, weil ihre Lade/Speicher-Ausführungseinheiten nur 64 Bit breit waren.

Die Speichercontroller sind DDR2/3/4. Der Bus ist 64 Bits breit, verwendet jedoch einen Burst-Modus mit einer Burst-Größe von 64 Bytes (nicht zufälligerweise die Größe einer Cache-Zeile.)

Als "64-Bit" CPU hat nichts mit der mit Breite beliebiger interner oder externer Datenbusse. Diese Terminologie wurde in der Vergangenheit für andere CPUs verwendet, aber sogar P5 Pentium hatte einen 64-Bit-Datenbus. (aligned 8-byte load/store is guaranteed atomic as far back as P5, e.g. x87 or MMX.) 64-Bit in dieser Fall bezieht sich auf die Breite von Zeigern und von Integer-Registern.


Weiterführende Literatur:

  • What Every Programmer Should Know About Memory (aber beachten Sie, dass ein großer Teil der Software-Prefetch-Zeug ist veraltet, moderne CPUs haben eine bessere HW Prefetchers als Pentium4). Noch unentbehrliches Lesen, vor allem, wenn Sie verstehen möchten, wie CPUs mit DDR2/3/4-Speicher verbunden sind.

  • Andere Leistungslinks in der x86 tag wiki.

  • Enhanced REP MOVSB for memcpy für mehr über x86 Speicherbandbreite.Beachten Sie insbesondere, dass die Single-Thread-Bandbreite durch max_concurrency/latency und nicht durch den DRAM-Controller begrenzt werden kann, insbesondere bei einem Vielkern-Xeon (höhere Latenz zu L3/Speicher).

+1

Ice Lake soll einen "Fast Short REP MOV" hinzufügen - was immer das bedeuten soll. – Mysticial

+0

@Mysticial: Nett! Vermutlich ist der Break-Even-Schwellenwert, bei dem eine Vektorschleife besser als "rep movsb" ist, niedriger als bei Skylake (wo es für ausgerichtete Zeiger möglicherweise 128 oder 256 Byte ist). –

+0

@PeterCordes - Danke für die detaillierte Antwort und Zeiger, ich habe eine Follow-up-Frage: Wenn der Bus 64 Bit breit ist, warum sollten die Daten auf 16-Byte-Grenze ausgerichtet sein, warum nicht 8 Bytes? –