OK、そう: 私は最初の動作中のHalide ジェネレーターを私の小さな画像処理プロジェクトのcmake ビルド システムに統合することに成功しました。
ジェネレーターは、Halide コードベースのサンプル コードに基づいて、画像のサイズ変更およびリサンプリング アルゴリズムを実装しHalide/apps/resize/resize.cpp
ます。でHalideGenerator.cmake
、Halide プロジェクトが独自のビルド スクリプトで行うように。
これまでのところ、これはすべてうまく機能していますが、コード生成のニュアンスの領域では、私のドメインの専門知識が不足しています。たとえば、スケジューリング方法を微調整して、ラップトップで観測された最高の経験的速度を得ました。コード生成プロセスの理解。
具体的には、これにアプローチする方法がわかりません。デフォルトを使用するか、ターゲット プラットフォームの特定のオプションをオンにするのが最善ですか? 後者の場合、どこかに条件付きコードを含める必要がありますか、それともバイナリにフォールバックを含めることができますか?
私が話していることは次のとおりです。Halide チュートリアル レッスン #15 のソースには、さまざまなオプションでジェネレーターを呼び出す複雑なスクリプトがあります。このスクリプトのコード コメントのスニペットを次に示します。
# If you're compiling and linking multiple Halide pipelines, then the
# multiple copies of the runtime should combine into a single copy
# (via weak linkage). If you're compiling and linking for multiple
# different targets (e.g. avx and non-avx), then the runtimes might be
# different, and you can't control which copy of the runtime the
# linker selects.
# You can control this behavior explicitly by compiling your pipelines
# with the no_runtime target flag. Let's generate and link several
# different versions of the first pipeline for different x86 variants: [snip]
…このことから、何をしなければならないか、何をすべきか、または何をすべきかを裁量的に区別することは困難です。比較すると、C++ または Objective-C プロジェクト (さらに多くのビザンチンの例) をセットアップするときにこれらの問題に対処する必要はありません。これは、コンパイラとリンカーがこれらの決定のほとんどを行い、多くても 1 つまたは 2 つのフラグが必要なためです。
私の質問は、Halide ジェネレーターの出力ライブラリ バイナリを既存のプロジェクトに統合するにはどうすればよいかということです。移植性をさらに制限することなく(例: GPU、SSE2/3、AVX2 などを使用)、ジェネレーターの出力を可能な限り高速にします少し違うマシンで不思議なことにセグメンテーションフォールトですか?
具体的には、私のプロセスはどのようなものであるべきですか? たとえば、最初は最小公分母のみを対象とし、その後、よりエキゾチックなプロセッサ機能を段階的に活用する必要がありますか?
編集: 以下のコメントで述べたように、これは、stdout
オプションなしで呼び出されたときに GenGen バイナリが出力するものです。