2013-03-20 22 views
8

Czy istnieją jakieś funkcje urządzenia w CUDA, aby uzyskać specjalne wartości IEEE 754, takie jak inf, NaN? Mam na myśli stabilny sposób, a nie niektóre operacje matematyczne, które mogą być zoptymalizowane przez kompilatory.Sposób uzyskania specjalnych wartości zmiennoprzecinkowych w CUDA?

Udaje mi się tylko znaleźć funkcję urządzenia o nazwie nan(), która musi przyjąć nieznany ciąg znaków.

Odpowiedz

16

Jak o CUDART_NAN (podwójne) i CUDART_NAN_F (float) zdefiniowane w /usr/local/cuda/include/math_constants.h:

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

oraz:

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

Wielkie dzięki, to dokładnie to, czego szukam. – user0002128

+3

Funkcja nan() znaleziona w CUDA to funkcja nan() określona przez normę ISO C99. Wierzę, że ta sama funkcja jest teraz częścią C++ 11. Zauważ, że wersja podwójnej precyzji tej standardowej funkcji matematycznej będzie dużo wolniejsza niż przy użyciu rozwiązania wskazanego przez Roberta, ponieważ musi przeanalizować argument łańcuchowy, aby skonstruować wartość liczbową NaN. Wersja pojedynczej precyzji, nanf(), jest bardzo szybka, ponieważ procesory graficzne NVIDIA obsługują tylko jedno kanoniczne, jedno-precyzyjne NaN, więc to właśnie zwraca funkcja. – njuffa

0

CUDA ma teraz dyspozycję nanf matematyki w bibliotece.

urządzenie pływak nanf (const char * tagp)

Returns "NaN" 
Powiązane problemy