当尝试运行下面的示例代码(类似于查找表)时,它总是生成以下错误消息:“函数'out'的纯定义在维度0中以无限制方式调用函数'color'”
RDom r(0, 10, 0, 10);
Func label, color, out;
Var x,y,c;
label(x,y) = 0;
label(r.x,r.y) = 1;
color(c) = 0;
color(label(r.x,r.y)) = 255;
out(x,y) = color(label(x,y));
out.realize(10,10);
在致电实现之前,我试图静态设置绑定,如下所示,但没有成功。
color.bound(c,0,10);
label.bound(x,0,10).bound(y,0,10);
out.bound(x,0,10).bound(y,0,10);
我也查看了直方图示例,但它们有点不同。
这是Halide中的某种限制吗?
答案 0 :(得分:1)
Halide通过分析作为Func参数传递的值的范围来防止任何越界访问(并决定要计算的内容)。如果这些值无限制,则无法做到这一点。使它们受限制的方法是使用clamp:
out(x, y) = color(clamp(label(x, y), 0, 9));
在这种情况下,它无界的原因是标签有更新定义,这使分析放弃。如果你写了这样的标签:
label(x, y) = select(x >= 0 && x < 10 && y >= 0 && y < 10, 1, 0);
然后你不需要夹子。