Halide :: Expr'在上下文中无法转换为'bool' - 在变量

时间:2016-06-09 18:26:22

标签: halide

我是使用Halide的新手,我正在尝试先实现算法。我正在尝试编写一个函数,根据它周围的8个像素的值,跳过下一个像素或进行一些处理,然后移动到下一个像素。在尝试编写时,我得到以下编译器错误:

84:5:错误:'Halide :: Expr'类型的值不能在上下文中转换为'bool'

    if(input(x,y) > 0)

我已经完成了所有教程,并且已经看到select函数是一个选项,但有没有办法比较函数的值或将它们存储在某个地方?

我也可能认为这个问题错了,或者可能没有用正确的“Halide心态”来实现它,所以任何建议都会很棒。提前感谢您的一切!

2 个答案:

答案 0 :(得分:5)

这里的根本问题是,虽然它们在语法上是交错的,而Halide代码是通过运行C ++代码构建的,但Halide代码不是C ++代码,反之亦然。 Halide代码完全由您在Funcs中构建的Halide :: *数据结构定义。 if是C控制流构造;您可以使用它来有条件地构建不同的Halide程序,但是您不能在里面使用Halide程序的逻辑(在Expr / Func中)。 select是Halide(有条件地评估为两个值中的一个的Expr),如果/是C(有条件地执行两个子语句之一的语句)。

请放心,你很难在早期遇到这种混乱。我想写一篇专门讲解如何思考Halide中的分阶段编程的教程。

在此之前,简短的“我怎么做我想要的”答案就像你怀疑的那样,而Khouri指出:使用选择。

答案 1 :(得分:3)

由于您没有提供除一行以外的任何代码,我假设inputFunc,而xy都是{{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声明。

算法和调度应该是分开的,尽管可能需要调整算法以允许更好的调度。