Precisione in virgola mobile singola o doppia


13

I numeri in virgola mobile a precisione singola occupano metà della memoria e su macchine moderne (anche su GPU sembra) le operazioni possono essere eseguite con loro a quasi il doppio della velocità rispetto alla doppia precisione. Molti codici FDTD che ho trovato utilizzano esclusivamente l'aritmetica e la memorizzazione a precisione singola. Esiste una regola empirica di quando è accettabile usare la precisione singola per risolvere sistemi di equazioni sparse su larga scala? Presumo che debba dipendere fortemente dal numero di condizione della matrice.

Inoltre, esiste una tecnica efficace che utilizza la doppia precisione laddove necessario e unica dove non è richiesta la precisione del doppio. Ad esempio, penso che per una moltiplicazione di matrici vettoriali o un prodotto a punti vettoriali, potrebbe essere una buona idea accumulare i risultati in una variabile a doppia precisione (per evitare errori di annullamento), ma che le singole voci vengano moltiplicate tra loro può essere moltiplicato usando una precisione singola.

Le moderne FPU consentono la conversione da precisione singola (float) a precisione doppia (doppia) e viceversa? O sono queste operazioni costose?

Risposte:


7

Per tutti i problemi non banali (vale a dire, per quelli in cui le prestazioni contano) quasi tutta la memoria che hai sarà nella matrice e relativamente piccola nei vettori. Ad esempio, per gli elementi 3d di Taylor-Hood per l'equazione di Stokes, ci sono alcune centinaia di elementi per riga nella matrice, e questo supera di gran lunga la quantità di memoria necessaria per i vettori. Abbiamo quindi giocato con l'idea di memorizzare la matrice come float e i vettori come double. Non ricordo i nostri risultati di temporizzazione, ma so per certo che non abbiamo riscontrato problemi con arrotondamenti ecc. Quindi questo approccio funziona sicuramente.


Grazie, Prof. Bangerth. Che dire dei risolutori di matrice iterativi? Passi alla doppia precisione per i prodotti a matrice vettoriale o riduci gli elementi vettoriali a singolo per i moltiplicatori e fai il backup a doppio per l'accumulo?
Costis,

Stavo ovviamente parlando di solutori iterativi. Facciamo tutti i vettori in doppia precisione (perché non importa), quindi l'operazione dst = matrix src avviene come double = float double. L'accumulo avviene quindi in doppia precisione, ma sarei davvero molto sorpreso se importasse affatto.
Wolfgang Bangerth,

C'è un documento là fuori da qualche parte (forse risalente a 2 decenni fa) che indica che i prodotti a punti dovrebbero essere fatti con una precisione superiore alla doppia. Non ho il riferimento a portata di mano, ma vedrò se riesco a trovarlo più tardi.
Bill Barth,

Sì, non mi sorprenderebbe. Ciò corrisponde anche a ciò che facciamo.
Wolfgang Bangerth,

Usi la precisione quad per i prodotti dot? Se è così, fico! Non avevo sentito che qualcuno lo stesse facendo in una biblioteca.
Bill Barth,


3

Il mio consiglio sarebbe di concentrarmi principalmente sul consumo di memoria per decidere quando usare la precisione singola (float). Quindi i dati di massa per un calcolo FDTD dovrebbero usare float, ma manterrei la descrizione del problema stessa (come geometria, parametri del materiale, condizioni di eccitazione) e tutti i metadati correlati in doppio.

Terrei doppiamente tutte le prestazioni non critiche e non analizzate a fondo. Soprattutto, terrei i dati poligonali e altre descrizioni della geometria in doppio (forse anche interi se possibile), poiché l'esperienza dice che non otterrai mai le parti geometriche computazionali del tuo codice completamente robuste, anche se sarebbe possibile in teoria.

Una terza parte che terrei in doppio sono i calcoli analitici, comprese le scorciatoie che utilizzano decomposizioni di autovalori non simmetriche. Ad esempio, ho una funzione 2D simmetrica rotazionale definita a tratti e ho bisogno della sua trasformata di Fourier. Ci sarebbero vari modi numerici che coinvolgono FFT e appropriati "filtri analitici passa-basso" per ottenerlo "in modo efficiente". Poiché le sue prestazioni non sono critiche, ho usato invece un'espressione analitica "esatta" che coinvolge le funzioni di Bessel. Dato che questa era una scorciatoia per cominciare, e non passerò il tempo ad analizzare la propagazione dell'errore della mia formula complicata, farò meglio a usare la doppia precisione per quel calcolo. (Si è ancora scoperto che erano utilizzabili solo alcune delle espressioni analitiche equivalenti per la formula,

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.