CUDA中的半精度浮点数

Dir*_*irk 6 opengl cuda

CUDA中有半精度浮点数吗?

背景:我想使用glTexSubImage3D操作一个opengl纹理,其中包含我使用CUDA生成的PBO中的数据.纹理以GL_INTENSITY16格式(这是半精度浮动类型afaik)存储,我不想使用glPixelTransferf(GL_x_SCALE,...)从整数值缩放,因为它没有缩放似乎更快.

有什么建议?

tal*_*ies 14

CUDA本身仅支持32位和64位浮点精度类型.

驱动程序和运行时API都支持绑定到半浮点纹理,但是内核中的结果读取将返回提升为32位浮点数的值.在CUDA标准库包括__half2float()__float2half_rn()功能一半和单精度浮点类型(存储在一个16位的整数的半浮动)之间的转换.因此,有可能在32位精度内核中进行操作,并使用16位类型进行读写操作.但对于本机16位浮点,我认为你运气不好.


编辑补充一点,在2015年,NVIDIA通过添加CUDA 7.5工具包half以及half2类型和内部函数来扩展半精度浮点支持.它还宣布(尚未发布)Pascal架构将支持符合IEE754-2008标准的硬件半精度操作.

  • 在纹理中存储半精度将节省带宽,即使计算是完整的32位.因此,如果您的应用程序完全受带宽约束,那么它可能是值得的. (8认同)
  • (-1)__ half2float _IS_"原生支持." 关键是__half2float是一个内在的(单周期,我很确定),而在SSE中它需要很多指令来做正确的事.事实上ALU是32位并不重要,一半可以让你节省内存和内存带宽. (2认同)