Я хотел бы реализовать конвейер изображения для различных типов данных изображения. Я определяю Generator
класс, содержащий build()
метод описания трубопровода, GeneratorParam<type>
указать параметр типа данных и ImageParam
элемент для указания входного изображения. Если я укажу тип ImageParam
быть GeneratorParam<Type>
что я определил выше, то независимо от того, какой тип я указываю при выполнении генератора, тип входного изображения всегда является типом по умолчанию. Если я скопирую декларацию ImageParam
внутри тела build()
метод, то, кажется, работает нормально. Это правильный способ определения конвейера с входным изображением, которое может иметь разные типы?
Вот класс, как я его первоначально написал:
#include "Halide.h"
using namespace Halide;
class myGenerator : public Generator<myGenerator>
{
public:
// Image data type as a parameter of the generator; default: float
GeneratorParam<Type> datatype{"datatype", Float(32)};
// Input image to the pipeline
ImageParam input{datatype, 3, "input"}; // datatype=Float(32) always
// Pipeline
Func build()
{
// ...
}
};
Если я скомпилирую генератор и запустите его, чтобы сгенерировать конвейер для datatype
отличается от значения по умолчанию:
$ ./myGenerator -f pipeline_uint8 -o . datatype=uint8
Тогда все кажется нормальным, но конвейер падает во время выполнения, потому что буфер, который я передаю ему, — это uint8, но он ожидал образ типа float (по умолчанию я указал в классе генератора):
Error: Input buffer input has type float32 but elem_size of the buffer passed in is 1 instead of 4
Я исправил проблему, скопировав декларацию ImageParam
внутри build()
блок, но это кажется немного грязным для меня. Есть ли способ лучше? Вот класс сейчас:
#include "Halide.h"
using namespace Halide;
class myGenerator : public Generator<myGenerator>
{
public:
// Image data type as a parameter of the generator; default: float
GeneratorParam<Type> datatype{"datatype", Float(32)};
// Input image to the pipeline
ImageParam input{datatype, 3, "input"};
// Pipeline
Func build()
{
// Copy declaration. This time, it picks up datatype
// as being the type inputted when executing the
// generator instead of using the default.
ImageParam input{datatype, 3, "input"};
// ...
}
};
Благодарю.
Это действительно грязно. В настоящее время наиболее известным решением является повторная инициализация ввода с правильным типом в начале сборки, а не дублирование его другим ImageParam с тем же именем:
Func build()
{
input = ImageParam{datatype, 3, "input"};
...
}
Других решений пока нет …