私は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));
タグを削除しました – Kantthpel