卤化物索引是行主索引,列主索引还是混合索引?

时间:2018-10-31 19:15:50

标签: halide

我想了解一下我对Halide中索引工作原理的理解。

在许多教程中,我看到索引为[x,y,c]的卤化物缓冲区,即[列,行,通道]。触发JIT的功能与此一致:

realize(input.width(), input.height(), input.channels())

如何存储基础数据?

我从文档和阅读教程中获得的印象是,数据仍然按行优先[高度,宽度,通道]顺序存储,但是它们的DSL交换前两个索引。因此,索引不是行主索引或列主索引,而是介于两者之间且并非严格增加或减少的步幅。

如果这确实是正确的,它将如何扩展到四个维度?除了总是交换前两个索引以外,索引是行主要规则吗?

1 个答案:

答案 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