0

我正在尝试使用卤化物进行一些模板计算。所以假设一个基本的 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)

当我运行此代码时,我收到以下错误:

错误:输入缓冲区 b0 在 -1 处访问,在维度 0 中的最小值 (0) 之前已中止(核心转储)

根据我的理解,这个错误的原因是 select 语句评估了这两个语句,所以即使我不想计算 i 和 j 小于 2 的任何值,该函数在 i = 0 和 j = 0 时进行评估,因此无效的地址访问。

那么在Halide中有没有这样做呢?if/else 语句还有其他等价物吗?

4

1 回答 1

2

使用边界条件将做你想要的: 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 构造的哪个方向更有可能。

于 2016-10-03T18:15:36.243 回答