Perché il chip Haswell di Intel consente alla moltiplicazione FP di essere due volte più veloce dell'aggiunta?


35

Stavo leggendo questa domanda molto interessante su Stack Overflow:

La moltiplicazione dei numeri interi viene realmente eseguita alla stessa velocità dell'aggiunta su una CPU moderna?

Uno dei commenti diceva:

"Non vale nulla che su Haswell, il throughput di moltiplicazione FP sia doppio rispetto a FP add. Questo perché entrambe le porte 0 e 1 possono essere utilizzate per moltiplicare, ma solo la porta 1 può essere utilizzata per l'aggiunta. Detto questo, puoi imbrogliare con -Multiply aggiunge poiché entrambe le porte possono eseguirle. "

Perché consentirebbero il doppio delle moltiplicazioni simultanee rispetto all'aggiunta?


3
Grazie @DKNguyen! Ma la moltiplicazione implica molta più elettronica dell'aggiunta (in effetti l'aggiunta è la fase finale della moltiplicazione, quindi qualsiasi circuito necessario per la moltiplicazione includerà anche tutto ciò che è necessario per l'aggiunta), quindi non vedo come possa occupare meno area della matrice!
user1271772

5
La moltiplicazione FP è aggiunta. Vedi logaritmi.
Janka,

9
@Janka Mentre la moltiplicazione FP richiede l'aggiunta degli esponenti, è ancora necessario moltiplicare effettivamente le mantisse. La mantissa memorizzata non è un logaritmo.
Elliot Alderson,

6
FWIW in Skylake il throughput della "pura aggiunta" è stato raddoppiato, quindi questa è una curiosità dell'era Haswell / Broadwell e non una sorta di cosa inerente.
Harold,

