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;
这是可能导致 NaN
或 Inf
的计算类型示例。理想情况下,我可以使用类似这样的方法在 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
值不会发生的方式优化代码。如果可以以某种方式构建代码以确保不可能出现此类值,那么您应该这样做。
我有一个 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
的计算类型示例。理想情况下,我可以使用类似这样的方法在 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
值不会发生的方式优化代码。如果可以以某种方式构建代码以确保不可能出现此类值,那么您应该这样做。