我有一个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
的计算类型的示例。理想情况下,我可以使用类似的东西在Halide中处理这个问题:
Expr safe_calc = select(isnan(quotient) || isinf(quotient), 0, quotient);
result(x) = quotient;
Halide中是否存在这样的方法?
答案 0 :(得分:1)
Expr Halide::is_nan(Expr)
目前存在,但我们遗漏了is_finite
。 (添加为https://github.com/halide/Halide/issues/2497)
但是:请注意,Halide根据-ffast-math
规则执行浮点数学运算,这意味着允许以假定NaN/Inf
值不会发生的方式优化代码。如果可以以确保无法使用这些值的方式构建代码,则应该这样做。