4
@ user1271772 sì, sono comunque le stesse porte: aggiunta sulle porte 0 e 1 e moltiplicazione anche sulle porte 0 e 1. Prima di Skylake solo la porta 1 poteva gestire la pura aggiunta. Ciò si estende anche ad alcune operazioni di tipo addizione, vale a dire min / max / confronta il µop di una conversione che esegue la conversione effettiva (spesso c'è anche un shuffle o carica µop)
harold

Risposte:


37

Questo probabilmente risponde al titolo della domanda, se non al corpo:

L'aggiunta in virgola mobile richiede l'allineamento delle due mantissa prima di aggiungerle (a seconda della differenza tra i due esponenti), che potenzialmente richiedono una grande quantità variabile di spostamento prima dell'addizionatore. Quindi potrebbe essere necessario rinormalizzare il risultato dell'aggiunta della mantissa, potenzialmente richiedendo un'altra grande quantità variabile di spostamento per formattare correttamente il risultato in virgola mobile. I due cambi di canna a mantissa richiedono quindi potenzialmente più ritardi di gate, maggiori ritardi di filo o cicli extra che superano il ritardo di un front-end moltiplicatore compatta carry-save-adder-tree.

Aggiunto per l'OP: si noti che l'aggiunta di lunghezze di 2 millimetri e 2 chilometri non è 4 di nessuna delle unità. Ciò è dovuto alla necessità di convertire l'una o l'altra misura nella stessa scala o rappresentazione dell'unità prima dell'aggiunta. Quella conversione richiede essenzialmente una moltiplicazione per un certo potere di 10. La stessa cosa di solito deve accadere durante l'aggiunta in virgola mobile, poiché i numeri in virgola mobile sono una forma di numeri interi con scala variabile (ad esempio c'è un'unità o un fattore di scala, un esponente, associato a ogni numero). Quindi potrebbe essere necessario ridimensionare uno dei numeri di una potenza di 2 prima di aggiungere bit di mantissa grezzi per avere entrambi le stesse unità o scala. Questo ridimensionamento è essenzialmente una semplice forma di moltiplicazione per una potenza di 2. Pertanto, l'aggiunta in virgola mobile richiede una moltiplicazione(che, essendo una potenza di 2, può essere fatto con uno spostamento di bit variabile o un cambio a barilotto, che può richiedere fili relativamente lunghi in relazione alle dimensioni del transistor, che può essere relativamente lento in circuiti di sub-micron-litografia profondi). Se i due numeri si annullano per lo più (perché l'uno è quasi negativo dell'altro), potrebbe essere necessario ridimensionare il risultato dell'aggiunta e formattare adeguatamente il risultato. Quindi l'aggiunta può essere lenta se richiede inoltre 2 moltiplicazioni (pre e post) che circondano l'aggiunta binaria di un numero fisso (finito) di bit di mantissa che rappresentano unità o scala equivalenti, a causa della natura del formato numerico (punto mobile IEEE) ).

Aggiunto n. 2: Inoltre, molti benchmark pesano FMACS (si moltiplica) più di quelli nudi. In un MAC fuso, l'allineamento (spostamento) dell'addend può spesso essere fatto principalmente in parallelo con il moltiplicare, e l'aggiunta della mantissa può essere spesso inclusa nell'albero CSA prima della propagazione del carry finale.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat . Eventuali conclusioni raggiunte dovrebbero essere ricondotte alla domanda e / o alle risposte.
Dave Tweed

3
Chiamo BS. Sicuramente la moltiplicazione effettiva in un'operazione di moltiplicazione FP non può essere più difficile di due turni di barile.
user253751

5
"più difficile", potenzialmente più veloce e che vale la pena ottimizzare, dati i vincoli e gli obiettivi del progetto, sono 4 cose diverse.
hotpaw2

3
@immibis: Prima di Haswell, le CPU Intel avevano 1 unità di aggiunta SIMD FP (latenza di 3 cicli) e 1 unità mul SIMDF FP (latenza di 5 cicli). Quindi aggiungere è più veloce di moltiplicare. (Ecco perché Haswell ha tenuto un'unità FP add separata quando ha aggiunto 2x unità FMA per fma e mul invece di eseguirla sull'unità FMA come fa SKL). Inoltre, i turni SIMD-int vengono eseguiti con 1c di latenza, rispetto a SIMD-int mul a 5c di latenza (con piggyback sul significato e sui moltiplicatori in un'unità FMA). Quindi sì, lo spostamento è molto più economico della moltiplicazione. Sia add che mul sono completamente pipeline, quindi entrambi hanno bisogno di un cambio barilotto separato per normalizzare l'uscita.
Peter Cordes,

22

Nella moltiplicazione FP, l'elaborazione dell'esponente si rivela essere un'aggiunta semplice (esattamente per lo stesso motivo per cui la moltiplicazione nel dominio di registro è semplicemente un'aggiunta). Mi sono imbattuto in logaritmi, spero.

Ora considera quanto sia difficile aggiungere due numeri in forma logaritmica ...

La virgola mobile abita in un'area grigia tra i domini lineare e log, con aspetti di entrambi. Ogni numero FP comprende una mantissa (che è lineare) e un esponente (logaritmico). Per determinare il significato di ciascun bit nella mantissa, devi prima guardare l'esponente (che è solo un fattore di scala).

Inoltre, l'elaborazione esponente nel caso generale richiede che il barilotto si sposti due volte nella mantissa, dove ogni spostamento del barilotto è effettivamente un caso speciale di una moltiplicazione leggermente semplificata.

(Il primo turno allinea entrambi gli ingressi alla stessa potenza di 2, in modo che un bit mantissa abbia lo stesso peso binario in ciascun operando.

Sarà sufficiente un esempio decimale (anche se ovviamente viene usato il binario) ...

(3103)+(110-1)=(3103)+(0.0001103)

Il secondo ridimensiona l'output ...

1100+(-0,999100)=0.001100=110-3

Paradossalmente, un'aggiunta FP comporta qualcosa di molto simile a due moltiplicazioni che devono essere eseguite in sequenza, con l'aggiunta di mantissa tra di loro. Alla luce di ciò, le prestazioni riportate non sono così sorprendenti.


8
Il "considera quanto sia difficile aggiungere due numeri in forma logaritmica" è stato piuttosto illuminante.
Peter - Ripristina Monica il

1
anche se fortunatamente, gli esponenti in virgola mobile sono solo numeri interi, quindi non è necessario aggiungere nulla come 1.3 + 2.3 = 2.34, è solo lo spostamento delle mantisse.
ilkkachu,

1
La ragione per cui puoi fare due moltiplicazioni per ciclo è perché ci sono due unità di moltiplicazione, non perché l'unità di moltiplicazione è più veloce dell'unità di addizione (vedi diagramma nella risposta di pjc50). Non puoi rispondere a questa domanda spiegando perché pensi che un'unità di addizione sia più lenta di un'unità di moltiplicazione. Oltre a ciò, altre risposte finora affermano che l'unità di addizione ha una latenza inferiore, suggerendo che l'addizione è l'operazione più semplice.
user253751

2
@immibis: la tua osservazione è corretta. Ma la domanda è sulla falsariga di "perché è così? Perché non ci sono due unità di addizione, dato che l'addizione è molto più semplice / economica di mpy?" Parte della risposta è: "in FP, non è davvero più semplice". Il resto si riduce all'economia: data la spesa effettiva e molto studio del carico di lavoro previsto, il secondo sommatore non ha giustificato il suo posto in silicio. Lascio le altre risposte per espandersi su quella parte.
Brian Drummond,

Alcuni scienziati informatici (ad esempio Kahan (architetto di IEEE754 FP) e Knuth) sostengono che "mantissa" è la parola sbagliata perché è lineare (non logaritmica). Il termine moderno preferito è significativo. en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22 . "mantissa" è una parola più bella con meno sillabe, però.
Peter Cordes,

16

TL: DR : poiché Intel riteneva che la latenza di aggiunta SSE / AVX FP fosse più importante della velocità effettiva, hanno scelto di non eseguirla sulle unità FMA di Haswell / Broadwell.


Haswell esegue moltiplicare FP (SIMD) sulle stesse unità di esecuzione di FMA ( Fused Multiply-Add ), di cui ne ha due perché alcuni codici ad alta intensità di FP possono utilizzare principalmente FMA per eseguire 2 FLOP per istruzione. Stessa latenza a 5 cicli di FMA e mulpsdelle precedenti CPU (Sandybridge / IvyBridge). Haswell voleva 2 unità FMA e non c'è alcun aspetto negativo nel far funzionare il moltiplicarsi perché hanno la stessa latenza dell'unità di moltiplicazione dedicata nelle CPU precedenti.

Ma mantiene l'unità SIMD FP dedicata delle CPU precedenti ancora funzionante addps/ addpdcon latenza di 3 cicli. Ho letto che il possibile ragionamento potrebbe essere quel codice che aggiunge molto FP aggiunge al collo di bottiglia la sua latenza, non il throughput. Questo è certamente vero per una somma ingenua di un array con un solo accumulatore (vettoriale), come spesso si ottiene dalla vettorializzazione automatica di GCC. Ma non so se Intel abbia confermato pubblicamente che era il loro ragionamento.

Broadwell è lo stesso ( ma ha accelerato mulps/ finomulpd a 3c di latenza mentre FMA è rimasto a 5c). Forse sono stati in grado di scorciatoia sull'unità FMA e ottenere il risultato moltiplicato prima di fare un'aggiunta fittizia 0.0, o forse qualcosa di completamente diverso ed è troppo semplicistico. BDW è principalmente una fustigazione di HSW con la maggior parte dei cambiamenti di lieve entità.

In Skylake tutto FP (inclusa l'aggiunta) funziona sull'unità FMA con latenza di 4 cicli e throughput 0,5c, tranne ovviamente div / sqrt e valori booleani bit a bit (ad es. Per valore assoluto o negazione). Apparentemente Intel ha deciso che non valeva la pena di aggiungere silicio per l'aggiunta di FP a latenza inferiore o che il addpsthroughput non bilanciato era problematico. Inoltre, la standardizzazione delle latenze rende più semplice evitare conflitti di riscrittura (quando 2 risultati sono pronti nello stesso ciclo) nella pianificazione superiore. cioè semplifica la programmazione e / o il completamento delle porte.

Quindi sì, Intel l'ha cambiata nella prossima prossima revisione di microarchitettura (Skylake). La riduzione della latenza FMA di 1 ciclo ha ridotto notevolmente i vantaggi di un'unità di aggiunta SIMD FP dedicata, per i casi che erano associati alla latenza.

Skylake mostra anche i segnali di Intel che si sta preparando per AVX512, dove l'estensione di un sommatore SIMD-FP separato a 512 bit di larghezza avrebbe richiesto un'area di die ancora maggiore. Skylake-X (con AVX512) ha un core quasi identico al normale client Skylake, ad eccezione della cache L2 più grande e (in alcuni modelli) un'unità FMA aggiuntiva a 512 bit "fissata" alla porta 5.

SKX arresta gli ALU SIMD della porta 1 quando i voli a 512 bit sono in volo, ma ha bisogno di un modo per eseguire vaddps xmm/ymm/zmmin qualsiasi momento. Ciò ha reso problematico avere un'unità FP ADD dedicata sulla porta 1 ed è una motivazione separata per il cambiamento dall'esecuzione del codice esistente.

Curiosità: tutto da Skylake, KabyLake, Coffee Lake e persino Cascade Lake sono stati identici dal punto di vista microarchitetturale a Skylake, ad eccezione di Cascade Lake che aggiunge alcune nuove istruzioni AVX512. IPC non è cambiato diversamente. Tuttavia, le CPU più recenti hanno iGPU migliori. Ice Lake (microarchitettura Sunny Cove) è la prima volta in diversi anni che vediamo una vera e propria nuova microarchitettura (tranne il mai diffuso Cannon Lake).


Gli argomenti basati sulla complessità di un'unità FMUL rispetto a un'unità FADD sono interessanti ma non rilevanti in questo caso . Un'unità FMA include tutto l'hardware di spostamento necessario per eseguire l'aggiunta FP come parte di un FMA 1 .

Nota: Non voglio dire la x87 fmulistruzioni, voglio dire uno SSE / AVX SIMD / FP scalare moltiplicare ALU che supporta 32-bit a precisione singola / floate 64-bit doubledi precisione (53 bit significando aka mantissa). ad esempio istruzioni come mulpso mulsd. L'effettivo x87 a 80 bit fmulè ancora solo 1 / clock throughput su Haswell, sulla porta 0.

Le moderne CPU hanno transistor più che sufficienti per lanciare problemi quando ne vale la pena e quando non causano problemi di ritardo nella propagazione a distanza fisica. Soprattutto per le unità di esecuzione che sono attive solo qualche volta. Vedi https://en.wikipedia.org/wiki/Dark_silicon e questo articolo della conferenza del 2011: Dark Silicon e the End of Multicore Scaling. Questo è ciò che consente alle CPU di avere un throughput massiccio di FPU e un throughput intero elevato, ma non entrambi allo stesso tempo (perché quelle diverse unità di esecuzione si trovano sulle stesse porte di invio in modo da competere tra loro). In un sacco di codice accuratamente sintonizzato che non si strozza con la larghezza di banda mem, non sono le unità di esecuzione back-end che sono il fattore limitante, ma piuttosto il throughput delle istruzioni front-end. (i core larghi sono molto costosi ). Vedi anche http://www.lighterra.com/papers/modernmicroprocessors/ .


Prima di Haswell

Prima di HSW , le CPU Intel come Nehalem e Sandybridge avevano SIMD FP moltiplicato sulla porta 0 e SIMD FP aggiunto sulla porta 1. Quindi c'erano unità di esecuzione separate e il throughput era bilanciato. ( https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-ma maximum- of-4- flops-per-cycle

Haswell ha introdotto il supporto FMA nelle CPU Intel (un paio di anni dopo che AMD ha introdotto FMA4 in Bulldozer, dopo che Intel li ha falsificati aspettando il più tardi possibile per rendere pubblico che avrebbero implementato FMA a 3 operandi, non 4 operando non -distruttiva destinazione FMA4). Curiosità: AMD Piledriver era ancora la prima CPU x86 con FMA3, circa un anno prima di Haswell nel giugno 2013

Ciò ha richiesto alcuni importanti hacking degli interni per supportare anche un singolo uop con 3 input. Ma comunque, Intel è andata all-in e ha approfittato dei transistor sempre più piccoli per inserire due unità FMA SIMD a 256 bit, rendendo Haswell (e i suoi successori) bestie per la matematica FP.

Un obiettivo prestazionale che Intel avrebbe potuto pensare era il denso BLAS matmul e il prodotto a punti vettoriali. Entrambi possono utilizzare principalmente FMA e non è necessario solo aggiungerlo.

Come ho accennato in precedenza, alcuni carichi di lavoro che eseguono principalmente o solo l'aggiunta di FP sono strozzati per aggiungere latenza, (per lo più) non throughput.


Nota 1 : e con un moltiplicatore di 1.0, FMA può letteralmente essere utilizzato per l'aggiunta, ma con una latenza peggiore di addpsun'istruzione. Ciò è potenzialmente utile per carichi di lavoro come la somma di un array caldo nella cache L1d, dove il throughput dell'aggiunta FP conta più della latenza. Ciò è utile solo se si utilizzano accumulatori vettoriali multipli per nascondere la latenza, ovviamente, e mantenere in volo 10 operazioni FMA nelle unità di esecuzione FP (latenza 5c / throughput 0,5c = latenza 10 operazioni * prodotto larghezza di banda). È necessario farlo anche quando si utilizza FMA per un prodotto a punti vettoriali .

Guarda David Kanter scrivere della microarchitettura di Sandybridge che ha uno schema a blocchi di quali UE si trovano su quale porta per la famiglia di bulldozer NHM, SnB e AMD. (Vedi anche le tabelle di istruzioni di Agner Fog e la guida al microarca di ottimizzazione asm, e anche https://uops.info/ che ha anche test sperimentali su uops, porte e latenza / throughput di quasi tutte le istruzioni su molte generazioni di microarchitetture Intel.)

Anche correlati: https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-ma maximum- of-4- flops-per - cycle


1
Nel caso in cui vi state chiedendo circa se prendere la mia parola per questo: su Stack Overflow, ho distintivi d'oro tra cui [cpu-architecture], [performance], [x86-64], [assembly], e [sse]. Ho scritto una risposta sul codice C ++ per testare la congettura di Collatz più velocemente dell'assemblaggio scritto a mano - perché? che molte persone pensano sia buono. Anche questo sull'esecuzione pipeline di OoO.
Peter Cordes,

"BDW è principalmente un restringimento di HSW con la maggior parte dei cambiamenti minori." Sembra che abbiano intenzionalmente lasciato alcune ottimizzazioni annullate al primo giro, probabilmente per motivi finanziari.
jpaugh

2
@jpaugh: vedi en.wikipedia.org/wiki/Tick%E2%80%93tock_model - Il piano di Intel dal 2006 circa (fino a quando non hanno raggiunto un blocco su 10nm) è stato ridotto in un nuovo processo con altre piccole modifiche, quindi nuova architettura sul processo già testato. Ricorda che lo sviluppo è in cantiere da anni con più progetti futuri in volo: non ne terminano uno prima di iniziare il successivo. Broadwell era sempre pensato per essere solo un "segno di spunta" prima del "tock" di Skylake che sfruttava appieno il loro processo di produzione a 14 nm e non doveva preoccuparsi del debug del processo, solo della progettazione
Peter Cordes,

Apprezzo il link. In sostanza, hai fatto eco al mio sentimento, sebbene con molta più precisione di quella che avrei potuto raccogliere.
jpaugh

8

Esaminerò questa parte:
"Perché dovrebbero permettere " ...
TL; DR - perché l'hanno progettata in quel modo. È una decisione di gestione. Sicuramente ci sono risposte di mantissa e mosse, ma queste sono cose che vanno nella decisione della direzione.

Perché l'hanno progettato in questo modo? La risposta è che le specifiche sono fatte per raggiungere determinati obiettivi. Tali obiettivi includono prestazioni e costi. Le prestazioni non sono orientate verso le operazioni, piuttosto come un punto di riferimento come FLOPS o FPS in Crysis.
Questi benchmark avranno un mix di funzioni, alcune delle quali possono essere elaborate contemporaneamente.
Se i progettisti pensano che avere due funzioni del widget A lo rende molto più veloce, piuttosto che due funzioni del widget B, allora andranno con il widget A. L'implementazione di due di A e due di B costerà di più.

Guardando indietro quando le pipeline superscalari e super (prima del multi-core) sono diventate comuni sui chip commerciali, queste erano lì per aumentare le prestazioni. Il Pentium ha due pipe e nessun vettore si unisce. Haswell ha più pipe, unità vettoriali, una pipe più profonda, funzioni dedicate e altro ancora. Perché non ci sono due di tutto? Perché l'hanno progettato in questo modo.


Un obiettivo prestazionale più rilevante potrebbe essere il matmul denso BLAS e il prodotto punto vettoriale. Entrambi possono utilizzare principalmente FMA e non è necessario solo aggiungerlo.
Peter Cordes,

Non ho mai visto prodotto denso BLAS matmul e punti vettoriali su una confezione di prodotti. Non li ho visti negli spot pubblicitari. Non li ho visti in una recensione del prodotto. (Certo che sono importanti, ma l'ingegneria segue la gestione, la gestione segue il marketing, il marketing segue le vendite. Le vendite vengono acquistate da persone normali.
MikeP

1
Ho visto recensioni di CPU che includono benchmark come Linpack. Tuttavia, come dici tu (massimo teorico), FLOPS viene pubblicizzato, e questo è fondamentalmente un proxy per le prestazioni matmul se la cache può tenere il passo. Non sono sicuro che alcuni benchmark SPECfp si avvicinino alla saturazione di entrambe le unità FMA su HSW o SKL, ma i benchmark SPEC contano molto. Non tutte le vendite sono vendite singole al dettaglio; alcuni sono acquirenti sofisticati come acquirenti di cluster di supercomputer che decidono quando eseguire l'aggiornamento o server farm aziendali. I margini sono più alti anche su quelle vendite, penso.
Peter Cordes,

6

Questo diagramma di Intel può aiutare:

Panoramica dell'unità di esecuzione Haswell

Sembra che abbiano dato ad ogni unità un FMA (moltiplicato-aggiunto fuso), nonché un moltiplicatore e un singolo sommatore. Possono o meno condividere l'hardware sottostante.

Alla domanda sul perché è molto più difficile rispondere senza razionalità progettuali interne, ma il testo nella casella viola ci dà un suggerimento con "doppi picchi FLOP": il processore punterà su una serie di parametri di riferimento, derivati ​​da casi d'uso reali. L'FMA è molto popolare in questi poiché è l'unità base della moltiplicazione di matrici. L'aggiunta nuda è meno popolare.

Come è stato sottolineato, è possibile utilizzare entrambe le porte per eseguire l'aggiunta mediante un'istruzione FMA in cui il parametro di moltiplicazione è 1, calcolo (A x 1) + B. Questo sarà leggermente più lento di un'aggiunta nuda.


FP Moltiplica funziona sull'unità FMA. L'aggiunta FP viene eseguita con una latenza inferiore sull'unità di aggiunta FP SIMD dedicata solo sulla porta 1. È possibile che condivida alcuni transistor con l'unità FMA su quella porta, ma da quello che ho letto ho avuto l'impressione che ci sia bisogno di un'area extra significativa per fornire questo.
Peter Cordes,

ha pubblicato una risposta con maggiori dettagli.
Peter Cordes,

4

Diamo un'occhiata ai passaggi che richiedono tempo:

Aggiunta: Allineare gli esponenti (potrebbe essere un'operazione di spostamento di massa). Un sommatore a 53 bit. Normalizzazione (fino a 53 bit).

Moltiplicazione: una massiccia rete di sommatori per ridurre 53 x 53 prodotti a un bit alla somma di due numeri da 106 bit. Un sommatore a 106 bit. Normalizzazione. Direi che ridurre i prodotti bit a due numeri può essere fatto più velocemente del sommatore finale.

Se riesci a rendere il tempo variabile di moltiplicazione, allora hai il vantaggio che la normalizzazione si sposterà solo di un bit per la maggior parte del tempo e puoi rilevare gli altri casi molto rapidamente (input denormalizzati o il sume degli esponenti è troppo piccolo).

Inoltre, è molto comune richiedere passaggi di normalizzazione (aggiunta di numeri non uguali, sottrazione di numeri vicini). Quindi, per la moltiplicazione, puoi permetterti di avere un percorso veloce e fare un duro colpo per il percorso lento; per di più non puoi.

PS. Leggere i commenti: ha senso che l'aggiunta di numeri denormalizzati non comporti una penalità: significa solo che tra i bit che vengono spostati per allineare gli esponenti, molti sono zero. E il risultato denormalizzato significa che smetti di spostare per rimuovere gli zeri iniziali se ciò renderebbe l'esponente troppo piccolo.


Le CPU Intel infatti gestiscono la moltiplicazione subnormale (input o output) tramite un microcode assist; cioè la FPU normale segnala un'eccezione invece di avere una fase aggiuntiva della pipeline per questo caso. Agner Fog dice ri: Sandybridge Nei miei test, i casi di underflow e numeri denormali sono stati gestiti alla stessa velocità dei normali numeri in virgola mobile per l'aggiunta, ma non per la moltiplicazione. Questo è il motivo per cui la compilazione con i -ffast-mathset FTZ / DAZ (azzera denormali a zero) per farlo invece di prendere un FP assist.
Peter Cordes,

Nella guida al microarch di Agner , afferma che c'è sempre una penalità quando le operazioni con input normali producono un output non normale. Ma l'aggiunta di un normale + subnormale non ha penalità. In tal modo la revisione di riepilogo potrebbe essere inaccurata o la guida di Uarch non è precisa. Agner afferma che Knight's Landing (Xeon Phi) non ha penalità per eventuali subnormali su mul / add, solo divisione. Ma KNL ha una latenza più alta add / mul / FMA (6c) rispetto al mainstream Haswell (5c) / SKL (4c). È interessante notare che AMD Ryzen ha una penalità di pochi cicli, contro una grande penalità sulla famiglia Bulldozer.
Peter Cordes,

Per impostazione predefinita, le GPU riguardano il throughput, non la latenza, quindi in genere hanno una latenza fissa per tutti i casi, anche per i subnormali. Il trapping al microcodice probabilmente non è nemmeno un'opzione per una pipeline a ossa nude come quella.
Peter Cordes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.