2016-10-25 4 views
0

私はHalideでラジアルベーシス関数を実装していますが、正常に実行している間は非常に遅いです。各ピクセルについて、距離を計算し、この距離の加重和を取って出力を生成する。重みをループするために、私はRDomを使用します(下記参照)。この実装では、すべてのピクセル計算では、多くの(3000+)重みのすべてを再ロードする必要があり、ゆっくりとした速度になります。ハライドの加重和スケジューリング

私の質問は、このインスタンスでHalideのスケジューリング機能を利用する方法です。私の望みは、いくつかの重みをロードし、ピクセルのサブセットの部分加重和を計算し、次の重みのセットをロードし、完了を継続することです。これは、より小さい重みグループごとに局所性を保持します。そのようなことは、Halideが構築するものとまったく同じです。残念ながら、私はこの特定の問題のために何も見つけ出していません。 RDomは、スケジューリングプリミティブより抽象度が低いと思われるので、これをどのようにスケジューリングするかは不明です。

ハライドで加重和を実装するための代替案は歓迎します。 RDomでこれを行う必要はありません、私は他の方法を認識していません。

Func rbf_ctrl_pts("rbf_ctrl_pts"); 
    // Initialization with all zero 
    rbf_ctrl_pts(x,y,c) = cast<float>(0); 
    // Index to iterate with 
    RDom idx(0,num_ctrl_pts); 
    // Loop code 
    // Subtract the vectors 
    Expr red_sub = (*in_func)(x,y,0) - (*ctrl_pts_h)(0,idx); 
    Expr green_sub = (*in_func)(x,y,1) - (*ctrl_pts_h)(1,idx); 
    Expr blue_sub = (*in_func)(x,y,2) - (*ctrl_pts_h)(2,idx); 
    // Take the L2 norm to get the distance 
    Expr dist  = sqrt(red_sub*red_sub + 
           green_sub*green_sub + 
           blue_sub*blue_sub); 
    // Update persistant loop variables 
    rbf_ctrl_pts(x,y,c) = select(c == 0, rbf_ctrl_pts(x,y,c) + 
            ((*weights_h)(0,idx) * dist), 
            c == 1, rbf_ctrl_pts(x,y,c) + 
            ((*weights_h)(1,idx) * dist), 
              rbf_ctrl_pts(x,y,c) + 
            ((*weights_h)(2,idx) * dist)); 
+0

タグを削除しました – Kantthpel

答えて

1

あなたが要因と縮小操作をスケジュールするrbf_ctrl_ptsのIDX寸法に分割またはタイルとrfactorを使用することができます。体重の局所性を得るには、これらのメカニズムを使用する必要があります。私はアソシエーティブ・プロバがその選択を処理することを100%保証しているわけではないので、上記のコードでは選択が何もしていないとは確信していますが、チャネルで展開したり、 cを通り過ぎるまで。

+1

最後の段階はちょうど次のようにしてください: rbf_ctrl_pts(x、y、c)+ =((* weights_h)(c、idx)* dist); –

+0

ありがとうございます。rbf_ctrl_ptsはFuncの定義を理解しただけで、x、y、cの次元しか持っていません。 idxにsplit/tileを使用することはできますが、関数定義に含まれていませんか? – Kantthpel

関連する問題