Meriti relativi del calcolo a virgola fissa rispetto a virgola mobile?


9

Ho un sistema di elaborazione del segnale digitale che funziona su una macchina x86 veloce usando numeri in virgola mobile a precisione doppia . Mi è venuto in mente che non sto davvero utilizzando l'enorme gamma dinamica della rappresentazione in virgola mobile: tutte le quantità si adattano facilmente all'intervallo ± 32768.

La mia domanda: è possibile che il passaggio a calcoli a punto fisso fornirebbe un vantaggio in termini di precisione numerica (alta priorità) o tempo di calcolo (bassa priorità)?

Naturalmente, la risposta dipende da quanti bit sono disponibili per un calcolo a virgola fissa. Quanti bit di precisione utilizzano i tipici sistemi a virgola fissa? È possibile eseguire in modo efficiente calcoli a punto fisso con, diciamo, 64 bit ( parte intera a 16 bit, parte frazionaria a 48 bit ) su x86-64?

Ho sempre pensato che i calcoli a punto fisso fossero usati solo in situazioni in cui la potenza della CPU è limitata - ha senso usare calcoli a punto fisso quando la potenza della CPU non è un problema?


Hai davvero bisogno di più delle ~ 15 cifre significative che ti offre un valore in virgola mobile a precisione doppia? Mentre le generalizzazioni generali sono sbagliate, direi che se guardassi l'aggregato di tutti i sistemi DSP a punto fisso, è probabile che i numeri interi a 16 bit siano il formato più comune.
Jason R,

Risposte:


7

L'accuratezza numerica degli interi sarà migliore dell'accuratezza numerica dei float se la risoluzione dell'intero è migliore. I doppi hanno 52 bit frazionari, quindi i float a doppia precisione hanno una risoluzione peggiore degli interi a circa , che è molto più grande di 32768 ( ). Quindi, no, l'accuratezza numerica non sarà migliore se si passa a numeri interi. 2 15252215

Il secondo problema è la velocità. La risposta è: dipende dall'hardware. Se stai eseguendo il tuo programma su un processore di segnale digitale che ha moltiplicare / accumulare più punti fissi, allora sì, sarà molto più veloce in punto fisso. Su un chip x86, invece, sarà probabilmente più lento in virgola fissa. Ho fatto esattamente quello di cui stai parlando una volta e ho visto aumentare i miei tempi di esecuzione.

Dopo aver fatto alcune ricerche su Internet ho scoperto che è comune. Il motivo è perché ha un processore a virgola mobile dedicato che non fa nulla quando si passa al punto fisso, mentre l'hardware a punto fisso è condiviso con la normale azione a punto fisso, come l'aritmetica del puntatore.

Se si desidera accelerare l'elaborazione, il modo per farlo è passare da float a doppia precisione a float a precisione singola. Ciò dovrebbe produrre un aumento significativo della velocità. Ciò, ovviamente, ridurrebbe la tua precisione numerica.


Intendevo dire cosa dice questa risposta quando ho scritto la mia. Questo è migliore. Se non sbaglio, ho anche letto da qualche parte che su alcuni computer (forse 64 bit?) Il tipo di virgola mobile hardware nativo è doppio, quindi l'utilizzo di float a precisione singola (quattro byte) potrebbe effettivamente essere più lento. Questo è qualcosa da prendere in considerazione, comunque.
heltonbiker,

I float di precisione singola hanno mantisse a 23 bit, i doppi hanno 52 bit.
Paolo R,

Sto suggerendo un numero intero di 16 bit + una frazione di 48 bit in alternativa al virgola mobile a precisione doppia. Ho citato 32768 per indicare che i miei valori si adatteranno facilmente a questo intervallo. Data la restrizione a questi valori, penso che Q16.48 fornirebbe una maggiore precisione numerica rispetto alla virgola mobile a doppia precisione.
nibot,

1
@nibot Ok. I doppi avrebbero una migliore precisione da -16 a +16 e gli interi frazionari avrebbero una migliore precisione altrove fino a -32769 e +32768. Non potevano, ovviamente, rappresentare nulla al di là di questo. Sarebbero anche più lenti dei doppi. Per me la gamma limitata e la bassa velocità sarebbero un grosso problema, ma YMMV.
Jim Clay,

6

I vantaggi del punto fisso sono principalmente in termini di potenza (come quando si ha una scelta di hardware del processore, o il processore è bravo a spegnere le unità funzionali inutilizzate). Questo perché le unità a virgola fissa sono generalmente più piccole (meno transistor, fili più corti, meno capacità da superare per MAC) per una data tecnologia e velocità di emissione operativa rispetto a virgola mobile.

Tuttavia, una grande quantità di comuni processori contemporanei (server, PC e persino mobili), hanno FPU più e più veloci (specialmente unità FP a precisione singola) rispetto ai moltiplicatori interi e la maggior parte della potenza del sistema non proviene dall'uso della FPU, quindi utilizzando -point avrà pochi o nessun vantaggio per il tipico calcolo DSP su questi prodotti e può probabilmente essere uno svantaggio in termini di prestazioni pure. Usando la tecnologia attuale, qualsiasi vantaggio sul punto fisso si accumulerà principalmente in piccoli prodotti integrati, come i dispositivi di dimensioni pulsanti.

Tuttavia, considerare anche le impronte della cache della memoria e del processore. L'uso intelligente di tipi di dati più piccoli (short int e float) per adattarsi completamente a un calcolo di grandi dimensioni nella cache dei dati può compensare qualsiasi vantaggio della larghezza di banda della FPU pura.


