结合多个卤化物功能但保持尺寸相同

时间:2017-08-07 08:07:36

标签: halide

我有三个具有以下输出尺寸的Halide函数:
40 x 40 x 64
40 x 40 x 128
40 x 40 x 64

我想将它们组合成一个函数,以便我获得一个函数句柄供以后使用。所以对于这里,结果函数的维度应为

40 x 40 x 256

我正在使用Halide::select,但会产生4个维度

concat(x,y,z,c)=Halide::select(c == 0, func_1(x, y, z), c == 1, func_2(x, y, z), func_3(x, y, z));

有没有办法生成合并的3D功能?

2 个答案:

答案 0 :(得分:0)

您可以使用Tuple。由于Tuple的成员必须具有相同的大小,因此第三维的不同大小有点复杂。这种复杂性也适用于您的4d解决方案。

result(x, y, z) = Tuple
    ( func_1(x, y, z)
    , func_2(x, y, z * 2 + 0) // Even z
    , func_2(x, y, z * 2 + 1) // Odd z
    , func_3(x, y, z)
    );

如果保留4d解决方案,请在计划中添加unroll(c),并在最里面的循环内按顺序评估3(现在4个)函数。

不是在第三维中连接三个函数,而是添加另一个维度或使用Tuple是更好的方法,恕我直言。

修改:除unroll(c)外,您还需要reorder(c,x,y,z)来更改循环顺序。

答案 1 :(得分:0)

您可能希望返回Pipeline对象而不是Func。管道编译为具有多个输出参数的函数,这些参数可以是不同形状的缓冲区。

如果你想要一个Func,你需要这样的东西:

concat(x, y, z) = 
  Halide::select(z < 64, func_1(x, y, clamp(z, 0, 63)), 
                 z < 192, func_2(x, y, clamp(z - 64, 0, 127)), 
                 func_3(x, y, clamp(z - 192, 0, 63)));