Domanda

So che x87 ha una maggiore precisione interna, che è probabilmente la più grande differenza che la gente vede tra esso e le operazioni di SSE. Ma mi chiedo, c'è qualche altro vantaggio di utilizzare x87? Ho l'abitudine di digitare automaticamente -mfpmath=sse in ogni progetto, e mi chiedo se mi manca niente altro che la FPU x87 offre.

È stato utile?

Soluzione

Per asm scritto a mano, x87 ha alcune istruzioni che non esistono nel set di istruzioni SSE.

Al largo della parte superiore della mia testa, è tutta roba trigonometriche come FSIN, FCOS, FATAN, fatan2 e alcune cose esponenziale / logaritmo.

Con gcc -O3 -ffast-math -mfpmath=387, GCC9 sin(x) ancora effettivamente in linea come istruzione fsin, indipendentemente da ciò che l'attuazione in libm avrebbe usato. ( https://godbolt.org/z/Euc5gp ).

MSVC chiama __libm_sse2_sin_precise quando si compila per 32-bit x86.


Se il codice passa la maggior parte del tempo facendo trigonometria, è possibile vedere un leggero guadagno di prestazioni o la perdita se si utilizza x87, a seconda che l'implementazione di matematica-libreria standard utilizzando SSE1 / SSE2 è più veloce o più lento rispetto alla lenta microcodice per fsin su qualunque CPU si sta utilizzando.

fornitori per CPU non mettere un sacco di sforzo in ottimizzazione del microcodice per le istruzioni x87 nelle nuove generazioni di CPU poiché è generalmente considerato obsoleto e raramente utilizzato. (Guarda conta UOP e il throughput per le istruzioni x87 complessi in tabelle di istruzioni del Agner Fog nelle ultime generazioni di CPU: più cicli che in vecchie CPU). Il più recente alla CPU, più è probabile x87 sarà più lento rispetto a molte istruzioni SSE o AVX per calcolare log, exp, pow, o funzioni trigonometriche.

Anche quando x87 è disponibile, non tutte le librerie matematiche scelgono di utilizzare istruzioni complesse come fsin per funzioni come sin(), o soprattutto exp attuazione / log dove trucchi interi per manipolare le FP bit-pattern basato su log sono utili.

Alcuni algoritmi DSP utilizzano un sacco di trigonometria, ma in genere beneficiano di un molto da auto-vettorizzazione con librerie matematiche SIMD.

Tuttavia, per la matematica-codice in cui si spende la maggior parte del vostro tempo facendo addizioni, moltiplicazioni ecc SSE è solitamente più veloce.


Anche in relazione: Intel sottovaluta Errore Bounds dell'1,3 quintillion - il caso peggiore per fsin (cancellazione catastrofico per gli ingressi fsin molto vicino pi ) è molto cattivo. Il software può fare meglio, ma solo con le tecniche di lenti esteso precisione.

Altri suggerimenti

  1. E 'presente sul proprio vecchie macchine.

EOF

FPU istruzioni sono più piccoli di istruzioni SSE, in modo che siano l'ideale per roba demoscene

  • V'è una notevole eredità e la compatibilità del sistema con la piccola x87: SSE è una relativamente nuova funzionalità del processore. Se il codice è quello di eseguire su un microcontrollore integrato, c'è una buona probabilità che non sosterrà istruzioni SSE.

  • Anche i sistemi che non dispongono di una FPU installato spesso fornire emulatori 80x87 che renderanno il codice run in modo trasparente (più o meno). Non so di eventuali emulatori-SSE certamente uno dei miei sistemi non ha, in modo che i nuovi Adobe Photoshop Elements versioni rifiutare di eseguire.

  • Le istruzioni 80x87 hanno buone caratteristiche di funzionamento in parallelo, che sono stati accuratamente esplorati e analizzati dalla sua introduzione nel 1982 o giù di lì. Diversi cloni del x86 potrebbero stallo su un istruzioni SSE.

La conversione tra float e double è più veloce con x87 (di solito gratuito) che con SSE. Con x87, è possibile caricare e memorizzare un float, double o long double da o verso la pila registro e viene convertito da o per la precisione estesa, senza costi aggiuntivi. Con SSE, ulteriori istruzioni sono tenuti a fare la conversione di tipo se tipi sono misti, poiché i registri contengono valori float o double. Queste istruzioni di conversione sono abbastanza veloce, ma fanno prendere tempo in più.

La vera soluzione è quella di astenersi da miscelazione float e double eccessivamente, non usare x87, naturalmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top