2
+1 per la menzione dell'importanza dei problemi di cache rispetto alle prestazioni. Sui moderni processori x86, la progettazione dell'algoritmo tenendo presente la cache può avere un impatto enorme sulle prestazioni.
Jason R,

5

Preferisci raddoppiare i singoli float di precisione: ciò ridurrà la larghezza di banda della memoria, il footprint della cache e i requisiti di archiviazione e renderà più veloci alcune operazioni matematiche. Inoltre apre la possibilità di SIMD a 4 vie se è necessaria un'ulteriore ottimizzazione.

Il punto fisso è davvero utile solo quando non si dispone di una FPU: la maggior parte delle moderne CPU x86 ha due FPU, quindi non è possibile ottenere nulla dall'uso del punto fisso e le prestazioni possono anche essere significativamente peggiori con il punto fisso. (Notare anche che il punto fisso richiede istruzioni aggiuntive rispetto al punto mobile per operazioni come la moltiplicazione.)


Sono interessato ad aumentare la precisione numerica, non a ridurla.
nibot,

Come vedi il punto fisso migliorare l'accuratezza numerica rispetto a un doppio, che ha già 52 bit di precisione e una vasta gamma dinamica?
Paolo R

Bene, potrei usare un formato a virgola fissa con più di 52 bit.
nibot

Dal momento che apparentemente hai bisogno di almeno 16 bit per la parte intera della rappresentazione in virgola fissa, questo ti porterà ben oltre 64 bit, quindi probabilmente stai guardando un formato per il quale la tua CPU non ha nemmeno istruzioni per numeri interi nativi. Nel qual caso potresti anche usare una libreria di interi di grandi dimensioni esistente o simile. La domanda più importante a cui rispondere è però: quanta precisione hai davvero bisogno ?
Paolo R

3

Oltre alle ottime risposte fornite qui, alcune cose che vale la pena aggiungere:

  • Ci sono situazioni in cui anche se hai requisiti di base sulla gamma dinamica dei dati che elabori, avrai comunque bisogno di un'ottima precisione per alcune delle operazioni eseguite su di esso - ad esempio vorrai applicare un filtro IIR che richiede coefficienti relativamente piccoli; e troncandoli causerebbe instabilità. Non appena il tuo sistema ha un feedback, c'è una buona probabilità che problemi di quantizzazione / troncamento ti mordano quando usi un punto fisso - devi essere molto più attento a cose come la topologia del filtro e gli schemi di troncamento / risparmio di frazioni.
  • A differenza di molte architetture DSP / DSC, x86 non ha operazioni intere sature (beh, è ​​lì in SSE, non su codice scalare standard). Ciò significa che in caso di overflow possono accadere cose brutte: valori che cambiano segno e "avvolgono". Devi essere molto cauto con overflow e range dinamico, oppure cospargere i test sugli intervalli di operandiin tutto il tuo codice. Questo può danneggiare seriamente le prestazioni. In confronto, il virgola mobile è più resistente a questi problemi, perché l'ampia gamma dinamica offre più "margine di manovra" e gli overflow non porteranno a guasti catastrofici. La maggior parte del codice di elaborazione del segnale audio in esecuzione su computer desktop utilizza l'intervallo -1.0 .. 1.0, precisione singola o doppia; quindi questo dà più di centinaia di dB di headroom. Ho scritto un codice di elaborazione del segnale audio con entrambi gli approcci e quando uso il virgola mobile ci sono solo alcuni punti in cui devo tagliare / saturare esplicitamente il segnale, di solito proprio alla fine della catena di elaborazione del segnale o in luoghi in cui si verifica il feedback.

1

Alcuni punti da considerare:

  • La maggior parte dei processori moderni ha ottimizzato lo scricchiolio dei numeri in virgola mobile per molti anni, e anche le GPU vengono utilizzate per questo già, con molto successo;
  • I calcoli in virgola fissa danneggiano i dati e possono causare seri problemi quando le operazioni aritmetiche non sono ben condizionate (ecco perché i numeri in virgola fissa sono stati sostituiti da numeri in virgola mobile);
  • Anche se utilizzi short firmati per CONTENERE i tuoi dati (molti datalogger usano una precisione a 16 bit), i CALCOLI devono essere eseguiti in virgola mobile e poi convertiti in numeri interi, altrimenti potrebbero esserci artefatti come la quantizzazione e l'aliasing.

Come ultima parola, penso che i nostri dati del mondo reale siano preziosi e che il cieco scricchiolio del computer sia un'umile opera umile. Il computer deve essere messo a fare il lavoro pesante per i tuoi dati e per te, e non essere trattato come se fosse la vera star dello spettacolo.


Non intendevo implicare che avrei usato i cortometraggi a 16 bit per contenere le mie quantità, ma piuttosto qualcosa come un formato a virgola fissa a 64 bit con una parte intera a 16 bit e una parte frazionaria a 48 bit. La motivazione è che, se non sto usando la maggior parte dei bit esponenti nel formato a virgola mobile, la mia precisione numerica migliorerebbe se invece utilizzassi quei bit per fornire cifre significative aggiuntive?
nibot

215

Ancora una cosa: mi sembra che StackOverflow (invece di DSP.SE, qui) sarebbe il luogo ideale per ottenere ragioni più profonde su pro e contro di un formato rispetto all'altro.
heltonbiker,
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.