生成器可以在开发过程中用于JIT吗?

时间:2017-01-25 10:20:40

标签: halide

HALIDE的最佳发展策略是什么? 最终用法将是使用生成器编译的提前。 有没有办法调用JIT生成器中定义的函数?

由于

2 个答案:

答案 0 :(得分:2)

是的,Generators可以正常使用JIT代码。

通常,生成器是封装单个Halide块以供重用的首选方法。直到最近,它们在JIT模式下使用起来有点尴尬,但最近添加机器生成的Stub的更改极大地简化了这一点,并且使用JIT或AOT中的Generators非常简单。

不幸的是,Generator Stubs已经足够新了,它们还没有在教程中表现出来;您最好的选择是查看测试/生成器中的自测试(例如example_jittest.cppstubtest_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