CUDA中是否存在半精度浮点数?
背景:我想使用glTexSubImage3D操作一个opengl纹理,其中包含我使用CUDA生成的PBO中的数据。纹理以GL_INTENSITY16格式存储(这是半精度浮动类型afaik),我不想使用glPixelTransferf(GL_x_SCALE,...)从整数值缩放,因为它似乎比没有缩放更快。
有什么建议吗?
答案 0 :(得分:14)
CUDA本身仅支持32位和64位浮点精度类型。
驱动程序和运行时API都支持绑定到半浮点纹理,但内核中的结果读取将返回提升为32位浮点数的值。 CUDA标准库包括__half2float()
和__float2half_rn()
函数,用于在半精度浮点类型和单精度浮点类型之间进行转换(半浮点存储在16位整数中)。因此,有可能在32位精度内核中进行操作,并使用16位类型进行读写操作。但对于本机16位浮点,我认为你运气不好。
EDIT补充说,在2015年,NVIDIA通过添加half
和half2
类型和内部函数来扩展半精度浮点支持与CUDA 7.5工具包,以处理它们。它还宣布(尚未发布)Pascal架构将支持符合IEE754-2008标准的半精度硬件操作。