1

次のような CPU 側のデータのソースがあるとします。

vector< vector<int> > cpuBlobOData;

内部のすべての行ベクトルが同じサイズ (ギザギザではないギザギザの 2D ベクトル) であると仮定します。

これを配列内の GPU メモリの単一ブロックにコピーしたいと考えています。これを行ごとに行う方法はありますか?このようなもの:

array<int, 2> gpuArray(cpuBlobOData.size(), numColumns);
for(size_t i=0; i<cpuBlobOData.size(); ++i)
{
    auto cpuRow = cpuBlobOData[i];
    concurrency::copy(cpuRow.begin(), cpuRow.end(), &gpuArray[i]);
}

私はこれがコンパイルされないことを知っています。それは私がやろうとしていることを示しています。これを達成するものはありますか?私が見つけた唯一の解決策は、cpu ベクトルを 1D ベクトルにコピーし、それを array_view にマップするか、配列にコピーすることでした。

それは機能しますが、無駄が多く、一部のアルゴリズムでは、連続する 1D ベクトルが残りのメモリ空間に収まらない場合があります。

私はAMPを理解するのに苦労しているので、どんなアドバイスも大歓迎です.

4

1 に答える 1

2

はい、行ごとにコピーできます。あなたの解決策はほぼそこにあります。concurrency::copy:の行のgpuArrayから'&'を削除するだけです。

array<int, 2> gpuArray(cpuBlobOData.size(), numColumns);
for(size_t i=0; i<cpuBlobOData.size(); ++i)
{
    auto cpuRow = cpuBlobOData[i];
    concurrency::copy(cpuRow.begin(), cpuRow.end(), gpuArray[i]);
}

何が起こるかというとarray<int,2>、添え字演算子でアクセスするとarray_view<int,1>、行'i'を表すが返されます。これは「射影」と呼ばれます。詳細については、C++AMPプロジェクションについて詳しく説明しているブログ投稿をご覧ください。

于 2012-12-10T03:24:37.360 に答える