HALIDEでの開発に最適な戦略は何ですか? 最終使用は、ジェネレータを使用して事前にコンパイルされた時間になります。 JITのジェネレータで定義された関数を呼び出す方法はありますか?開発中にJITにジェネレータを使用できますか?
おかげ
HALIDEでの開発に最適な戦略は何ですか? 最終使用は、ジェネレータを使用して事前にコンパイルされた時間になります。 JITのジェネレータで定義された関数を呼び出す方法はありますか?開発中にJITにジェネレータを使用できますか?
おかげ
はい、ジェネレータはJITコードでうまく動作します。
一般的に、Generatorは、再利用のためにHalideの個々のチャンクをカプセル化するための好ましい方法です。最近まで、JITモードで使用するのは少し面倒でしたが、機械で生成されたスタブを追加した最近の変更により、JITまたはAOTのGeneratorを使用するのが非常に簡単になりました。
無意識のうちに、Generator Stubsは新しく、まだチュートリアルでは表現されていません。あなたの最善の策は、テスト/ジェネレータのセルフテスト(具体的にはexample_jittest.cpp
とstubtest_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関数を生成して返します。
私がこれをタイプするとき、スタブの使用法はひどく不公平です。私は、ドキュメンテーションとサンプルを集めて、ハライドの一般的なユーザーにとってより役立つものを集めてみました。
は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パラメータを渡すことができます。