問題タブ [halide]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
halide - 予期しない動作: 空のループにより、blur 関数の結果が改善されます
私は何年にもわたって Siggraph でいくつかの Halide パネルに参加してきましたが、最終的に、既存のソフトウェアをトランスコードするのに役立つかどうかを判断するためにいくつかのテストを行うことにしました。これまでのところ、結果は印象的です。
Siggraph 2015 で提示されたコードに基づいて Gaussian Blur を作成していたところ、理解できない奇妙な動作に遭遇しました。それが私自身の誤解なのか、何らかのバグ/「機能」なのかはわかりません。
以下のコードを参照してください。空の loop に注意してください。gkernel と normalize は、ガウス係数を生成するために私が作成した関数です。ループをコメントアウトしてコードをコンパイルして実行すると、出力画像は黒(すべてゼロ)になります。関数内の空のループを離れると、実行がはるかに高速になり、出力画像が正しくぼやけます。
私は何か基本的なものを見逃していますか、それともある種のバグですか? Windows 7 で MSVS Professional 2013 を使用しています。
機能コード:
関連する実行コード:
無意味なループのない結果:
無意味なループの結果:
c++ - ARM Cortex A9 用の AOT Halide オブジェクト ファイルの生成
Halide-lang AOT とクロス コンパイルのチュートリアルを使用しようとしています。私がやりたいことは、Cortex A9 組み込み Linux ターゲット用の Halide プログラムをクロス AOT コンパイルすることです。
次の変更を加えて、lesson_11_cross_compilation.cpp を修正しました。
これを、lesson_11_cross_compilation.cpp ファイルの先頭にリストされている g++ コマンドでコンパイルします。これにより、lession_11 実行可能ファイルが生成されます。実行可能ファイルを実行すると、lesson_11_arm_32_linux.h/o ファイルが生成されます。
次に、そのファイルに対してクロス コンパイラを実行し、次のコマンド ラインを使用してターゲット用のプログラムを生成しようとします。
/opt/Xilinx/SDK/2014.2/gnu/arm/lin/bin/arm-xilinx-linux-gnueabi-g++ -o test -std=c++11 -lpthread lesson_10_aot_compilation_run.cpp lesson_11_arm_32_linux.o -mfpu=neon-vfpv4 /opt/Xilinx/SDK/2014.2/gnu/arm/lin/bin/../lib/gcc/arm-xilinx-linux-gnueabi/4.8.1/../../../../arm- xilinx-linux-gnueabi/bin/ld: エラー: lesson_11_arm_32_linux.o は VFP レジスタ引数を使用し、テストはしない /opt/Xilinx/SDK/2014.2/gnu/arm/lin/bin/../lib/gcc/arm-xilinx -linux-gnueabi/4.8.1/../../../../arm-xilinx-linux-gnueabi/bin/ld: ファイル lesson_11_arm_32_linux.o collect2 のターゲット固有のデータをマージできませんでした: エラー: ld が返されました1 終了ステータス
Halide は VFP を使用するコードを生成しているようです。-mfpu オプションと -mfloat-abi=softfp、soft、および hard を変更してみました。何も機能しません。特定のタイプの FPU 命令を生成するように Halide を構成する方法はありますか?
python - GPU で事前に
事前コンパイルのターゲットとして OpenCL を使用しようとしています。私の Halide カーネルには、次のnorm
ようにコンパイルする Func という名前があります。
次に、これを使用してエラーなしでコンパイル(および実行して getnorm.o
およびを実行)しますnorm.h
次に、コンパイル済みのカーネルを呼び出すライブラリ ラッパーを (Python で) 自動生成します。
私はそれから
ctypes
Python でライブラリを呼び出そうとすると。OpenCL AOT コンパイルはサポートされていますか?サポートされている場合、問題の原因は何か?
ありがとう。
image - 既存の double C++ 配列から Halide::Image オブジェクトを作成する
2 次元の倍精度浮動小数点画像を定義する、既に割り当てられている C++ 配列を Halide::Image オブジェクトでラップする方法について質問があります。
私はすでに見てきました:
C++ 配列から Halide Image へ (およびその逆)
これは私がやりたいことに近いですが、ハライドの buffer_t のホスト メンバーの uint8_t タイプと、uint8_t ではない既存の画像をどのように操作するかについて混乱しています。
aot を使用するぼかしアプリでは、この例では Halide Image が割り当てられ、要素がこの Halide Image にコピーされていることがわかります。私はこれをしたいのですが、コピーにお金を払う必要はありません。
load_image を使用するオプションはありません。ダブル * で定義された、既に割り当てられている既存のメモリを使用する必要があります。
halide - Halide で split() を使用する場合、同じ要素の計算を避けることはできますか?
Halide 言語での split() の動作について質問があります。
split() を使用すると、計算領域が分割係数の倍数でない場合、エッジで要素が 2 回計算されます。たとえば、計算領域が 10 で分割係数が 4 の場合、Halide は要素 [0,1,2,3]、[4,5,6,7]、および [6,7,8,9] を次のように計算します。以下の trace_stores() の結果。
split() の内部ループの最後のステップで要素 [8,9] のみを計算する方法はありますか?
サンプルコード:
trace_stores() の結果:
halide - パフォーマンスが悪いのはなぜですか? (Noobスケジューリング)
私は主に非常に高レベルのプログラマーなので、CPU の局所性などについて考えるのは私にとって非常に新しいことです。
私は基本的なバイリニア デモザイク (RGGB センサー データ用) に取り組んでおり、アルゴリズムは正しい (結果から判断すると) ですが、期待どおりのパフォーマンスが得られません (~210Mpix/s)。
これが私のコードです(入力はRGGBの単一チャネルを持つ4640x3472画像です):
正直なところ、私はここで何をしているのかわかりません。また、これに慣れていないため、どこを何を見ればよいのかわかりません。
スケジューリングを改善する方法についてのアドバイスは役に立ちます。私はまだ学んでいますが、フィードバックを見つけるのは難しいです。
私が持っているスケジュールは私ができる最高のものですが、それはほとんど完全に試行錯誤です.
編集:関数内の隣接する平均合計全体を直接実行し、色の代わりに x_inner でベクトル化することにより、余分な 30Mpix/s を追加しました。
編集: 新しいスケジュール:
編集: 最終的なスケジュールは、私の2 倍の CPU で実行されたIntel Performance Primitive ベンチマーク(640MP/s) を上回っています:
c++ - ハライド FFT 実装のバグ?
FTTW に対するベンチマークのために、ここにあるハライド FFT 実装を実行しようとしています。実装をそのまま実行することはできますが、もう少し深く掘り下げると、いくつかの問題が発生しました。ルーチンは、H と W (ランダムな入力画像の高さと幅) の値が異なるため、エラーで失敗します。たとえば、H=W=5 で次のエラーが発生します。
Error at ./fft.cpp:603:
Cannot vectorize dimension n0 of function v_S1_R5$6 because the function is scheduled inline.
Aborted (core dumped)
アルゴリズムの結果を比較するために小さな画像サイズ (つまり 5x5) でテストしようとしましたが、アルゴリズムを 16 未満の値で完了することはできません。長い仕事。FFT は 32 より大きい値でも失敗します。
以前にこの問題に遭遇した人はいますか? 異なるサイズの画像で機能する、ハライドでの FFT の他の実装はありますか?
参考までに、gcc 4.8.3 を使用して RHEL7 でコードを実行しています。