2017-08-25 6 views
0

私はハライドを介して手を調整したc関数を再作成しようとしていました。これは、ソース画像の垂直走査線で行われる一連のヒストグラムである。私はソースイメージを反復するために1次元RDomを使用しています。私はcompute_atでそれをスケジュールすることができますのでプリフェッチスケジューリングをハロゲン化物更新ステージ

RDom reductionY(0, input.height()); 

    parade(x,y,c) = Halide::cast<uint16_t>(0); 
    parade(x, input(x, reductionY, c), c) += Halide::cast<uint16_t>(1); 

局所性を高めるために、私は別のFUNCでRDOMをラップしています。

wrapper(x,y,c) = parade(x, y, c); 

    parade.update(0).reorder(c, reductionY, x); 
    parade.update(0).split(x, x_outer, x_inner, THREADWIDTH); 

    parade.compute_at(wrapper, x_outer); 

この(プラス私はこの質問のために取り除かきたいくつかのベクトル化/並列化)密接に私の手にチューニング元に一致します。私がスケジューリングする方法を理解できないという元の利点の1つは、更新(0)ステージの入力から各垂直ラインの最初の読み取りをプリフェッチすることです。私が予定している場合

parade.update(0).prefetch(inputParam, x_inner, 3); 

それは読み込むすべてのピクセルを先読みしているようですか?私の希望は最初のピクセルを読み取るための単一のプリフェッチを発行することです。一見

答えて

0

、あなたが投稿したコードが完了したことを思えません:paradewrapperx_outer次元で計算されますが、wrapperは、このようなディメンションを作成するために分割されていません。正確なコードを見ると助けとなるでしょう。また、print_loop_nestの両方を見つけて、正確な構造を見て、プリフェッチをどこで実行するのかを知るのに役立つ、下位のステートメントファイルにコンパイルすることもできます。

私は、使用されたデータのサブセットに対してのみプリフェッチを発行できるとは思っていません。論理的には、特定の粒度で使用されるデータブロック全体に適用されます。 1つのピクセルではなく、列全体を先読みしているためにパフォーマンスが低下していますか?単一のピクセルを明示的にプリフェッチすることは、ハードウェアプリフェッチャが投機的に列全体をフェッチすることを引き起こす可能性がある場合にのみ役立つようである。

これは、現在のHalideモデルでは表現できない場合ですが、Halide-devリストと共有するか、ターゲットプラットフォーム用の簡単な再生プログラムを使用してGitHubの問題として共有する必要があります(x86?)。

関連する問題