如何使用指定为GeneratorParam类型的ImageParam编写Generator?

时间:2016-02-19 20:48:10

标签: c++ halide

我想为各种图像数据类型实现图像管道。我正在定义一个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 个答案:

答案 0 :(得分:4)

确实很脏。目前最着名的解决方案是使用构建顶部的正确类型重新初始化输入,而不是使用具有相同名称的另一个ImageParam对其进行遮蔽:

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