【问题标题】:Halide reduction over 2D domain boundary二维域边界上的卤化物减少
【发布时间】:2018-04-03 02:44:41
【问题描述】:

在我正在实施的过滤器中,有一个步骤对方形域的边界进行了一些减少

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 会造成相当混乱。在 Halide 中是否有一种优雅而有效的方式来做到这一点?

【问题讨论】:

    标签: halide


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我没有对此进行测试,但总体思路是根据需要一次只使用一个维度的 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 之类的替代品。

      必须仔细检查括号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 2017-06-03
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多