用C ++初始化Halide Buffer

时间:2016-09-29 20:10:46

标签: c++ buffer halide

我正在尝试用C ++ 1D数组初始化Halide Buffer。鉴于其他在线帖子,这是我到目前为止所做的:

Image<float> in(Buffer(type_of<float>(), size_x, 0, 0, 0, NULL, in_ptr));

其中in_ptr是指向我的C ++数组的指针。 当我运行这个时,我收到以下错误:

  

错误:在'('标记'之前缺少模板参数      图像在(缓冲区(type_of(),padded_size *(jb + 1),0,0,0,NULL,d_In));

所以我将代码更改为:

Image<float> in(Buffer<float>(type_of<float>(), size_x, 0, 0, 0, NULL, in_ptr));

但这与任何构造函数都不匹配,但我找不到关于如何初始化Buffer的任何好的文档。

甚至可以做这样的事情吗?如何使用C ++ 1D或2D数组初始化Halide缓冲区?

2 个答案:

答案 0 :(得分:6)

最近缓冲区类型已更改,这就是您在线查找的内容无效的原因。要创建指向数组的缓冲区,请使用以下两个构造函数之一:

https://github.com/halide/Halide/blob/master/src/runtime/HalideBuffer.h#L631

float my_array[10];
Halide::Buffer<float> buf(my_array); // Infers the size from the type

https://github.com/halide/Halide/blob/master/src/runtime/HalideBuffer.h#L665

float *my_pointer = ...
Halide::Buffer<float> buf(my_pointer, 10); // Accepts a pointer and some sizes

2D的工作方式类似:

float my_array[30][20]
Halide::Buffer<float> buf(my_array); // Makes a 20x30 array

或等效,

float *my_pointer = ...
Halide::Buffer<float> buf(my_pointer, 20, 30); 

这些构造函数都没有复制数据 - 它们只是引用现有数组。

答案 1 :(得分:0)

使用最新的Halide,你可能想要: Buffer<float, 1> my_buffer(in_ptr, size_x);

这将创建指向my_buffer的{​​{1}}。模板参数中的1是维数。对于更大数量的尺寸,当通过预先填充的存储器时,也可能必须指定步幅。 (以上假设数据in_ptr指向的是密集的 - 即每个元素的索引都比in_ptr中的前一个大。)

最近这种语法发生了变化,但其目标是让使用更容易,更一致。