【问题标题】:Implementing half precision floating point data type in OpenCL kernel在 OpenCL 内核中实现半精度浮点数据类型
【发布时间】:2019-01-19 13:21:28
【问题描述】:

我的 OpenCL 设备不支持扩展 cl_khr_fp16,我需要使用两字节浮点数据类型而不是四字节来节省内存(私有和本地内存)。

有什么方法可以手动实现半精度浮点数据类型,例如使用:

my_half x[1024]={0};
//.. later in my code
x[0]=float_to_half(0.5f*0.3f);

谢谢

【问题讨论】:

  • 如果您知道浮点数的二进制内存布局与 32 位 int 的“字节序”相同,那么您可以使用 <math.h> 中的 ldexp()frexp() 的组合来制作你的 float_to_halfhalf_to_float 函数。如果没有,您可以使用上述方法以及额外的比例将二进制点放在您想要的位置,然后转换为(short)。需要注意负值、零值和超出范围的值。
  • 可以使用包含两个 chars 的类来使用一些魔法,但我怀疑这是否值得

标签: c++ c parallel-processing kernel opencl


【解决方案1】:

cl_khr_fp16 扩展增加了对半标量和向量类型作为内置类型的支持,可用于算术运算、转换等。

即使没有那个扩展,你仍然可以在缓冲区和图像中存储一半类型,并在读取时转换为(常规)浮点数,在写入时从浮点数转换(然后执行你的数学使用浮点数)。对于缓冲区,使用从指向一半的指针加载和存储到指向一半的指针(使用 vload_half、vload_halfn、vloada_halfn 和 vstore_half、vstore_halfn、vstorea_halfn 函数)。对于图像,使用 CL_HALF_FLOAT 类型和 read_imagef/write_imagef。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2019-11-10
    • 2012-06-25
    • 2020-02-03
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多