2015-03-04 15 views
5

Questa domanda è per le operazioni flottanti, operazioni prec. Singolo-prec con registri XMM/YMM su Haswell.Per le operazioni XMM/YMM FP su Intel Haswell, è possibile utilizzare FMA al posto di ADD?

Quindi, secondo il impressionante, impressionantetable messo insieme da Agner Fog, so che MUL può essere fatto su entrambi p0 porto e p1 (con recp thruput di 0,5), mentre solo aggiungere è fatto solo su porta p1 (con recp thruput di 1). Posso escludere questa limitazione, ma so anche che FMA può essere fatto su entrambe le porte p0 o p1 (con recp thruput di 0.5). Quindi è confuso per me il motivo per cui un ADD semplice sarebbe limitato a solo p1, quando FMA può usare p0 o p1 e fa sia ADD che MUL. Sto fraintendendo il tavolo? O qualcuno può spiegare perché sarebbe?

Cioè, se la mia lettura è corretta, perché Intel non dovrebbe usare FMA op come base sia per MUL semplice che per semplice ADD, aumentando così il thruput di ADD e MUL. In alternativa, cosa mi impedirebbe di utilizzare due operazioni FMA simultanee e indipendenti per emulare due OP opzionali simultanei e indipendenti? Quali sono le pene associate al fare ADD-by-FMA? Ovviamente, c'è un maggior numero di registri usati (2 reg per ADD vs 3 reg per ADD-by-FMA), ma a parte questo?

+2

speculazione pura: La FPU sulla porta-0 per Haswell può gestire solo le istruzioni 5-ciclo. Non ha una logica "early-out" che consente di gestire le istruzioni sia a 3 che a 5 cicli. FP-add è un'istruzione a 3 cicli, quindi non può entrare nella porta-0. – Mysticial

+0

Come aggiornamento da lungo tempo: Intel ha finito per utilizzare anche FMA per ADD, su Skylake. Skylake riduce la latenza FMA a 4 cicli. Questo sembra essere stato abbastanza un compromesso per loro di eliminare il FP-ADD dedicato a 3 cicli e inserirlo nell'hardware FMA a 4 cicli. Quindi ora abbiamo anche FP-ADD con due uscite. – Mysticial

risposta

5

Non sei l'unico confuso sul motivo per cui Intel ha fatto questo. Agner nebbia nel suo manuale micro-architecture scrive per Haswell:

È strano che c'è solo una porta per addizione in virgola mobile, ma due porte per floating point moltiplicazione.

A bordo del messaggio Agner he also writes

Ci sono due unità di esecuzione per floating point moltiplicazione e per fuso moltiplicazione e aggiungere, ma solo un'unità di esecuzione per floating point aggiunta. Questo disegno sembra non ottimale poiché il codice a virgola mobile contiene in genere più aggiunte che moltiplicazioni.

Quel thread continua con ulteriori informazioni sull'argomento che suggerisco di leggere ma non citerò qui.

si discute anche in questa risposta qui flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2

La latenza delle istruzioni FMA su Haswell è 5 e il volume è 2 per ciclo di clock. Ciò significa che devi mantenere 10 operazioni parallele per ottenere il massimo throughput. Se, ad esempio, si desidera aggiungere un elenco molto lungo di f.p. numeri, dovresti dividerlo in dieci parti e usare dieci registri di accumulatori.

Questo è possibile, ma chi potrebbe fare una così strana ottimizzazione per un processore specifico?

La sua risposta là fondamentalmente risponde alla tua domanda. È possibile utilizzare FMA per raddoppiare la velocità di aggiunta. In effetti lo faccio nei miei test di throughput per l'aggiunta e vedo che raddoppia.

In breve, per l'aggiunta, se il calcolo è legato alla latenza, non utilizzare FMA usare ADD. Ma se è legato al throughput puoi provare a usare FMA (impostando il moltiplicatore a 1.0) ma probabilmente dovrai usare molti registri AVX per farlo.

ho srotolate 10 volte per ottenere il massimo througput qui loop-unrolling-to-achieve-maximum-throughput-with-ivy-bridge-and-haswell

+0

"chi farebbe una così strana ottimizzazione per un processore specifico?" - Prime95 lo fa. E l'ho fatto anche io. Non è affatto difficile quando tutti i tuoi elementi intrinseci passano attraverso macro personalizzate. – Mysticial

+0

@Mysticial, sì, l'ho fatto anche per i miei test di velocità effettiva. Ma non l'ho ancora fatto per nessuna cosa utile. Immagino per il mio codice GEMM ma poi ho già srotolato 8x e passando da 8x a 10x a malapena fa la differenza. –

+0

Grazie per il feedback. Non ho visto il commento di Agner su questo problema. Ho solo studiato il suo tavolo. Darò un'occhiata alle sue altre note. Capisco il punto sulla latenza/tradeoff, anche se sto ancora imparando l'arte che gestisce i due. Ciò di cui ero più sicuro era se ci sarebbe stato un conflitto di porte non intuitivo o un errore di precisione. – codechimp

Problemi correlati