2017-01-25 14 views

答えて

2

はい、ジェネレータはJITコードでうまく動作します。

一般的に、Generatorは、再利用のためにHalideの個々のチャンクをカプセル化するための好ましい方法です。最近まで、JITモードで使用するのは少し面倒でしたが、機械で生成されたスタブを追加した最近の変更により、JITまたはAOTのGeneratorを使用するのが非常に簡単になりました。

無意識のうちに、Generator Stubsは新しく、まだチュートリアルでは表現されていません。あなたの最善の策は、テスト/ジェネレータのセルフテスト(具体的にはexample_jittest.cppstubtest_jittest.cpp)を見ることです。

概要として、Generator Stubの基本的な考え方は、ジェネレータの公開記述に基づいて作成されたマシン生成のC++クラスです。自分では直接行うことはできないことは何もしませんが、ジェネレータの使用法をもっと簡潔に、簡単に、エラーを起こしにくくします。

Generatorのスタブを作成するには、Generatorの-eコマンドラインフラグにcpp_stubを追加するようにMakefileを変更してください。

./example.generator -n Example -o ./bin -e cpp_stub 

これは、example.stub.hという名前のC++ソースファイルファイルを生成します。それは(主に、ウェル)ヘルパー関数であるかのようにあなたがJITコード内でこのスタブを使用することができます

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 

}; 

#include "example.stub.h" 

Example::Inputs inputs = { ... }; 
auto gen = Example(context, inputs); 
gen.schedule(); 
Halide::Buffer<int32_t> img = gen.realize(kSize, kSize, 3); 
このファイル内には、次のようになりますC++クラスを見つけることができます

ボンネットの下で、スタブはジェネレータのインスタンスを構築しています(入力構造体に基づいて入力パラメータを入力)、generate()メソッドを呼び出してOutput関数を生成して返します。

私がこれをタイプするとき、スタブの使用法はひどく不公平です。私は、ドキュメンテーションとサンプルを集めて、ハライドの一般的なユーザーにとってより役立つものを集めてみました。

1

はExprにとのFuncパラメーターを取り、のFuncを返す隔離機能であなたのハロゲンコードを定義します。今、あなたはあなたのAOT発生器とJITテストの両方からthing.hを含めることができます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; 
} 

thing.h

Func thing1(Func input, Expr param1, Expr param2); 
void thing2(Func input, Expr param1, Expr param2, Func output); 

:別の方法として、あなたは、出力のFuncパラメータを渡すことができます。

関連する問題