2016-09-29 144 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中的前一個索引。)

最近更改了此語法,但其目標是使使用更容易並更一致。