2016-07-31 18 views
2

OK:image-processing projectの場合、最初の作業Halide generatorcmake build systemに統合しました。最も最適なコンパイラのフラグとコンフィギュレーションでもっとも最適なコンパイラのフラグとコンフィギュレーションを持つcmakeのHalideジェネレータを実行しています。

ジェネレータは、ハライドコードベースのサンプルコードに基づいて、画像のサイズ変更とサンプリングアルゴリズムを実装します。Halide/apps/resize/resize.cpp - ジェネレータのパラメータを活用するためにサンプルを適合させ、ジェネレータのコンパイルと呼び出しをcmakeスクリプトはHalideGenerator.cmakeで定義された関数を使用しています。これはHalideプロジェクトが独自のビルドスクリプトで行うのと同じです。

これまでのところ素晴らしいことですが、私のドメインの専門知識はコード生成のニュアンスの領域では欠けています。例えば、私はラップトップで最高の実証された経験的速度を得るためにスケジューリング方法を微調整しました。しかし、多くの長い調整セッションやコードリーディングの滞留時間をHalideの多くの発電機関連のtoolsscriptsの深さにもかかわらず、コード生成プロセスの理解

特に、私はこれにどのようにアプローチするのか分かりません。デフォルトを使用するか、ターゲットプラットフォームの特定のオプションをオンにすることをお勧めします。後者の場合、条件付きコードをどこかに置く必要がありますか、バイナリにフォールバックを含めることができますか?

これは私が言っていることです: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バイナリ出力はオプションなしで呼び出されたときに何である:あなたのバイナリを事前に生成する場合については

Imgur

答えて

1

( AOT)、それはあなたがランタイムのディスパッチを望むように聞こえる。プログラムは起動時にCPU/GPU環境を調べ、どの機能(AVX、OpenCLなど)を使用するかを決定します。これはハロゲン化物特有のものではない。

  • 最良のケースとして(高パワードデスクトップGPU)とすべてのマシン上で動作する最低限の機能のセットを対象とする高度な機能のセットを選択します(SSE2のみ)。
  • パフォーマンスの高い機能がすべて含まれているこれらの機能セットごとに、DLL/dylib/soを作成します。これらは異なる方法でスケジューリングすることも、完全に異なるFunc定義で作成することもできます。両方のセットを同じソースコードファイルに入れ、生成時にTargetオブジェクトをテストしてそれらの間で選択することができます。
  • プログラムの起動時に、最適な機能が存在するかどうかを確認し、存在する場合はそのライブラリをロードして使用してください。機能が不足している場合は、互換性の最も高いバージョンをデフォルトに設定します。

サポートする機能セットとライブラリの数を自由に選択できます。

代替案は、プログラムの起動時(JIT)にHalideコードをコンパイルする方法です。 get_jit_target_from_environment()によって返されたTargetオブジェクトを使用することをお勧めします。この環境変数は、環境変数HL_JIT_TARGETの内容、またはその変数が設定されていない場合は "host"の内容を使用します。 "ホスト"のターゲット文字列はget_host_target()と同じで、HalideはCPU/GPU環境を調べ、見つけた機能を設定します。 Targetオブジェクトを動的にテストし、GPUまたはCPUスケジューリングを使用できます。

+0

こんにちは、これで私に戻ってくれてありがとう - 私が尋ねることができるならば、上記の@StevenJohnsonと同じ文字列をあなたが言及する "ターゲット文字列"ですか? – fish2000

+1

はい。 GenGenモデルを使用している場合は、 'get_jit_target_from_environment()'または 'get_host_target()'を呼び出さないでください。 'build()'の中から、 'Halide :: Generator'のメンバー関数である' get_target() 'を呼び出すだけです。あなたの 'build()'は毎回異なるターゲットで複数回呼び出されます。 –

1

現在、AOTコンパイルでは、ランタイム検出で複数のCPU機能のカスタマイズを生成できるようになりました。コンマ区切りのターゲットリストとstatic_libraryを出力としてGenGenを使用してください。

GenGen -e static_library、Hターゲットは=これは.Aファイルを生成する

x86-64で-Linuxベースsse41-AVX、x86-64で-Linuxベースsse41、x86-64の-Linuxが含まれる:

AVX + SSE4.1、SSE4.1、およびプレーン古い-x86-64の
  • 選択するhalide_can_use_target_features()実行時の呼び出しを使用して、薄いラッパーの専門でコンパイルされたコードの
    • 3版、実際のターゲットマシンに適したものです。

    詳細については、Func :: compile_to_multitarget_static_library()およびmultitarget_generator.cpp/multitarget_aottest.cppを参照してください。

  • +0

    これは夜間のビルドでプリコンパイルされているだけではありませんか? 4月27日からバイナリリリースはありませんでした。 –

    +1

    あなたは正しいです。この機能を使用して新しいバイナリリリースを作成する必要があります。 –

    +0

    新しいバイナリリリースを行いました。 –

    関連する問題