Halide:在OpenCL

时间:2015-10-07 21:24:01

标签: opencl scheduling halide

当我使用向量化调度选择一个带有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);它也可以。

1 个答案:

答案 0 :(得分:1)

constant_exterior检查向量中的每个x坐标是否在边界内,以便在常量外部值和内部值之间进行多路复用。这项检查的结果是布尔值的向量。 repeat_edge不需要进行检查 - 它可以直接使用最小和最大操作来夹紧坐标。

我建议不要使用如下的时间表来渲染这部分代码:

    src.compute_at(dst, x);
    dst.vectorize(x, 4).gpu_tile(x, y, 16, 8).compute_root();