Как я могу написать Генератор с ImageParam, у которого есть тип, определенный как GeneratorParam?

Я хотел бы реализовать конвейер изображения для различных типов данных изображения. Я определяю 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"};

// ...
}
};

Благодарю.

1

Решение

Это действительно грязно. В настоящее время наиболее известным решением является повторная инициализация ввода с правильным типом в начале сборки, а не дублирование его другим ImageParam с тем же именем:

Func build()
{
input = ImageParam{datatype, 3, "input"};
...
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]