これは簡単な質問ですが、私は答えを見つけることができませんでした。'array'タイプのクラスメンバーを使用
あるクラスメソッドが呼び出されたときにメモリがGPUで定期的に処理される大きなメモリブロックを管理するC++クラスが必要です。クラスのコンストラクタには配列のサイズが渡され、構築後には配列のサイズは変わりません。 parallel_for_eachを実行するメソッドは、必要でないときにプロセッササイクルやメモリを無駄にするべきではありません。
どうすればよいですか?
並行処理::配列をクラスメンバーとして作成することはできません。なぜなら、配列が作成される前の大きさを知る必要があるからです。 parallel_for_eachに指定する方法がわからないので、並行性::配列へのポインタであるメンバを持つことはできません(そして、それをコンストラクタなどで 'new'で割り当てる)ことはできません。
通常、GPUとホストの間で配列をコピーする必要はありませんが、何らかの理由でそれを行う必要がある場合は、定期的に行われない限り問題ありません。そうしないと、アレイのサイズに応じてプロセッササイクルとメモリが無駄になります。
ここに私が欲しいもののようなものの例があります。もちろん、parallel_for_eachでキャプチャされた参照/ポインタは間違っています。 (これは、構文がチェックされません):
class MyClass
{
int* myHostArrayPtr;
concurrency::array<int,1>* myGpuArrayPtr;
MyClass(int size)
{
myHostArrayPtr = new int(size);
memset(myHostArrayPtr,0,size * sizeof(int));
myGpuArrayPtr = new concurrency::array<int,1>(size,myHostArrayPtr);
}
void ProcessInGpu()
{
parallel_for_each(
myGpuArrayPtr->extent,
[&myGpuArrayPtr](index<1> i) restrict(amp)
{
myGpuArray[i]+=14;
}
);
}
};
テンプレートパラメータは一定でなければならないので、これはまだハードコードされた配列サイズです。 – Digiproc