If 语句等效于 Halide

If Statement equivalent in Halide

如果在 Halide 中等效,需要帮助实施

if (current_pixel_mag > threshold) {
  mag = 65535;
  ed = 0;
}

我试过 Halide Select,但它相当于 C 中的三元运算符,并且不支持给定条件的多个语句。

如果我没看错,下面的代码应该可以完成工作:

Var x, y;

Func mag = ...;
Func ed = ...;

Expr threshold = ...;

mag(x, y) = select(mag(x, y) > threshold, 65535, mag(x, y));
ed(x, y) = select(mag(x, y) > threshold, 0, ed(x, y));

由于更新定义,效率非常低,而且很难在 x, y 上的单个循环中安排两个函数。

也就是说你可以在一个函数中存储多个语句,那么你可以使用 tuples. There are another select function for tuples called tuple_select:

Func magAndEd;
magAndEd(x, y) = {mag(x, y), ed(x, y)};
magAndEd(x, y) = tuple_select(magAndEd(x, y)[0] > threshold, {65535, 0}, magAndEd(x, y));

此外,可以将阈值折叠到 magAndEd 的初始定义中。