更改卤化物输出缓冲区布局

Changing halide output buffer layout

我正在尝试更改实现的缓冲区布局。 我知道 Halide 的目的是允许定义算法 "once",然后能够分别更改调度和存储布局等内容。

我已经尝试了 my_output_function.reorder_storage(x,y,c)(并进行了排列 x,y,c);然而对于任何存储顺序,实现缓冲区步幅保持不变(即布局不会改变)。

如果我在调用 my_output_function.realize(width, height, channels) 时更改维度排序,则代码不会编译,因为违反了某些边界条件。我需要更改算法定义,破坏卤化物的目的。

我应该如何更改输出布局? 为什么 reorder_storage 不影响输出?

感谢您的帮助。

输出的顺序不是由 reorder_storage(我们应该禁用或警告输出函数)定义的,而是由输出缓冲区的布局定义的,如其步幅所示。您无法使用最简单的 Func::realize 方法来控制它,这些方法采用维度参数和 return 系统分配的 Image,但您可以在提前编译的界面中或使用其他采用用户分配结构的实现方法:

http://halide-lang.org/docs/class_halide_1_1_func.html#a1f749d8761a6cf35a6f2f3c319d66729

特别是,如果您构造一个 Buffer,并修改其 raw_bufferstride 字段:

http://halide-lang.org/docs/structbuffer__t.html#af60461463c076afe9dd5909e6daf4536

交换步长会改变此输出缓冲区存储的隐含交错。

一般来说,通过 JIT API(realize 等)不如通过 AOT 调用约定(手动传入 buffer_ts)公开。例如,我们可以在 Buffer/Image/etc 上添加 set_stride 方法。要了解有关 AOT 模型的更多信息,请查看教程 10:

https://github.com/halide/Halide/blob/master/tutorial/lesson_10_aot_compilation_generate.cpp
https://github.com/halide/Halide/blob/master/tutorial/lesson_10_aot_compilation_run.cpp

希望对您有所帮助。另外,欢迎在mailing list上提问,非常活跃。