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

Halide 卤化物:如何处理评估为nan或inf的Expr?,halide,Halide,我有一个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;

我有一个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;
这是一个可能导致NaN或Inf的计算类型的示例。理想情况下,我可以使用如下方式在卤化物中处理此问题:

Expr safe_calc = select(isnan(quotient) || isinf(quotient), 0, quotient);
result(x) = quotient;
这种方法在卤化物中存在吗?

Expr Halide::is_nanExpr现在存在,但我们缺少is_finite。添加为


但是:请注意,Halide按照-ffast数学规则进行浮点数学运算,这意味着允许它以假定NaN/Inf值不会发生的方式优化代码。如果可以通过某种方式构造代码以确保这些值不可用,您应该这样做。

我希望我们也会添加一个目标标志来关闭快速数学。