0

我是使用卤化物的新手,我首先在玩实现算法。我正在尝试编写一个函数,该函数取决于它周围 8 个像素的值,要么跳到下一个像素,要么进行一些处理,然后移动到下一个像素。尝试编写此代码时,出现以下编译器错误:

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

    if(input(x,y) > 0)

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

我也可能认为这个问题是错误的,或者可能没有以正确的“卤化物心态”来实施它,所以任何建议都会很棒。预先感谢您所做的一切!

4

2 回答 2

6

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

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

在那之前,简短的“我该怎么做”答案正如您所怀疑的那样,正如 Khouri 指出的那样:使用选择。

于 2016-06-09T23:10:42.390 回答
3

由于您除了一行之外没有提供任何代码,我假设inputis a Funcand both xand yare Vars。如果是这样,则 的结果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 工作肯定需要不同的心态。你必须以更数学的形式思考。也就是说,对于和a(x,y) = b(x,y)的所有情况,都将执行的声明。xy

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

于 2016-06-09T19:26:30.440 回答