画像Img1の各ピクセルが画像Img2の対応するピクセルを持つ2つの画像間で操作(追加など)を行いたいとします。対応ベクトルはタプルデルタに格納されます。基本的には次のようなものです:効率的なハライドでのメモリアクセスの収集
Img(x、y)= Img1(x、y)+ Img2(x + Delta [0](x、y)、y + Delta [1](x、y)) ;
これはメモリギャザー操作です。ハライドでそのようなパターンを描写する最良の方法は何でしょうか?それをスケジュールする方法は?
画像Img1の各ピクセルが画像Img2の対応するピクセルを持つ2つの画像間で操作(追加など)を行いたいとします。対応ベクトルはタプルデルタに格納されます。基本的には次のようなものです:効率的なハライドでのメモリアクセスの収集
Img(x、y)= Img1(x、y)+ Img2(x + Delta [0](x、y)、y + Delta [1](x、y)) ;
これはメモリギャザー操作です。ハライドでそのようなパターンを描写する最良の方法は何でしょうか?それをスケジュールする方法は?
それをスケジュールするのは本当に素晴らしい方法ではありません。ギャザーの指示がある場所でも、ギャザーは遅いです。あなたはおそらくまだベクトルxを使ってそれをベクトル化したいので、Img1とDeltaからのアドレス指定の計算と負荷はベクトルを使って行われます。
Img.vectorize(x, 8).parallel(y, 4);
ありがとう、これは間違いなく役立ちます。私はギャザーがパフォーマンスに敏感であることに同意します。私はHWをサポートしていますが、タイルごとに1つのデルタ値にフォールバックする方が賢明でしょう。 –
タプルの代わりに、2つのデルタ値を別の次元にパックすることもできます。デルタ値をデルタ(c、x、y)= select(c == 0、xdelta、 ydelta); Delta.unroll(c); '少なくとも2つの値を互いに隣り合ってメモリに格納します。 –