次の問題があります。
非常に基本的な操作を行うコードがあります。マルチスレッドを使用する関数のボトルネックを回避するために、以前に値を格納したかったため、concurrency::array_view へのポインターを渡しています。問題は、次の構造がコンパイルされないことです。
parallel_for_each((*pixels).extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1];
(*pixels)(row, col) = (*pixels)(row, col) * (*taps)(row, col); //this is the problematic place
});
このケースを解決する方法を知っている人はいますか?メソッドを実行する前にデータを準備する必要があるため、RAM とアクセラレータのメモリ間でデータをコピーするのに時間を費やす余裕がないため、このようにする唯一の方法です。
//編集:
ヘッダー ファイルに関するいくつかの問題を解決した後、次の問題が残ります。
parallel_for_each((*pixels).extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1];
});
上記のコードは機能しません (例外が発生します)。たとえば、クラスのコンストラクターが一度だけコピーを処理できるように、以前にデータを準備する方法はありますか? ヘッダー ファイルに array_view へのポインターが必要であり、次のようにコンストラクターで初期化する必要があります。
cci_subset.h:
concurrency::array_view<float, 2> *pixels, *taps;
そして、subset.cpp で:
concurrency::array_view<float, 2> pixels(4, 4, pixel_array);
...
concurrency::array_view<float, 2> taps(4, 4, myTap4Kernel_array);
//編集 2:
parallel_for_each のパラメーターは、値でのみ渡すことができることがわかりました。そのため、クラスを初期化するとき、またはいくつかの引数 (画像データなど) をクラスに渡すときに、CPU から GPU に値をコピーする方法をまだ探しています。