我正在尝试更改实现的缓冲区布局。 我知道Halide的目的是允许“一次”定义算法,然后能够单独更改计划和存储布局等内容。
我尝试过my_output_function.reorder_storage(x,y,c)
(并置换x,y,c
);但对于任何存储顺序,实现缓冲区步长保持不变(即布局不会改变)。
如果我在调用my_output_function.realize(width, height, channels)
时更改维度顺序,则代码不会编译,因为违反了某些边界条件。我需要改变算法定义,打败卤化物的目的。
如何更改输出布局?
为什么reorder_storage
不会影响输出?
感谢您的帮助。
答案 0 :(得分:3)
输出的顺序不是由reorder_storage
定义的(我们可能应该禁用或警告输出函数),而是由输出缓冲区的布局决定,如其步幅所示。您无法使用最简单的Func::realize
方法来控制它,这些方法接受维度参数并返回系统分配的Image
,但您可以在提前编译的接口中或与其他实现采用用户分配结构的方法:
http://halide-lang.org/docs/class_halide_1_1_func.html#a1f749d8761a6cf35a6f2f3c319d66729
特别是,如果您构建Buffer
,并修改其stride
的{{1}}字段:
http://halide-lang.org/docs/structbuffer__t.html#af60461463c076afe9dd5909e6daf4536
交换步幅会改变此输出缓冲区存储的隐含交错。
一般情况下,通过JOT API(raw_buffer
等)通过AOT调用约定(手动传入realize
s)不能公开。例如,我们可以在buffer_t
/ set_stride
/等上添加Buffer
方法。要了解有关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,这是非常活跃的。