halide - Halide 索引是行优先、列优先还是混合?

标签 halide

我想检查一下我对 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/

相关文章:

c++ - Halide 中的 Cholesky 分解

c++ - Halide 在归一化互相关期间挂起

c++ - 如何让Halide使用滑动窗口优化?

c++ - Halide 与 GPU 调度产生黑色图像

c++ - Halide:转换 RGB 图像和平行化模糊

c++ - 如何编写一个带有指定为 GeneratorParam 类型的 ImageParam 的生成器?

c++ - 将 Halide 与表示为 float 组的 HDR 图像一起使用

c++ - 在 C++ 中初始化 Halide 缓冲区

c++ - 不评估两个参数的 Halide 'select'