如何使用 float16_t 声明卤化物 Func?

How do I use declare a halide Func with float16_t?

假设我想在图像的 x 轴上执行 运行 水平平均。

Func g;
g(x,y) = (img(x-1,y) + img(x,y) + img(x+1,y))/3.f;
h(x,y) = cast<uint8_t>(g(x,y) + 0.5f);

对 g(x,y) 使用 float32 似乎有点过头了,但我很在意 关于精度,所以整数除法不是首选。
我可以使用 float16_t 而不是 float32_t 来获得更高的吞吐量吗?

这样可以吗?

Expr three = <cast>(float16_t(3.f));
Expr point5 = <cast>float16_t(0.5f);
g(x,y) = (img(x-1,y) + img(x,y) + img(x+1,y))/three;
h(x,y) = cast<uint8_t>(g(x,y) + point5);

我将使用自动调度程序来完成这项工作。 似乎 avx2 必须能够并行处理 float16_t。如果以x86_64-sse4.1为目标生成这段代码会不会有问题?

avx2 上存在 float16 转换,但它实际上并没有并行执行 float16 数学运算,因此速度会很慢。我建议使用 uint16 来代替这种事情。对于您给出的代码,它实际上比使用浮点数更精确:

Func in16, g;
in16(x, y) = cast<uint16_t>(img(x, y));
g(x,y) = in16(x-1,y) + in16(x,y) + in16(x+1,y);
h(x,y) = cast<uint8_t>(g(x,y) + 1)/3);

除法运算将使用x86向量指令pmulhuw,所以会很快。