Halide:如何处理评估为 nan 或 inf 的 Expr?

Halide: How to deal with Expr evaluated as nan or inf?

我有一个 1D Func,我想在其上执行以下操作:取 n 值的内核总和,然后除以偏移的内核总和1. 这是我目前的代码:

Var x("x");

Func result("result");
RDom r(0, kernel_size);

Expr sum1 = sum(vec_func(x+r));
Expr sum2 = sum(vec_func(x+r+1));           
Expr quotient = sum1 / sum2;

result(x) = quotient;

这是可能导致 NaNInf 的计算类型示例。理想情况下,我可以使用类似这样的方法在 Halide 中处理此问题:

Expr safe_calc = select(isnan(quotient) || isinf(quotient), 0, quotient);
result(x) = quotient;

Halide有这样的方法吗?

Expr Halide::is_nan(Expr) 现在存在,但我们缺少 is_finite。 (添加为 https://github.com/halide/Halide/issues/2497

但是:请注意,Halide 根据 -ffast-math 规则进行浮点运算,这意味着允许以假定 NaN/Inf 值不会发生的方式优化代码。如果可以以某种方式构建代码以确保不可能出现此类值,那么您应该这样做。