0

私は AOT コンパイルを使用して、Halide ライブラリを使用せずに Halide コードを使用しています。

HalideRuntime.h (ソースで利用可能) を見ると、.o ファイルで利用可能な extern メソッドが多数あることがわかります。

ハライド dev_mallocハライド dev_freeは非常に興味深いものです。ハライド_コピー_to_devを問題なく使用していますが、メモリが割り当てられていることがわかります。ホストとデバイスの間で単純な memcpy を実行し、代わりに ハライド dev_malloc を使用したい場合、これは可能ですか?

HalideRuntime.h は利用可能なすべての extern 関数をグループ化しましたか、それともオブジェクト ファイルには他の多くの関数が含まれていますか?

ジェイ

4

2 に答える 2

2

HalideRuntime.h は、クライアントが呼び出したり置き換えたりできるすべてのルーチンを文書化することを目的としています。ランタイムには他にも多くのシンボルがありますが、それらは内部的なものと見なす必要があります。最近、これらの他のルーチンを独自の名前空間に移動して、それらが内部であることを示しました。

デバイス バックエンドのランタイムはまだ進行中の作業であり、より多くの柔軟性を可能にし、複数のバックエンドで汎用的に動作しながらコードがより多くのことを実行できるようにすることを目的とした改善された設計が行われる予定です。現在、halide_dev_malloc は、Halide コンパイル時にターゲットを介して選択されたデバイス バックエンドにデバイス ハンドルを割り当てます。ただし、このハンドルはバックエンド固有であるため、それを使用して何かを行うには、使用されているバックエンドと、そのバックエンドがデバイス API とどのようにやり取りしたかを知る必要があります。たとえば、memcpy でハンドルを使用するには、デバイスのバックエンドがある種の統一メモリ アーキテクチャ (「統一仮想アドレス空間」) をサポートしていることを知る必要があります。CUDA 用語で)、デバイス メモリは正しい API 呼び出しで割り当てられ、デバイスと CPU の両方から同じポインタなどでアクセスできるメモリ バッファを作成します。使用しているバックエンドと使用しているプラ​​ットフォームによって異なります。 、それは現在うまくいくかもしれないし、うまくいかないかもしれません。(均一なメモリ設計は、ほとんどの場合、かなり最近のものです。私たちはそれらをサポートするために多くの努力を払っていません。)

CUDA/PTX の場合、halide_dev_malloc は cuMemAlloc を呼び出し、多くのシステムではデフォルトで Unified Virtual Address Space にあると思いますが、よくわかりません。

于 2014-08-22T21:27:57.507 に答える
0

はい、halide_dev_malloc を使用して手動でコピーできます。ハライド_コピー_to_devが実際に行うことについては、 https://github.com/halide/Halide/blob/master/src/runtime/cuda.cpp行 466 を参照してください。

まず、halide_dev_malloc を実行し、次に cuda の cuMemcpyHtoD を使用します。バッファがメモリ内で密集していない場合に備えて、追加のロジックがたくさんありますが、ほとんどの場合、単一の cuMemcpyHtoD になります。

HalideRuntime.h には、便利な extern 関数がすべて含まれていると思います。ハライド_作成_cuda_context のような他のいくつかの内部的なものはおそらく興味深いかもしれません。それらをすべて表示するには、次のフォルダーで、「WEAK」とマークされた、halide_ という名前で始まる関数を探します: https://github.com/halide/Halide/tree/master/src/runtime

または、ハライドで生成されたオブジェクト ファイルに対して nm を実行すると、halide_ で始まるすべてのシンボルが表示されます。

于 2014-08-22T21:19:19.063 に答える