2016-09-29 148 views
1

我想用C++ 1D数组初始化Halide缓冲区。鉴于其他一些在线帖子,这是我迄今为止:在C++中初始化Halide缓冲区

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

其中in_ptr是指向我的C++数组的指针。 当我运行此我得到以下错误:

error: missing template arguments before ‘(’ token Image in(Buffer(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));

但是,这并不匹配任何构造的任何但我不能找到关于如何初始化缓冲区的任何优秀文档。

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

回答

4

缓冲区类型最近发生了变化,这就是为什么您在网上找到的东西没有用。为了使指向阵列的缓冲液,使用这两个构造函数之一:

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); 

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

+0

有没有一个构造函数,使数据的副本,而不是指向数组? –

0

有了最新的卤化物,你可能会想: Buffer<float, 1> my_buffer(in_ptr, size_x);

这将创建my_buffer指向in_ptr。模板参数中的1是维数。对于更大数量的维度,当传递预先填充的内存时,可能还必须指定步幅。 (以上假设数据in_ptr指向密集包装 - 即每个元素的索引都大于in_ptr中的前一个索引。)

最近更改了此语法,但其目标是使使用更容易并更一致。