当我使用向量化调度选择一个带有constant_exterior()类型的边界条件时,我无法使用Halide生成OpenCL实现。
编译时,我收到以下错误:
Error:
Vector of bool not valid in OpenCL C (yet)
我不明白为什么需要使用布尔矢量..
我的功能看起来像这样:
void dummy_step()
{
Var x("x"), y("y"), c("c");
Func src("src");
Func dst("dst");
// input parameters
ImageParam image(UInt(8), 3, "inputImage");
Param<int> W;
Param<int> H;
// boundary condition
src = constant_exterior(image, 0, 0, W, 0, H);
Expr x0 = cast<int>(x + y);
Expr y0 = cast<int>(x - y);
dst(x, y, c) = cast<uint8_t>(clamp(src(x0, y0, c), 0.0f, 255.0f));
// scheduling
dst.vectorize(x, 4).gpu_tile(x, y, 16, 8).compute_root();
dst.compile_to_file("test", {image, W, H});
}
如果我删除.vectorize(x, 4)
,代码会编译。如果我使用另一个边界条件,让我们说,src = repeat_edge(image, 0, W, 0, H);
它也可以。
答案 0 :(得分:1)
constant_exterior检查向量中的每个x坐标是否在边界内,以便在常量外部值和内部值之间进行多路复用。这项检查的结果是布尔值的向量。 repeat_edge不需要进行检查 - 它可以直接使用最小和最大操作来夹紧坐标。
我建议不要使用如下的时间表来渲染这部分代码:
src.compute_at(dst, x);
dst.vectorize(x, 4).gpu_tile(x, y, 16, 8).compute_root();