2016-06-23 36 views
11

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.

+0

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. –

+0

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

+0

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. –

risposta

10

Sono sicuro al 99% che il fattore principale è il costo di implementazione del transistor. Sarebbe chiaramente molto utile, e l'unica ragione per cui non esiste è che il costo di implementazione deve superare il vantaggio significativo.

I problemi relativi allo spazio di codifica sono improbabili; lo spazio di codifica VEX offre molto spazio. Come, davvero molto, dal momento che il campo che rappresenta le combinazioni di prefissi non è un campo di bit, è un intero con la maggior parte dei valori inutilizzati.

Hanno deciso di implementarlo per AVX512VBMI, tuttavia, con elementi di dimensioni maggiori disponibili in AVX512BW e AVX512F. Forse si sono resi conto di quanto ha fatto schifo non averlo e hanno deciso di farlo comunque.AVX512F impiega molto spazio/transistor da implementare, tanto che Intel ha deciso di non implementarlo nemmeno nelle CPU desktop retail for a couple generations.

(in parte penso che oggigiorno un sacco di codice che può trarre vantaggio da set di istruzioni nuovi di zecca sia scritto per essere eseguito su server noti, invece di dispacciamento in runtime per l'utilizzo su macchine client).

Secondo Wikipedia, AVX512VBMI non arriva fino a Cannonlake, ma avremo vpermi2b, che esegue 64 ricerche di tabelle parallele da una tabella 128B (2 vettori zmm)). Skylake Xeon porterà solo vpermi2w e dimensioni di elementi più grandi (AVX512F + AVX512BW).


Sono abbastanza sicuro che trentadue 32: 1 muxer sono molto più costosi di quelli di otto 8: 1 muxer, anche se gli 8: 1 muxer sono 4x più ampio. Potrebbero implementarlo con più fasi di mescolamento (piuttosto che con un singolo stadio 32: 1), dal momento che gli shuffle di attraversamento di corsie ricevono un budget di 3 cicli per portare a termine il loro lavoro. Ma ancora molti transistor.

Mi piacerebbe vedere una risposta meno ondulata da qualcuno con esperienza di progettazione hardware. Ho costruito un timer digitale da chip contatore TTL su una breadboard una volta (e IIRC, ho letto il contatore da BASIC su un TI-99/4A che era molto obsoleto anche ~ 20 anni fa), ma questo è tutto.


E 'abbastanza chiaro che lo SSE PSHUFB istruzione è più o meno tra le istruzioni più utili di tutti i tempi.

Sì. Era la prima variabile shuffle, con una maschera di controllo da un registro invece che da un immediato. Cercare una maschera shuffle da una LUT di maschere shuffle basate su un risultato pcmpeqb/pmovmskb può fare cose pazze e potenti. @stgatilov's IPv4 dotted-quad -> int converter è uno dei miei esempi preferiti di fantastici trucchi SIMD.

+0

A metà della tua risposta, stavo per dire "Ok, certo - ma cosa direbbe un ragazzo dell'hardware?" - ma poi è quello che hai detto :). Immagino che i mux abbiano un sacco di transistor, ma dal momento che PSHUFB è già lì, in effetti hai già 32x 16: 1 muxer. Quindi sembra che fare la ricerca aggiuntiva a un bit e la fusione dovrebbe essere abbastanza facile nel budget a 3 cicli. La maggior parte delle macchine a corsia incrociata è probabilmente anche lì a causa dell'attuale traversata a corsia incrociata. La mia esperienza di progettazione hardware nel mondo reale è quasi alla pari con la tua. – BeeOnRope

+1

A proposito di vpermi2b, una volta ho pensato che questa fantastica istruzione sarebbe arrivata presto in AVX512F, ma ora sembra che non l'avremo prima di AVX512VBMI.Non ho idea di quando arriverà quell'estensione. Tuttavia, alcune delle forme più deboli appaiono nelle estensioni F e BW. – BeeOnRope

+0

@BeeOnRope: dannazione, anche questo mi è sfuggito. Wikipedia dice che è in programma per Cannonlake. Ho pensato che fosse in AVX512BW, in arrivo a Skylake Purley. Ma hai ragione, e anche 'vpermb' è AVX512VBMI. Sono ancora deluso dal fatto che i core SKL con marchio Xeon non abbiano l'AVX512, che è quello che speravo. Sono solo gli Xeon molto più costosi che lo supporteranno, il che fa schifo per un desktop a casa conveniente :( –