在 C++ 中初始化卤化物缓冲区

Initializing Halide Buffer in C++

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

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++ 一维或二维数组来初始化 Halide 缓冲区?

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

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

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

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

这方面的语法最近发生了变化,但目的是使使用更容易、更一致。