Halide::Expr' 不能根据上下文转换为 'bool' -- 将函数值存储在变量中

Halide::Expr' is not contextually convertible to 'bool' -- Storing values of functions in variables

我是 Halide 的新手,我正在尝试先实现算法。我正在尝试编写一个函数,该函数根据其周围 8 个像素的值,跳到下一个像素或进行一些处理,然后移至下一个像素。尝试编写此代码时出现以下编译器错误:

84:5:错误:类型 'Halide::Expr' 的值无法根据上下文转换为 'bool'

    if(input(x,y) > 0)

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

我也可能错误地考虑了这个问题,或者可能没有正确地实施它 "Halide mindset",所以任何建议都很好。预先感谢您所做的一切!

由于除了一行之外你没有提供任何代码,我假设 inputFunc 并且 xy 都是 Var秒。如果是这样,input(x,y) 的结果是一个 Expr,您不能用 if 求值,如错误消息所示。

对于您所描述的场景,您可能会遇到这样的情况:

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)
    );

在 Halide 工作绝对需要不同的心态。你必须以更数学的形式思考。也就是说,对于 xy.

的所有情况,将强制执行 a(x,y) = b(x,y) 的语句

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

这里的根本问题是,尽管它们在语法上是交错的,并且 Halide 代码是由 运行 C++ 代码构造的,但 Halide 代码不是 C++ 代码,反之亦然。 Halide 代码完全由您在 Funcs 中构建的 Halide::* 数据结构定义。 if 是 C 控制流构造;您可以使用它来有条件地构建不同的 Halide 程序,但是您不能在 内部 Halide 程序的逻辑中(在 Expr/Func 内部)使用它。 select 之于 Halide(一个有条件地计算出两个值之一的 Expr),因为 if/else 之于 C(有条件地执行两个子语句之一的语句)。

请放心,您并不是唯一一个在早期遇到这种困惑的人。我想写一个教程,专门介绍如何在 Halide 中考虑分阶段编程。

在那之前,简短的 "how do I do what I want" 答案如您所料和 Khouri 指出的那样:使用 select.