2014-11-15 4 views
9

Gemäß der Intel Intrinsics Guide,Differenz zwischen den Befehlen AVX vxorpd und vpxor

  • vxorpd ymm, ymm, ymm: Berechne die bitweise XOR von gepackten mit doppelter Genauigkeit (64 Bit) Gleitkommazahlen Elemente in A und B, und speichern die Ergebnisse in dst.
  • vpxor ymm, ymm, ymm: Berechnen Sie die bitweise XOR von 256 Bits (die Integer-Daten darstellt) in a und b, und speichern Sie das Ergebnis in dst.

Was ist der Unterschied zwischen den beiden? Es scheint mir, dass beide Anweisungen eine bitweise XOR-Operation an allen 256 Bits der Ymm-Register durchführen würden. Gibt es eine Leistungseinbuße, wenn ich vxorpd für Ganzzahldaten verwende (und umgekehrt)?

+8

Auf aktuellen Intel-Prozessoren hat die SIMD-Einheit zwei Domänen: INT und FLOAT. Es gibt eine Leistungseinbuße für das Verschieben von Daten von einem zum anderen. Der Durchsatz ist auch in der INT-Domäne höher. – Mysticial

+2

Danke Mystik! [Diese Antwort] (http://stackoverflow.com/a/4998071/250827) besagt, dass Intel Sandy Bridge und spätere CPUs eine "Umgehungsverzögerung" von 0-1 Zyklen haben, wenn Sie Vektoranweisungen mit dem falschen Datentyp – netvope

+4

verwenden auch dass "vxorpd" AVX ist, während "vpxor" AVX2 ist (nicht dass das die Leistung beeinflusst, sondern nur die Kompatibilität). –

Antwort

8

einige Kommentare in eine Antwort Kombination:

Andere als die Leistung, haben sie identisches Verhalten (ich glaube, sogar mit einem Speicher Argumente: gleicher Mangel an Ausrichtungsanforderungen für alle AVX Instruktionen).

Auf Nehalem nach Broadwell, (V)PXOR kann auf jedem der 3 ALU Ausführungsports, p0/p1/p5 laufen. (V)XORPS/D kann nur auf p5 laufen.

Einige CPUs haben eine "Bypass-Verzögerung" zwischen Integer- und FP- "Domänen". Agner Fog's microarch docs sagen, dass auf SnB/IvB, die Bypass-Verzögerung manchmal Null ist. z.B. wenn der "falsche" Typ der Shuffle- oder Booleschen Operation verwendet wird. Bei Haswell zeigen seine Beispiele, dass orps keine zusätzliche Latenz hat, wenn es für das Ergebnis einer Integer-Anweisung verwendet wird, aber dass por eine zusätzliche Latenzzeit von 1 aufweist, wenn es für das Ergebnis addps verwendet wird.

Auf Skylake können FP-Booleans auf jedem Port ausgeführt werden, die Bypass-Verzögerung hängt jedoch davon ab, auf welchem ​​Port sie ausgeführt wurden. (Siehe Intel Optimierungshandbuch für eine Tabelle). Port5 hat keine Umgehungsverzögerung zwischen FP-Mathematikoperationen, aber Port 0 oder Port 1 tun dies. Da die FMA-Einheiten an Port 0 und 1 sind, wird die UOP-Issue-Stufe in der Regel Port 5 in FP-Schwercode zuordnen, da sie sehen kann, dass viele Ups für p0/p1 in der Warteschlange sind, aber p5 weniger ausgelastet ist. (How are x86 uops scheduled, exactly?).

Ich würde empfehlen, sich nicht darüber zu sorgen. Tune für Haswell und Skylake geht es gut. Oder verwenden Sie VPXOR immer nur für ganzzahlige Daten und VXORPS für FP-Daten, und Skylake wird es gut machen (aber Haswell nicht).


Auf AMD Bulldozer/Piledriver/Steamroller gibt es keine "FP" -Version der Booleschen ops. (Siehe Seite 182 von Agner Fogs Mikroarchiv-Handbuch.) Es gibt eine Verzögerung für die Weiterleitung von Daten zwischen den Ausführungseinheiten (von 1 Zyklus für ivef-> fp oder fp-> ivec, 10 Zyklen für int-> ivec (eax ->xmm0), 8 Zyklen für ivec-> int. (8,10 auf Bulldozer. 4, 5 auf Steamroller für movd/pinsrw/pextrw)) Wie auch immer, Sie können die Umgehungsverzögerung von AMD nicht umgehen, indem Sie das entsprechende Boolean insn verwenden. XORPS macht man weniger Byte nehmen zu kodieren als PXOR oder XORPD (Nicht-VEX-Version. Vex Versionen nehmen alle 4 Bytes.)

In jedem Fall Bypass Verzögerungen sind nur zusätzliche Latenz, nicht reduziert Durchsatz. Wenn diese Ops nicht Teil der längsten Dep-Chain in Ihrer inneren Schleife sind oder wenn Sie zwei Iterationen parallel verschachteln können (sodass mehrere Dependency-Ketten gleichzeitig für Out-of-Order-Ausführung zur Verfügung stehen), dann PXOR der Weg, den man gehen sollte.

Auf Intel-CPUs vor Skylake können gepackte Integer-Anweisungen immer auf mehr Ports als ihre Gleitkomma-Entsprechungen ausgeführt werden, bevorzugen Sie also Integer-Ops.

Verwandte Themen