問題タブ [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.
c++ - Halide プログラミング言語を使い始めますか?
Halideという画像処理用のドメイン固有言語 (C++ 拡張機能) を使い始めようとしています。
Halide READMEに従って、私が試したことは次のとおりです。
- Ubuntu 12.04 Halide バイナリをダウンロードし、ディレクトリに解凍し
~/halide
ます。 - このページのセクションで説明されているように、
~/halide
ディレクトリに を作成しました。hello_halide.cpp
Using Halide
コンパイルしようとしました
hello_halide.cpp
:g++-4.6 -std=c++0x hello_halide.cpp -L halide -lHalide -ldl -lpthread -o hello_halide
しかし、g++ は libhalide を見つけることができません:
/usr/bin/ld: error: cannot find -lHalide
と に追加しようとし
~/halide
ました$PATH
が$LD_LIBRARY_PATH
、これは役に立ちませんでした。
hello_halide.cpp
この基本的なHalide プログラムをコンパイルするにはどうすればよいですか?
ノート:
- CUDA は、Halide の依存関係の 1 つです。CUDA がインストールされており、CUDA プログラムをコンパイル/実行できます。
- Ubuntu 12.04 を使用しています。
- 私の g++ バージョンは 4.6.3 です。
c++ - ハライドタプルの使い方
Halide を使用して、複数の出力バッファーを生成したいと考えています。
この例は問題なく動作しますが、次のように、同じサイズではなく、複数の出力を持つことが可能かどうか疑問に思っていました。
出力 0 と出力 1 の違いについて、Halide からエラーが発生しました。
複数のオブジェクト ファイルではなく、1 つのコンパイル (compile_to_file) のみが必要であると想定しています。
ジェイ
c++ - ハライド extern メソッド
私は AOT コンパイルを使用して、Halide ライブラリを使用せずに Halide コードを使用しています。
HalideRuntime.h (ソースで利用可能) を見ると、.o ファイルで利用可能な extern メソッドが多数あることがわかります。
ハライド dev_mallocとハライド dev_freeは非常に興味深いものです。ハライド_コピー_to_devを問題なく使用していますが、メモリが割り当てられていることがわかります。ホストとデバイスの間で単純な memcpy を実行し、代わりに ハライド dev_malloc を使用したい場合、これは可能ですか?
HalideRuntime.h は利用可能なすべての extern 関数をグループ化しましたか、それともオブジェクト ファイルには他の多くの関数が含まれていますか?
ジェイ
c++ - GPU を使用した Halide での extern の使用
Halide で extern 関数を使用しようとしています。私の文脈では、GPUでやりたいです。
opencl ステートメントを使用して AOT コンパイルでコンパイルします。もちろん、opencl は引き続き CPU を使用できるので、これを使用します。
今のところ、すべてが compute_root() でスケジュールされています。
最初の質問ですが、compute_root() と OpenCL gpu を使用した場合、私のプロセスは CopyHtoD と DtoH を使用してデバイス上で計算されますか? (または、ホスト バッファ上にあります)
2 番目の質問は、extern 関数に関連しています。一部のアルゴリズムが Halide にないため、一部の extern 呼び出しを使用します。外部呼び出し:
外部取得: extern "C" int cool_foo(buffer_t * in, int w, int h, int z, buffer_t * out){ .. }
しかし、cool_foo 関数では、私の buffer_t はホスト メモリにのみロードされます。dev アドレスは 0 (デフォルト) です。
アルゴリズムの前にメモリをコピーしようとすると:
それは何もしません。
デバイスメモリのみを利用可能にする場合:
ホスト ポインタは null ですが、デバイス アドレスはまだ 0 です。
(私の場合、dev_dirty は true で、host_dirty は false)
何か案が?
EDIT(dshaletに答えるために)
私のコードの構造は次のとおりです。
CPU でデータを正しく解析します。--> GPU にバッファを送信 (halode_copy_to_dev を使用...) --> Halide 構造体に入力し、パラメータを読み取り、境界条件を追加 --> extern 関数に移動 -->...
extern 関数に有効な buffer_t がありません。すべてを compute_root() でスケジュールしますが、HL_TARGET=host-opencl を使用し、ocl を gpu に設定します。Halide に入る前に、デバイスのアドレスを読み取ることができ、問題ありません。
これが私のコードです:
Halide の前は、すべてが CPU のもの (ポインター) であり、それを GPU に転送しました。
インサイド ハライド:
外側のハライド (Extern 関数):
halide - Halide: OpenCL コード生成
生成された OpenCL コードを含むファイルを Halide で生成することは可能ですか? opencl をターゲットとする Halide プログラムから ac ファイルを生成しようとしましたが、そこに opencl 固有のコードが見当たりません。
編集1:
特に、Halide でカーネルがどのように作成されるかを確認したいと思います。このようなもの:
static char
kernelSourceCode[] =
kernel void test_kernel(int a, int b, __global int *out)
{
out[0] = a + b;
}
編集2:
わかりました、HL_DEBUG_CODEGEN=1 を env 変数に入れ、コード set_target(Target::Debug) に設定します。画面にたくさんのコードが表示されました。そのうちのいくつかは OpenCL コードでしたが、カーネル固有のコードはまだ表示されません。
カーネルについて示す 2 つの行が画面に表示されます。何かあるはずですか?
OpenCL kernel:
/*OpenCL C*/
次に、次の行もあります。
kernel void _at_least_one_kernel(int x) { }
たとえば、次のような関数があるとします。
gradient(x, y) = x + y;
OpenCL をターゲットにしたい場合、関数はカーネル内にありますか?