Halide 非连续内存布局

Halide non-contiguous memory layout

是否可以在 Halide 中使用 non-c/fortran 排序? (其中给定尺寸 x、y、c、x 变化最快,然后 c 变化第二快(numpy 中的步幅至少为:.strides = (W*C, 1, W) 我们的内存布局是一堆图像,其中每个图像的通道是按扫描线堆叠。

(如果布局还不够清晰,我可以尝试澄清一下)。使用 python 绑定,我总是得到 ValueError: ndarray is not contiguous when trying to pass in my numpy array with .strides set.

我试过更改 numpy 数组以使用连续步幅(不更改内存布局)只是为了将其放入 Halide,然后在 halide 中设置 .set_stride,但没有成功。我只是想确保我没有尝试做一些无法完成的事情。t/shouldn。

我认为这类似于 https://halide-lang.org/tutorials/tutorial_lesson_16_rgb_generate.html 中提到的逐行布局,除了 C 中的更多维度,因为图像沿通道“堆叠”(以产生 W、H、C* image_count 张量)

如有任何建议,我们将不胜感激。

谢谢!

这比 Halide 问题更像是一个麻木的问题。以下 Halide 代码说明了如何使用您正在寻找的形状的数组(我认为):

import halide as hl
import numpy as np;

x, y, c = hl.Var('x'), hl.Var('y'), hl.Var('c')
f = hl.Func('f')
f[x, y, c] = (x * 3) + (y * 12) + c
# This would be necessary for internally allocated buffers
# f.reorder_storage(x, c, y)

# These control output layout
f.output_buffer().dim(1).set_stride(12)
f.output_buffer().dim(2).set_stride(3)
# Probably wanted for efficiency
f.reorder(x, c, y)
result = f.realize(4, 5, 3)

print(result, result[0, 1, 1])
np_result = np.array(result)
print(np_result, np_result[0, 1, 1])
print(np_result.shape, " ", np_result.strides, " ", np_result.flags)

我不太精通 numpy,也不确定如何从头开始在该布局中分配数组,但答案可能必须类似于 lib.stride_tricks.as_strided.