二维域边界上的卤化物还原

时间:2018-03-21 17:12:29

标签: halide

在我实现的过滤器中,有一个步骤在方域的边界上进行一些缩减




  RDom r(0,filter_size,0,filter_size );
 r.where((rx == 0 || rx == filter_size  -  1)
 ||(ry == 0 || ry == filter_size  -  1));
  




然而,这会使域遍历 O(filter_size ^ 2),而有用的还原域只是 O(filter_size) 。 
现在我的还原操作有点涉及,所以如果过滤器窗口的每一侧都要重复,那么重复一遍。是否优雅&&在Halide有效的方法吗?




2 个答案:

答案 0 :(得分:0)

我最终使用的代码既不优雅也不超高效,所以欢迎贡献......

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));

答案 1 :(得分:0)

我还没有对此进行测试,但一般的想法是只根据需要一次使用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)))));

二进制缩减是一对表达式,用于减少一对表达式,如Halide :: min或任何二进制操作。

是Halide :: minimum或Halide :: sum。

之类的替身

要仔细检查括号。