HALIDE的最佳发展策略是什么? 最终用法将是使用生成器编译的提前。 有没有办法调用JIT生成器中定义的函数?
由于
答案 0 :(得分:2)
是的,Generators可以正常使用JIT代码。
通常,生成器是封装单个Halide块以供重用的首选方法。直到最近,它们在JIT模式下使用起来有点尴尬,但最近添加机器生成的Stub的更改极大地简化了这一点,并且使用JIT或AOT中的Generators非常简单。
不幸的是,Generator Stubs已经足够新了,它们还没有在教程中表现出来;您最好的选择是查看测试/生成器中的自测试(例如example_jittest.cpp
和stubtest_jittest.cpp
)。
概述:Generator Stub的基本思想是它是一个机器生成的C ++类,它是基于Generator的公共描述创建的。它没有做任何你不能直接做的事情,但它确实使发电机的使用更加简洁,更容易出错。
要生成一个Generator存根,只需修改你的Makefile,将cpp_stub
添加到Generator的-e
命令行标志,例如
./example.generator -n Example -o ./bin -e cpp_stub
这将发出名为example.stub.h
的C ++源文件文件;在这个文件中,您将找到一个类似于这样的C ++类:
class Example : public Halide::Internal::GeneratorStub {
public:
struct Inputs {
// One field per input to the Generator;
// Buffer inputs will be Halide::Funcs,
// all other (scalar) inputs will be HalideExprs
};
struct GeneratorParams {
// One field per GeneratorParam in the Generator
};
struct ScheduleParams {
// One field per GeneratorParam in the Generator
};
Example();
Example(
const GeneratorContext* context,
const Inputs& inputs,
const GeneratorParams& params = GeneratorParams()
);
void schedule(const ScheduleParams& params = ScheduleParams());
// Output(s)
Func output;
// If the Generator has multiple Outputs, they will be here too
};
你可以在JIT代码中使用这个Stub,好像它是一个辅助函数(主要是):
#include "example.stub.h"
Example::Inputs inputs = { ... };
auto gen = Example(context, inputs);
gen.schedule();
Halide::Buffer<int32_t> img = gen.realize(kSize, kSize, 3);
在引擎盖下,Stub正在构建Generator的一个实例,填充Input参数(基于你给它的Inputs结构),调用generate()方法来生成Output Funcs,并将它们返回给你。
当我输入这个时,存根用法很糟糕;我刚刚开了一个问题,将我们收集的文档和示例收集到对一般Halide用户更有帮助的内容中。
答案 1 :(得分:1)
在一个隔离函数中定义你的Halide代码,该函数接受Expr和Func参数并返回一个Func。或者,您可以传递输出Func参数:
在thing.h
Func thing1( Func input, Expr param1, Expr param2 );
void thing2( Func input, Expr param1, Expr param2, Func output );
在thing.cpp
Func thing1( Func input, Expr param1, Expr param2 )
{
Var x("x"), y("y");
Func output("output");
output( x, y ) = input( x, y ) * param1 + param2;
return output;
}
void thing2( Func input, Expr param1, Expr param2, Func output )
{
Var x("x"), y("y");
output( x, y ) = input( x, y ) * param1 + param2;
}
现在您可以在AOT生成器和JIT测试中包含thing.h
。