2017-11-04 9 views
0

私はHalide::Runtime::Bufferを持っており、条件を満たす要素を削除したいと考えています。理想的には、操作がその場で行われ、関数が定義できるHalide::Generatorにあります。ハライド:ベクトルから逸脱したフィルタ要素(Halide :: Runtime :: Buffer)

私は縮小を検討しましたが、異なる長さのベクトルを出力できないようです。特定の要素を自分が選択した値にしか設定できません。

これまでのところ、私が動作させる唯一の方法は、extern "C"コールを使用して、ブール型バッファ(1と0をintとして)と一緒にフィルタリングしたいバッファを渡すことでした。バッファーを別のライブラリー(Armadillo)のベクターに読み込み、目的のフィルターを実行してから、フィルタリングされたベクターをハライドに読み戻しました。

このコードでは、Halide::Bufferオブジェクトを渡していますが、Halide::Runtime::Bufferオブジェクトではないため、これを実装する方法がわかりませんHalide::Generator

だから私の質問は2つあり:

  1. は、フィルタリングのこの種は、好ましくはその場で、純粋なハロゲン化物で達成することができますか?
  2. ジェネレータでextern "C"関数を使用する例はありますか?

答えて

1

最初の部分は効果的にストリーム圧縮です。これはHalideで行うことができますが、出力サイズは固定であるか、入力サイズの関数(例えば、入力と同じサイズ)にする必要があります。生成された結果の数を示すために出力として生成された最大インデックスを得ることができます。私はプレフィックス和をストリーム圧縮に基づいて行う方法に関する答えをここに書いています:Halide: Reduction over a domain for the specific values。これをさまざまなターゲット間で並行して最も効率的に行う方法については未解決のことであり、近いうちにそのスペースを探索する作業をしたいと考えています。

これがインプレースかどうかは、Funcの一連のアップデート定義にすべてを入れることができるかどうかによって異なります。例えば。削減は常にバッファを割り当てるため、ハライドフィルタに渡された入力に対してインプレースで実行することはできません。インプットがジェネレーターの内部で生成されている場合は、そうすることができます。

Re:2番目の質問は、define_externを使用していますか?外部関数はhalide_buffer_tで実装する必要があるため、これはHalide::Runtime::Bufferとよく統合されているわけではありませんが、Generator内からアクセスするのはかなり簡単です。このチュートリアルはまだありませんが、テストにはいくつかの例があります。例: https://github.com/halide/Halide/blob/master/test/generator/define_extern_opencl_generator.cpp#L19

と定義:。

https://github.com/halide/Halide/blob/master/test/generator/define_extern_opencl_aottest.cpp#L119

(私はしばらく前にマングルC++名を実装して、これらがextern "C"である必要はありません。ただ、NameMangling::CPlusPlusdefine_externにパラメータをマングリング名を設定し、外部関数の宣言からextern "C"を削除します。これは、中程度のエラークラスをキャッチする外部関数を1つのリンク時型でチェックするので非常に便利です)。

+0

ありがとう!あなたがリンクしているprefix_sumコードを使って作業しています。私は、フィルタリング関数を一般化するため(そしてブール値ベクトルを簡単に合計していくつの出力が存在するかを知ることができるように)、メインベクトルと共にブール値ベクトルをとることが有用であることを発見しました。 – zanbri

関連する問題