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.
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
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
verwenden auch dass "vxorpd" AVX ist, während "vpxor" AVX2 ist (nicht dass das die Leistung beeinflusst, sondern nur die Kompatibilität). –