我想检查一下我对 Halide 中索引如何工作的理解。
在许多教程中,我看到 Halide 缓冲区索引为[x,y,c],即[列,行, channel ]。触发JIT的函数与此一致:
realize(input.width(), input.height(), input.channels())
底层数据是如何存储的?
我对文档和阅读教程的印象是,数据仍然按行主[高度、宽度、 channel ]顺序存储,但它们的 DSL 交换了前两个索引。因此,索引不是行主索引或列主索引,而是介于两者之间的索引,步幅不是严格递增或递减。
如果这确实正确,那么它如何扩展到四个维度?除了总是交换前两个索引之外,索引是否是行主的规则?
最佳答案
默认情况下,Halide 将最左边的维度存储在最里面。因此,如果您有 2D 图像
Func f;
f(x, y) = ...;
然后数据布局按行主序存储,因为 y
是最外层的维度。可以通过以下方式在时间表中将其更改为专栏专业:
f.reorder_storage(y, x);
对于具有 f(x, y, c)
的 3D 图像,颜色 channel 位于最外层,使其成为平面图像。这也是迭代的工作原理:默认情况下,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
关于halide - Halide 索引是行优先、列优先还是混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090514/