Combinando alcuni commenti in una risposta:
Altro che le prestazioni, hanno un comportamento identico (credo che anche con un argomento di memoria: stessa mancanza di requisiti di allineamento per tutte le istruzioni AVX).
Su Nehalem a Broadwell, (V)PXOR
può essere eseguito su una qualsiasi delle 3 porte di esecuzione ALU, p0/p1/p5. (V)XORPS/D
può essere eseguito solo su p5.
Alcune CPU hanno un "ritardo di bypass" tra integer e FP "domini". Agner Fog's microarch docs dire che su SnB/IvB, il ritardo di bypass è a volte zero. per esempio. quando si usa il tipo "sbagliato" di shuffle o operazione booleana. Su Haswell, i suoi esempi mostrano che orps
non ha latenza aggiuntiva quando viene utilizzato sul risultato di un'istruzione intera, ma che por
ha un 1 di latenza in più se utilizzato sul risultato di addps
.
Su Skylake, i booleani di FP possono essere eseguiti su qualsiasi porta, ma il ritardo di bypass dipende dalla porta su cui si sono verificati. (Vedi il manuale di ottimizzazione di Intel per un tavolo). Port5 non ha alcun ritardo di bypass tra le operazioni matematiche FP, ma la porta 0 o la porta 1 lo fanno. Poiché le unità FMA sono sulla porta 0 e 1, la fase di rilascio di uop di solito assegna i booleani a port5 nel codice pesante FP, perché può vedere che molti utenti sono accodati per p0/p1 ma p5 è meno occupato. (How are x86 uops scheduled, exactly?).
Consiglierei di non preoccuparsi di questo. Sintonizzatevi su Haswell e Skylake andrà bene. Oppure usa sempre VPXOR su dati interi e VXORPS su dati FP, e Skylake andrà bene (ma Haswell potrebbe non funzionare).
su AMD Bulldozer/Piledriver/Steamroller non esiste una versione "FP" dei ops booleani. (vedi pagina 182 del manuale microarch di Agner Fog.) C'è un ritardo per l'inoltro dei dati tra unità di esecuzione (di 1 ciclo per ivec-> fp o fp-> ivec, 10 cicli per int-> ivec (eax
->xmm0
), 8 cicli per ivec-> int. (8,10 su bulldozer., 4, 5 su steamroller per movd/pinsrw/pextrw)) Quindi, in ogni caso, non è possibile evitare il ritardo di bypass su AMD utilizzando l'appropriato suffisso booleano. XORPS
fa prendere uno meno byte per codificare di PXOR
o XORPD
(versione non VEX. Vex versioni tutti prendere 4 byte.)
In ogni caso, i ritardi di bypass sono solo latenza supplementare, non ridotta produttività. Se queste operazioni non fanno parte della catena di dep più lunga del ciclo interno o se è possibile interlacciare due iterazioni in parallelo (in modo da avere più catene di dipendenze che vanno contemporaneamente per l'esecuzione fuori ordine), allora PXOR
potrebbe essere la strada da percorrere
Su CPU Intel precedenti a Skylake, le istruzioni in formato intero possono sempre essere eseguite su più porte rispetto alle rispettive controparti in virgola mobile, quindi preferisci operazioni integer.
Sugli attuali processori Intel, l'unità SIMD ha due domini: INT e FLOAT. C'è una penalità di prestazioni per spostare i dati da uno all'altro. Il throughput è anche più alto nel dominio INT. – Mysticial
Grazie Mysticial! [Questa risposta] (http://stackoverflow.com/a/4998071/250827) afferma che Intel Sandy Bridge e le CPU successive hanno un "ritardo di bypass" di 0-1 cicli quando si utilizzano le istruzioni vettoriali con il tipo di dati errato – netvope
Nota anche che 'vxorpd' è AVX mentre' vpxor' è AVX2 (non che questo influenzi le prestazioni, ovviamente, solo la compatibilità). –