2014-11-15 10 views
9

Secondo la Intel Intrinsics Guide,differenza tra l'istruzioni vxorpd AVX e vpxor

  • vxorpd ymm, ymm, ymm: Calcolare il XOR bit a bit di imballato doppia precisione (64 bit) elementi a virgola mobile in A e B, e memorizzare il risultati in dst.
  • vpxor ymm, ymm, ymm: Calcola lo XOR bit a bit di 256 bit (che rappresenta i dati di intero) in a e b, e memorizza il risultato in dst.

Qual è la differenza tra i due? Mi sembra che entrambe le istruzioni eseguano un XOR bit a bit su tutti i 256 bit dei registri ymm. C'è una penalità di prestazioni se utilizzo vxorpd per i dati interi (e viceversa)?

+8

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

+2

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

+4

Nota anche che 'vxorpd' è AVX mentre' vpxor' è AVX2 (non che questo influenzi le prestazioni, ovviamente, solo la compatibilità). –

risposta

8

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.