1

我正在尝试更改实现的缓冲区布局。我了解 Halide 的目的是允许“一次”定义算法,然后能够分别更改计划和存储布局等内容。

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

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

我应该怎么做才能改变输出布局?为什么不reorder_storage影响输出?

谢谢你的帮助。

4

1 回答 1

4

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

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

特别是,如果您构造 aBuffer并修改其stride字段raw_buffer

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

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

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

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

我希望这会有所帮助。另外,请随时在邮件列表中提问,该邮件列表非常活跃。

于 2015-01-09T01:44:13.550 回答