我开始使用Halide,并在Python环境中使用它。在该Python环境中,数据作为Numpy数组传递,它实际上是其他地方定义的C ++数组的别名。

但是,当我使用调用Halide函数时,出现错误:

Constraint violated: img.stride.0 (520) == 1 (1)
Aborted (core dumped)

which can be "solved" by copying the numpy arrays to Fortran layout arrays:

img=np.copy(img,order="F")
res=np.copy(res,order="F")


与img和res我的输入和输出图像。但是请注意,这涉及额外的复制操作,这对整体全局内存访问确实不利。

我该如何解决这个问题?我一直在想的一种方法是实际上告诉Python我的数组具有Fortran布局并正确切换了索引。...但是,我目前使用PyArray_SimpleNewFromData来获取Python数组(实际上并未复制数据),结果是C样式数组。

最佳答案

Halide固有地期望以行为主的存储,但是索引这样的内容:im(col,row)...,对于曾经将图像视为矩阵或在C中使用2D数组的人来说,这看起来非常像以列为主的存储。

因此,您的选择是更改索引以匹配Halide的概念,或者告诉Halide您的内存布局与之相反(stride(0)很大)。

这里有一个涵盖了密切相关主题的教程:http://halide-lang.org/tutorials/tutorial_lesson_16_rgb_generate.html

2D输入和Funcs的简短版本是:

image_param.set_stride(0, Expr()).set_stride(1, 1);
output_func.output_buffer().set_stride(0, Expr()).set_stride(1, 1);


第一个set_stride调用使维度0的步幅不受约束,第二个告诉Halide可以假定维度1的步幅为1。如果执行此操作,则需要在第二个维度上对Halide Funcs进行矢量化处理,因为那是一个内存密集:

f(i, j) = ...
f.vectorize(j, 4)

关于python - 带有C版面numpy数组的 Halide ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34439657/

10-10 18:21