我是使用Halide的新手,我正在尝试先实现算法。我正在尝试编写一个函数,根据它周围的8个像素的值,跳过下一个像素或进行一些处理,然后移动到下一个像素。在尝试编写时,我得到以下编译器错误:
84:5:错误:'Halide :: Expr'类型的值不能在上下文中转换为'bool'
if(input(x,y) > 0)
我已经完成了所有教程,并且已经看到select函数是一个选项,但有没有办法比较函数的值或将它们存储在某个地方?
我也可能认为这个问题错了,或者可能没有用正确的“Halide心态”来实现它,所以任何建议都会很棒。提前感谢您的一切!
答案 0 :(得分:5)
这里的根本问题是,虽然它们在语法上是交错的,而Halide代码是通过运行C ++代码构建的,但Halide代码不是C ++代码,反之亦然。 Halide代码完全由您在Funcs中构建的Halide :: *数据结构定义。 if是C控制流构造;您可以使用它来有条件地构建不同的Halide程序,但是您不能在里面使用Halide程序的逻辑(在Expr / Func中)。 select是Halide(有条件地评估为两个值中的一个的Expr),如果/是C(有条件地执行两个子语句之一的语句)。
请放心,你很难在早期遇到这种混乱。我想写一篇专门讲解如何思考Halide中的分阶段编程的教程。
在此之前,简短的“我怎么做我想要的”答案就像你怀疑的那样,而Khouri指出:使用选择。
答案 1 :(得分:3)
由于您没有提供除一行以外的任何代码,我假设input
是Func
,而x
和y
都是{{1} }秒。如果是,则Var
的结果为input(x,y)
,您无法使用Expr
进行评估,如错误消息所示。
对于您描述的场景,您可能会遇到以下情况:
if
在Halide工作肯定需要不同的心态。你必须以更加数学的形式思考。也就是说,Var x, y;
Func input; input(x,y) = ...;
Func output; output(x,y) = select
// examine surrounding values
( input(x-1,y-1) > 0
&& input(x+0,y-1) > 0
&& ...
&& input(x+1,y+1) > 0
// true case
, ( input(x-1,y-1)
+ input(x+0,y-1)
+ ...
+ input(x+1,y+1)
) / 8
// false case
, input(x,y)
);
和a(x,y) = b(x,y)
的所有情况都会强制执行x
声明。
算法和调度应该是分开的,尽管可能需要调整算法以允许更好的调度。