Halide select 语句的问题

Issues with Halide select statement

我正在尝试使用 Halide 进行一些模板计算。因此,假设一个基本的 5 点 2D 模板,要评估单元格 i、j 的某个值,我需要 i-1、j i-2、j、i+1、j i+2、j 的值。现在这在 C++ 中的工作方式是我有一个 for 语句:

for(int i = 2; i < max_i - 2; i++)
for(int j = 2; j < max_j - 2; j++)
Calculate out = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j))

现在我正尝试对 Halide 做同样的事情。所以我有一个 Buffer 调用,它与 C++ 代码中的输入数组具有相同的值。我有一个 Func 调用:

out(i,j) = select(i >= 2 && j >= 2, some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) ,0.0f)

当我 运行 此代码时,出现以下错误:

Error: Input buffer b0 is accessed at -1, which is before the min (0) in dimension 0 Aborted (core dumped)

根据我的理解,出现此错误的原因是 select 语句对两个语句都求值,因此即使我不想为小于 2 的 i 和 j 值计算任何值,该函数的求值时间为i = 0 和 j = 0,因此地址访问无效。

那么在 Halide 中有没有办法做到这一点? if/else 语句是否有其他等效项?

使用边界条件会做你想做的事: Func unbounded; unbounded(i, j,) = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)); out(i, j) = BoundaryConditions::constant_exterior(unbounded, 0.0f, 2, width - 4, 2, height - 4)(i, j);

我相信你可以使用 "Expr()" 而不是 "width - 4" 或 "height - 4" 如果你想要最大的无限。

使用 if BoundaryConditions 函数可以提示编译器 if/else 构造的哪个方向更有可能。