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

Combining multiple halide functions but keeping the dimensions same

我有三个 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 函数吗?

您可以使用 Tuple。由于 Tuple 的成员必须具有相同的大小,因此第 3 维的大小不同会有点复杂。您的 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)来更改循环顺序。

您可能想要 return 管道对象而不是 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)));