OK:image-processing projectの場合、最初の作業Halide generatorをcmake build systemに統合しました。最も最適なコンパイラのフラグとコンフィギュレーションでもっとも最適なコンパイラのフラグとコンフィギュレーションを持つcmakeのHalideジェネレータを実行しています。
ジェネレータは、ハライドコードベースのサンプルコードに基づいて、画像のサイズ変更とサンプリングアルゴリズムを実装します。Halide/apps/resize/resize.cpp
- ジェネレータのパラメータを活用するためにサンプルを適合させ、ジェネレータのコンパイルと呼び出しをcmakeスクリプトはHalideGenerator.cmake
で定義された関数を使用しています。これはHalideプロジェクトが独自のビルドスクリプトで行うのと同じです。
これまでのところ素晴らしいことですが、私のドメインの専門知識はコード生成のニュアンスの領域では欠けています。例えば、私はラップトップで最高の実証された経験的速度を得るためにスケジューリング方法を微調整しました。しかし、多くの長い調整セッションやコードリーディングの滞留時間をHalideの多くの発電機関連のtoolsとscriptsの深さにもかかわらず、コード生成プロセスの理解
特に、私はこれにどのようにアプローチするのか分かりません。デフォルトを使用するか、ターゲットプラットフォームの特定のオプションをオンにすることをお勧めします。後者の場合、条件付きコードをどこかに置く必要がありますか、バイナリにフォールバックを含めることができますか?
これは私が言っていることです: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]
...
が が行われるべきか、どのような が discretionally、行うことができるものから、行われなければならないものを分離することは困難である:ここでは、このスクリプトではコードのコメントからの抜粋です。コンパイラとリンカがこれらの決定を最も多く行い、多くの場合フラグまたは2つのフラグを必要とするため、C++またはObjective-Cプロジェクト(さらに多くのビザンチンの例)を設定するときには、これらの問題に対処する必要はありません。私の質問は:どのように私は私の既存のプロジェクトにハロゲン発電機の出力ライブラリのバイナリを統合することができます - さらに制約なく、このような発電機の出力が可能な限り高速であること(例えばAVX2などGPU、SSE2/3を、使用しています)移植性(例えば、わずかに異なるマシン上で不思議にセグメンテーションすることはありません)?
具体的には、最初に最低共通分母のみを対象にし、よりエキゾチックなプロセッサ機能を段階的に活用する必要があります。
編集:私は以下のコメントで述べたように、これはstdout
に私のGenGenバイナリ出力はオプションなしで呼び出されたときに何である:あなたのバイナリを事前に生成する場合については
こんにちは、これで私に戻ってくれてありがとう - 私が尋ねることができるならば、上記の@StevenJohnsonと同じ文字列をあなたが言及する "ターゲット文字列"ですか? – fish2000
はい。 GenGenモデルを使用している場合は、 'get_jit_target_from_environment()'または 'get_host_target()'を呼び出さないでください。 'build()'の中から、 'Halide :: Generator'のメンバー関数である' get_target() 'を呼び出すだけです。あなたの 'build()'は毎回異なるターゲットで複数回呼び出されます。 –