二维域边界上的卤化物还原
Halide reduction over 2D domain boundary
在我正在实施的过滤器中,有一个步骤在正方形域的边界上进行了一些缩减
RDom r(0, filter_size, 0, filter_size);
r.where( (r.x == 0 || r.x == filter_size - 1)
|| (r.y == 0 || r.y == filter_size - 1));
然而,这使得域遍历 O(filter_size^2)
而有用的缩减域仅为 O(filter_size)
。
现在我的缩减操作有点复杂,所以对过滤器的每一侧重复 if window 会造成相当大的混乱。在 Halide 中是否有一种优雅 && 有效的方法来做到这一点?
我最终使用的代码既不优雅也不super-efficient,欢迎贡献...
RDom rl(0, filter_size, 0, 2, 0, 2);
Expr rlx = rl.y*rl.x + rl.z*(1 - rl.y)*filter_size;
Expr rly = (1 - rl.y)*rl.x + rl.z*rl.y*filter_size;
Expr x_on_rl = x + rlx - (filter_size+1)/2;
Expr y_on_rl = y + rly - (filter_size+1)/2;
用法类似
range_min(x, y) = Halide::minimum(range_clamped(x_on_rl, y_on_rl));
我还没有对此进行测试,但总体思路是根据需要一次仅使用 RDom 的一个维度,这样您就不必费心遍历内部。
RDom r(0, filter_size, 1, filter_size-1);// the y part is different because we don't want to double count the corners
output(x,y,c) =
Binary_Reduction(Halide::<desired_reduction>(clamped_input(x + r.x, y, c)),
Binary_Reduction(Halide::<desired_reduction>(clamped_input(x + r.x, y + filter_size -1, c)),
Binary_Reduction(Halide::<desired_reduction>(clamped_input(x, y + r.y, c)),
Halide::<desired_reduction>(clamped_input(x + filter_size - 1, y + r.y, c)))));
二元归约是 stand-in 对一对表达式的归约,例如 Halide::min 或任何二元运算。
是 stand-in 类似 Halide::minimum 或 Halide::sum.
必须仔细检查括号。
在我正在实施的过滤器中,有一个步骤在正方形域的边界上进行了一些缩减
RDom r(0, filter_size, 0, filter_size);
r.where( (r.x == 0 || r.x == filter_size - 1)
|| (r.y == 0 || r.y == filter_size - 1));
然而,这使得域遍历 O(filter_size^2)
而有用的缩减域仅为 O(filter_size)
。
现在我的缩减操作有点复杂,所以对过滤器的每一侧重复 if window 会造成相当大的混乱。在 Halide 中是否有一种优雅 && 有效的方法来做到这一点?
我最终使用的代码既不优雅也不super-efficient,欢迎贡献...
RDom rl(0, filter_size, 0, 2, 0, 2);
Expr rlx = rl.y*rl.x + rl.z*(1 - rl.y)*filter_size;
Expr rly = (1 - rl.y)*rl.x + rl.z*rl.y*filter_size;
Expr x_on_rl = x + rlx - (filter_size+1)/2;
Expr y_on_rl = y + rly - (filter_size+1)/2;
用法类似
range_min(x, y) = Halide::minimum(range_clamped(x_on_rl, y_on_rl));
我还没有对此进行测试,但总体思路是根据需要一次仅使用 RDom 的一个维度,这样您就不必费心遍历内部。
RDom r(0, filter_size, 1, filter_size-1);// the y part is different because we don't want to double count the corners
output(x,y,c) =
Binary_Reduction(Halide::<desired_reduction>(clamped_input(x + r.x, y, c)),
Binary_Reduction(Halide::<desired_reduction>(clamped_input(x + r.x, y + filter_size -1, c)),
Binary_Reduction(Halide::<desired_reduction>(clamped_input(x, y + r.y, c)),
Halide::<desired_reduction>(clamped_input(x + filter_size - 1, y + r.y, c)))));
二元归约是 stand-in 对一对表达式的归约,例如 Halide::min 或任何二元运算。
是 stand-in 类似 Halide::minimum 或 Halide::sum.
必须仔细检查括号。