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

时间:2017-10-30 17:51:58

标签: halide

我有一个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中是否存在这样的方法?

1 个答案:

答案 0 :(得分:1)

Expr Halide::is_nan(Expr)目前存在,但我们遗漏了is_finite。 (添加为https://github.com/halide/Halide/issues/2497

但是:请注意,Halide根据-ffast-math规则执行浮点数学运算,这意味着允许以假定NaN/Inf值不会发生的方式优化代码。如果可以以确保无法使用这些值的方式构建代码,则应该这样做。