我开始使用 Halide 并在 Python 环境中使用它。在该 Python 环境中,数据作为 Numpy 数组传递,它实际上是其他地方定义的 C++ 数组的别名。
但是,当我使用调用 Halide 函数时,出现错误:
Constraint violated: img.stride.0 (520) == 1 (1)
Aborted (core dumped)
这可以通过将 numpy 数组复制到 Fortran 布局数组来“解决”:
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 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 函数进行矢量化,因为这是唯一的维度这在记忆中很密集:
f(i, j) = ...
f.vectorize(j, 4)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)