OpenCL 16 位浮点数

问题描述 投票:0回答:1

如何将 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。 怎样做才是正确的呢?

c opencl
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.