0

当我选择带有矢量化调度的 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);它也有效。

4

1 回答 1

1

constant_exterior 检查向量中的每个 x 坐标是否在边界内,以便在常量外部值和内部值之间进行复用。此检查的结果是一个布尔向量。repeat_edge 不需要做那个检查——它可以直接使用 min 和 max 操作来固定坐标。

我建议不要使用这样的时间表对这部分代码进行矢量化:

    src.compute_at(dst, x);
    dst.vectorize(x, 4).gpu_tile(x, y, 16, 8).compute_root();
于 2015-10-07T22:02:51.330 回答