Auswirkung von Predication und Breite bei Vektorinstruktionen auf die CPU-Performance

Nai

Lt. Commander
Registriert
Aug. 2012
Beiträge
1.579
Hallo liebe Leser des Programmierforums!

Ich hätte so eine kurze Frage die mich seit längeren wurmt und wo ich auch keine Antwort in Google finde: Bei GPUs ist doch das Scheduling der Vektorinstruktionen auf die Vektorrechenkerne sehr primitiv. Deshalb bleiben die Rechenkerne von denjenigen SIMD-Lanes auch ungenutzt, die durch Predication oder durch die Active-Mask deaktiviert sind. Das hat Beispielhaft zur Folge, dass wenn bei einer Vektor-Recheninstruktion 50 \% aller SIMD-Lanes deaktiviert sind die GPU für diese Instruktion auch nur 50 \% ihrer Rechenleistung ausnutzen kann.

Wie viel Rechenleistung geht jedoch bei CPUs verloren bzw wie sieht die Ausnutzung der Vektoreinheiten aus wenn:
1. Ein Programm Vektorinstruktion verwendet, die Schmäler als die SIMD-Breite der CPU ist (zum Beispiel eine 128-Bit-SSE-Instruktion statt einer 256-Bit-AVX-Instruktion, oder noch schlimmer eine Skalare-Instruktion)?
2. Ein Programm bei einer Vektorinstruktion die SIMD-Lanes durch Predication deaktiviert?
Da das interne Scheduling von CPUs ja cleverer ist als bei GPUs und die CPU afaik intern auf RISC-Basis arbeitet nehme ich an, dass nicht ganz so viel Rechenleistung verloren geht. Für diese Vermutung habe ich leider keine Quelle gefunden. Weiß da jemand etwas genaueres?

MfG Nai
 
Zuletzt bearbeitet:
Da müsstest du schon direkt bei AMD / Intel nachfragen und vermutlich ist es selbst bei einem Hersteller noch unterschiedlich von Generation zu Generation. Ich geh aber stark davon aus, dass das zum Betriebsgeheimnis gehört ;)
Z.B. kann ich mir auch gut vorstellen, das aktuelle CPUs gar keine dedizierten Einheiten mehr für SSE haben, sonder dafür intern AVX genutzt wird, weil es Platz und Kosten spart.
 
@benneque Da braucht man nicht bei AMD oder Intel nachfragen, da schnappt man sich den Software Optimization Guide für die CPU seiner Wahl oder schaut mal bei Agner Fog vorbei, der hat praktisch zu jeder Architektur hilfreiche Informationen. Insbesondere in dem Zusammenhang interessant: Die Instruction Tables.

Betriebsgeheimnis wäre auch schlecht. Irgendwie muss man den Leuten doch erzählen, wie man programmieren muss, um die eigene Architektur möglichst perfekt zu nutzen :p

Nai schrieb:
1. Ein Programm Vektorinstruktion verwendet, die Schmäler als die SIMD-Breite der CPU ist (zum Beispiel eine 128-Bit-SSE-Instruktion statt einer 256-Bit-AVX-Instruktion, oder noch schlimmer eine Skalare-Instruktion)?
Grundsätzlich kann jede Pipeline bei jeder aktuellen Architektur nur maximal eine µOp pro Takt abarbeiten. Wenn man jetzt wie Intel native 256 Bit-Pipelines verbaut, bleiben die oberen 128 Bit bei 128 Bit-Code ungenutzt, und bei skalaren Operationen wird auch nur ein Feld verwendet. Da verpufft also sehr viel Rohleistung, wenn nicht vernünftig vektorisiert wird.

Da wird auch interessant, wie sich AMDs Zen schlägt - da gibt es zwar nur 128 Bit-Einheiten, aber dafür doppelt so viele. 128 Bit-Code müsste da rein theoretisch besser laufen als aktuell bei Intel.

Nai schrieb:
2. Ein Programm bei einer Vektorinstruktion die SIMD-Lanes durch Predication deaktiviert?
Das geht so direkt nicht, zumindest nicht bis einschließlich AVX2. Predicated Execution lässt sich eigentlich nur sinnvoll simulieren, indem man mit einem vcmp-Befehl eine Bitmaske erzeugt und dann nachher die Ergebnisse damit verundet, um Unerwünschtes zu verwerfen - dabei werden die Einheiten selbst natürlich weiterhin genutzt.

AVX-512 hat AFAIK spezielle Selektorregister für solche Fälle, aber damit kenne ich mich nun gar nicht aus.

benneque schrieb:
Z.B. kann ich mir auch gut vorstellen, das aktuelle CPUs gar keine dedizierten Einheiten mehr für SSE haben,
Das ist auch richtig, SSE- und AVX-Befehle, die dasselbe tun, gehen auch alle in dieselben Pipelines. Würde sich ja nicht lohnen, dieselbe Hardware doppelt zu verbauen.

Was die CPU konkret tut, entscheidet sich ohnehin in den Decodern. Die Befehle
- vmulps ymm0, ymm0, ymm1 (AVX-256)
- vmulps xmm0, xmm0, xmm1 (AVX-128)
- mulps xmm0, xmm1 (SSE)
unterscheiden sich nur darin, wie die oberen 128 Bit verarbeitet werden.
 
Zuletzt bearbeitet:
Ok super danke.
Betriebsgeheimnis wäre auch schlecht. Irgendwie muss man den Leuten doch erzählen, wie man programmieren muss, um die eigene Architektur möglichst perfekt zu nutzen
Wäre toll, wenn es bei GPU-Herstellern auch so wäre. Bei NVIDIA gibt es deshalb einige Reverse-Engineering-Papers ;)
 
Zurück
Oben