我想了解一下我对Halide中索引工作原理的理解。
在许多教程中,我看到索引为[x,y,c]的卤化物缓冲区,即[列,行,通道]。触发JIT的功能与此一致:
realize(input.width(), input.height(), input.channels())
如何存储基础数据?
我从文档和阅读教程中获得的印象是,数据仍然按行优先[高度,宽度,通道]顺序存储,但是它们的DSL交换前两个索引。因此,索引不是行主索引或列主索引,而是介于两者之间且并非严格增加或减少的步幅。
如果这确实是正确的,它将如何扩展到四个维度?除了总是交换前两个索引以外,索引是行主要规则吗?
答案 0 :(得分:0)
默认情况下,Halide将最左侧的尺寸存储在最内部。因此,如果您有2D图像
Func f;
f(x, y) = ...;
然后,由于y
是最外面的维,因此数据布局以行主顺序存储。可以在时间表中将其更改为专业栏,方法是:
f.reorder_storage(y, x);
对于具有f(x, y, c)
的3D图像,颜色通道位于最外面,使其成为平面图像。这也是迭代的工作方式:x
默认是最里面的循环。
在处理输入图像时,您将必须手动设置步幅。例如,如果您要输入隔行图像,并且输入f
,则应输入:
f.dim(0).set_stride(3) // x -- RGB, 4 for RGBA
.dim(2).set_stride(1); // c -- stride for channels is 1.
// stride for y will be 3 * width
有关内存布局的更多信息,请访问: https://halide-lang.org/tutorials/tutorial_lesson_16_rgb_generate.html