2013-03-20 19 views
8

Esiste qualche funzione del dispositivo in CUDA per ottenere valori speciali IEEE 754 come inf, NaN? Intendo il modo stabile, non con alcune operazioni matematiche che potrebbero essere ottimizzate dai compilatori.Modo per ottenere valori speciali a virgola mobile in CUDA?

Sono riuscito a trovare solo una funzione di dispositivo chiamata nan() che deve accettare un argomento di stringa sconosciuto.

risposta

16

Come su CUDART_NAN (doppio) e CUDART_NAN_F (float) definita in /usr/local/cuda/include/math_constants.h:

#define CUDART_NAN_F   __int_as_float(0x7fffffff) 
#define CUDART_NAN    __longlong_as_double(0xfff8000000000000ULL) 

e:

#define CUDART_INF_F   __int_as_float(0x7f800000) 
#define CUDART_INF    __longlong_as_double(0x7ff0000000000000ULL) 
+0

Molte grazie, questo è esattamente quello che sto cercando. – user0002128

+3

La funzione nan() che hai trovato in CUDA è la funzione nan() come specificato dallo standard ISO C99. Credo che la stessa funzione sia ora parte di C++ 11. Si noti che la versione a doppia precisione di questa funzione matematica standard sarà molto più lenta dell'utilizzo della soluzione indicata da Robert, poiché deve analizzare un argomento stringa per costruire il valore numerico del NaN. La versione single-precision, nanf(), è molto veloce poiché le GPU NVIDIA supportano solo un NaN canonico a precisione singola, quindi è ciò che restituisce la funzione. – njuffa

0

CUDA ha ora l'istruzione nanf nella libreria matematica.

dispositivo galleggiante nanf (const char * TAGP)

Returns "NaN" 
Problemi correlati