AVX2 ha un sacco di cose buone. Ad esempio, ha un sacco di istruzioni che sono praticamente molto più potenti dei loro precursori. Take VPERMD
: consente di trasmettere/shuffle/permute totalmente arbitrariamente da un vettore a 256 bit di valori a 32 bit in un altro, con la permutazione selezionabile in fase di esecuzione . Funzionalmente, questo obsoleto ha un gran numero di vecchie disimballare, trasmettere, permutare, shuffle e spostare le istruzioni esistenti .Dove si trova VPERMB in AVX2?
Fagioli freschi.
Quindi dove è VPERMB
? I.e, la stessa istruzione, ma lavorando su elementi di dimensioni in byte. O, per quello, dove è VPERMW
, per elementi a 16 bit? Avendo dilettato in assembly x86 per un po 'di tempo, è abbastanza chiaro che l'istruzione SSE PSHUFB
è praticamente tra le istruzioni più utili di tutti i tempi. Può fare qualsiasi permutazione, trasmissione o shuffle byte-saggio. Inoltre, può anche essere utilizzato per eseguire 16 ricerche di tabelle parallele a 4 bit -> 8 bit .
Sfortunatamente, PSHUFB
non è stato esteso per essere cross-lane in AVX2, quindi è limitato al comportamento all'interno della corsia. Le istruzioni VPERM
sono in grado di eseguire il cross shuffle (infatti, "perm" e "shuf" sembrano essere sinonimi nell'istruzione mnemonica?) - ma le versioni a 8 e 16 bit sono state omesse?
Non sembra nemmeno un buon modo per emulare questa istruzione, mentre è possibile emulare facilmente le mescolanze di larghezza maggiore con quelle di larghezza minore (spesso è addirittura gratuito: è sufficiente una maschera diversa).
Non ho alcun dubbio sul fatto che Intel sia consapevole dell'ampio e pesante utilizzo di PSHUFB
, quindi la domanda sorge spontanea sul motivo per cui la variante di byte è stata omessa in AVX2. L'operazione è intrinsecamente più difficile da implementare nell'hardware? Ci sono restrizioni di codifica che impongono la sua omissione?
Con selezionabile in fase di esecuzione, che significa che la maschera che definisce il comportamento rimescolamento proviene da un registro. Ciò rende l'istruzione di un ordine di grandezza più flessibile rispetto alle varianti precedenti che richiedono una maschera shuffle immediata, nello stesso modo in cui lo add
è più flessibile dello inc
o uno spostamento variabile è più flessibile di uno spostamento immediato.
Oppure 32 tali ricerche in AVX2.
Le istruzioni precedenti sono occasionalmente utili se hanno una codifica più breve o evitano il caricamento di una maschera dalla memoria, ma funzionalmente vengono sostituite.
s/babble/dabble /? Inoltre, un buon termine per "selezionabile in fase di esecuzione" è "variabile shuffle". Le istruzioni di spostamento variabile (come ['vpsrlvd'] (http://www.felixcloutier.com/x86/VPSRLVD:VPSRLVQ.html)) usano già questa terminologia. –
Sì, * dabble *, anche se le chiacchiere hanno un senso anche di tanto in tanto. Non sono sicuro di "variabile". Vedo che il cambiamento è quasi ortogonale al problema "immediato o meno". Il problema era che non si potevano emettere differenti conteggi di spostamento per elementi vettoriali diversi. Un po 'come se il vettore 'add' consentisse solo l'aggiunta di un singolo valore a tutti gli elementi. Questo è diverso dal fatto che l'argomento possa essere specificato solo come immediato. Certo, il passaggio è un po 'speciale perché la maggior parte non ha nemmeno quel problema, bit è la mia impressione di ciò che Intel intende con "variabile" lì. – BeeOnRope
Oh, buon punto, si potrebbe già avere il conteggio dei turni per tutti gli elementi nel low64 di un reg xmm. Comunque penso che "variable shuffle" sia immediatamente ovvio senza spiegazione, dato un po 'di contesto. –