C++Amp を使用して畳み込みフィルターを並列化しようとしています。次の関数が機能するようにしたいと思います (適切に実行する方法がわかりません)。
float* pixel_color[] = new float [16];
concurrency::array_view<float, 2> pixels(4, 4, pixel_array), taps(4, 4, myTap4Kernel_array);
concurrency::array_view<float, 1> pixel(16, pixel_color); // I don't know which data structure to use here
parallel_for_each(
pixels.extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1];
pixels(row, col) = taps(row, col) * pixels(row, col);
pixel[0] += pixels(row, col);
});
pixel_color.synchronize();
pixels_.at<Pixel>(j, i) = pixel_color
}
主な問題は、ピクセル構造を適切に使用する方法がわからないことです ( 16 個の要素すべてが必要ないため、ここで使用する同時データ構造はどれですか)。この方法で値を安全に追加できるかどうかはわかりません。次のコードは機能しません。ピクセル [0] に適切な値が追加されません。私も定義したいと思います
concurrency::array_view<float, 2> pixels(4, 4, pixel_array), taps(4, 4, myTap4Kernel_array);
メソッドの外側 (ヘッダー ファイルなど) に置き、コストラクタまたはその他の関数で初期化します (これはボトルネックであり、CPU と GPU の間でデータをコピーするのに多くの時間がかかるため)。誰もこれを行う方法を知っていますか?