我有三个具有以下输出尺寸的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功能?
答案 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)));