2013-03-20 25 views
8

Có chức năng thiết bị nào trong CUDA để nhận các giá trị đặc biệt IEEE 754 như inf, NaN không? Tôi có nghĩa là cách ổn định, không phải bởi một số ops toán học mà có thể được tối ưu hóa bởi trình biên dịch.Cách lấy các giá trị đặc biệt của dấu phẩy động trong CUDA?

Tôi chỉ quản lý để tìm chức năng thiết bị được gọi là nan() phải lấy một số đối số chuỗi không xác định.

Trả lời

16

Làm thế nào về CUDART_NAN (kép) và CUDART_NAN_F (float) quy định tại /usr/local/cuda/include/math_constants.h:

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

và:

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

Rất cám ơn, đó là chính xác những gì tôi đang tìm kiếm. – user0002128

+3

Hàm nan() mà bạn tìm thấy trong CUDA là hàm nan() theo quy định của tiêu chuẩn ISO C99. Tôi tin rằng cùng một chức năng bây giờ là một phần của C++ 11. Lưu ý rằng phiên bản chính xác kép của hàm toán học chuẩn này sẽ chậm hơn rất nhiều so với sử dụng giải pháp mà Robert đã chỉ ra, vì nó cần phân tích đối số chuỗi để xây dựng giá trị số của NaN. Phiên bản chính xác đơn, nanf(), rất nhanh vì NVIDIA GPU chỉ hỗ trợ một chuẩn chính xác đơn NaN, vì vậy đó là những gì mà hàm trả về. – njuffa

0

CUDA hiện nay có sự hướng dẫn nanf trong thư viện toán học.

thiết bị nanf float (const char * tagp)

Returns "NaN"