我正在尝试使用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)
当我运行此代码时,我收到以下错误:
错误: 输入缓冲区b0在-1处访问,该位于维度0中的min(0)之前 中止(核心倾销)
根据我的理解,这个错误的原因是select语句计算两个语句,所以尽管我不想计算i和j值小于2的任何东西,但是在i = 0和j =时计算函数0因此无效地址访问。
那么无论如何要在Halide做到这一点? if / else语句还有其他等价物吗?
答案 0 :(得分: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);
我相信你可以使用&#34; Expr()&#34;而不是&#34;宽度 - 4&#34;或者&#34;身高 - 4&#34;如果你想要最大的无限制。
如果使用BoundaryConditions函数,则允许暗示编译器if / else结构的哪个方向更有可能。