如何将 16 位浮点数(cl halfs)传递到 .cl 文件中的 OpenCL 内核? 我的 .cl 文件中有:
__kernel void func(__global half* a, __global half* b, __global half* res){
int i = get_global_id(0);
res[i] = a[i] - b[i];
}
我想在 C 文件中传递 a 和 b 并将它们视为浮点值。 我尝试使用 cl_half,但它是一个无符号短整型,所以类似于:
cl_half aData[1];
aData[0] = -0.005;
实际上不起作用,因为 aData[0] 会四舍五入为 0。 怎样做才是正确的呢?
在 GPU 方面,在 OpenCL C 中,您将数字威胁为
half
,这部分是正确的。 OpenCL C 支持 half
数据类型及其算术。不过,最好使用 half2
向量类型,因为只有这样你才能获得 2 倍 FP16 的 GPU 算术吞吐量。
在 CPU 方面,您将数字视为
unsigned short
(这就是 cl_half
的本质),因为它们的大小只有 16 位,并且 C/C++ 中没有 half
数据类型。您不能只将 32 位 FP32 文字(如 -0.005f
)写入其中,因为它们将被转换为 16 位整数。您需要适当的float
<->half
转换。然后,写数字:
typedef unsigned short ushort;
ushort aData[1];
aData[0] = float_to_half(-0.005f);
再次读取数据:
float result = half_to_float(aData[0]);
请注意,在 CPU 上,不支持使用
ushort
/cl_half
进行算术运算,并且您始终必须先将数字转换为 float
。