2

我正在尝试使用 C++ 1D 数组初始化卤化物缓冲区。鉴于网上的其他一些帖子,这是我到目前为止所得到的:

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

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

错误:在 '(' 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 数组来初始化卤化物缓冲区?

4

2 回答 2

9

Buffer 类型最近发生了变化,这就是为什么您在网上找到的东西没有用的原因。要创建指向数组的缓冲区,请使用以下两个构造函数之一:

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

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

于 2016-09-29T20:50:13.370 回答
0

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

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

围绕此的语法最近发生了变化,但目标是使使用更容易和更一致。

于 2016-09-29T20:50:30.503 回答