2009-09-18 19 views
7

Sono interessato all'implementazione di un algoritmo sulla GPU utilizzando HLSL, ma una delle mie preoccupazioni principali è che mi piacerebbe un livello di precisione variabile. Ci sono tecniche là fuori per emulare precisione a 64 bit e superiori che potrebbero essere implementate sulla GPU.matematica di alta precisione su GPU

Grazie!

risposta

10

Le GPU stanno appena iniziando a supportare la precisione doppia nell'hardware, sebbene nel prossimo futuro continui a essere molto più lento della precisione singola. Ci sono una grande varietà di tecniche che sono state sviluppate nel corso degli anni per sintetizzare un punto di virgola mobile ad alta precisione usando una rappresentazione composta da più float in qualunque precisione abbia un supporto hardware veloce, ma il sovraccarico è piuttosto consistente. IIRC, il manuale di crlibm ha una buona discussione di alcune di queste tecniche, con analisi degli errori e pseudocodice (CRLIBM li usa per rappresentare i numeri come più di un valore a doppia precisione, ma le stesse tecniche possono essere usate con un singolo)

Senza sapere di più su cosa stai cercando di fare, è difficile dare una risposta migliore. Per alcuni algoritmi, solo una piccola parte del calcolo richiede un'elevata precisione; se ti trovi in ​​un caso del genere, potrebbe essere possibile ottenere prestazioni decenti sulla GPU, anche se il codice non sarà necessariamente molto carino o facile da usare. Se hai bisogno di alta precisione in modo pervasivo in tutto l'algoritmo, allora la GPU probabilmente non è un'opzione interessante per te al momento.

Infine, perché HLSL e non un linguaggio orientato al calcolo come CUDA o OpenCL?

+0

Il codice sarà destinato all'elaborazione di sistemi frattali iterati, pertanto è necessario disporre di un'elevata precisione coerente. Sto cercando un aumento delle prestazioni rispetto all'elaborazione su una CPU. E per quanto riguarda CUDA e OpenCL, ho più familiarità con HLSL atm. Anche se sto pensando di farlo in CUDA. Mi sono dilettato in CUDA prima, ma non posso dire di essere un esperto. – Mark

+2

Se è necessaria un'elevata precisione in modo coerente, è probabile che al momento non sia possibile battere codice ben scritto in esecuzione sulla CPU. Probabilmente il tuo tempo è meglio speso nell'esecuzione di profili sulla CPU e nelle prestazioni di ottimizzazione. –

+0

Non è che scrivere codice GPGPU non valga la pena per i propri meriti, solo che si vuole davvero scegliere qualcosa in cui non si stia tentando di far fare all'hardware qualcosa a cui non è stato progettato. –

0

L'SDK Stream di ATI supporta della precisione doppia nativa, ma non è HLSL.

Le catture sono che:

  • non tutte le GPU hanno doppia hardware di precisione, solo le carte di fascia superiore come HD 4870
  • non tutte le operazioni di doppia precisione sono disponibili. Ad esempio, nessuna istruzione di divisione.

OpenCL supporterà la doppia precisione come estensione, ma è ancora in beta.

+0

OpenCL non è in beta; alcune implementazioni individuali delle specifiche sono in versione beta, ma OpenCL è uno standard, non un'implementazione specifica. C'è anche un'implementazione non beta per OSX in SnowLeopard. –

+0

@stephentyrone. Hai ragione. Ma per quanto ne so, tutte le * implementazioni * di OpenCL che supportano la doppia precisione * sulla GPU * (non la CPU) sono ancora in fase di sviluppo. Non ho conoscenza di prima mano di ciò che è e non è supportato nello SnowLeopard. Se sono disinformato, per favore pubblica i dettagli. –

5

Utilizzando due float (vale a dire valori di precisione singoli), è possibile ottenere circa 56 bit di precisione. Questo approccio si avvicina alla precisione di un doppio, ma molte delle operazioni che è possibile implementare per questo tipo di dati "doppio singolo" sono lente e sono meno precise rispetto all'utilizzo del doppio. Tuttavia, per semplici operazioni aritmetiche, di solito sono sufficienti.

Questo paper parla un po 'dell'idea e descrive come implementare l'operazione di moltiplicazione. Per un elenco più completo delle operazioni che è possibile eseguire e su come implementarle, consulta il pacchetto DSFUN90 here. Il pacchetto è scritto in Fortran 90, ma può essere tradotto in tutto ciò che ha numeri di precisione singoli. Essere consapevoli però che è necessario librarsi in licenza da loro per usarlo a fini commerciali. Credo che l'applicazione demo Mersenne-Twister CUDA abbia implementazioni anche per operazioni di addizione e moltiplicazione.

+0

Non vedo nulla di simile a questo nella demo di Mersenne Twister SDK in CUDA 4.2+. –

2

Questa è una risposta un po 'off-topic, ma se volete vedere come il problema sta per essere influenzato cambiando alcune operazioni per l'aritmetica a precisione singola, si dovrebbe pensare di utilizzare intervallo di aritmetica per misurare empiricamente la confini di incertezza quando mischi la precisione in vari modi.Boost ha una libreria aritmetica a intervalli che una volta ho usato per strumentare un codice scientifico C++ esistente: era abbastanza facile da usare.

Ma attenzione: l'aritmetica degli intervalli è notoriamente pessimista: ad esempio, a volte esagera i limiti. L'aritmetica affine dovrebbe essere migliore, ma non ho mai trovato una libreria utilizzabile per questo.

Problemi correlati