配列のセクションを抽出し、そのチャンクを別の配列に設定する必要があります。CUDAで配列の部分を抽出して設定する
たとえば、私はA [32 X 32]のような2次元配列(1d形式)を持っています。別の配列B [64 X 64]があり、Bの(8,8)から始まるBの8X8チャンクをコピーしてAの(8,8)に入れたいと思うでしょう。
現在、オフセットを渡したときにデータの一部を取得するために、おそらくカーネルのようなものを使用します。同様のものを使用してチャンクをより大きな配列に設定することもできます。
__global__ void get_chunk (double *data, double *sub, int xstart, int ystart, int rows, int cols, int subset)
{
int i,j;
i = blockIdx.x * blockDim.x + threadIdx.x;
for (j = 0; j < subset; j++)
sub[i*subset+j] = data[i*cols + (xstart*cols + ystart)+j];
}
私は同じことがcudamemCpy *(おそらくcudamemCpyArray(...))のバリアントを使用して行うことができると思いますが、私はそれを行う方法がわからないです。いくつかのコードサンプルが必要です。
PS私はNVIDIAフォーラムで全く同じ質問をしていましたが、ここで試しても返事がありませんでした。 http://forums.nvidia.com/index.php?showtopic=223386
ありがとうございます。
ありがとう、私は私の質問を編集しました。 – Sayan
@djmj:forループは実際には良いアイデアですが、ユニットストライドを持つループはありません。スレッドごとに複数のコピーが1つだけでなく効率的になります。スレッドのスケジューリングのオーバーヘッドや設定コストを隠すのに役立ちます。 – talonmies
本当ですが、スレッドスケジューリングのパフォーマンスコストはどれくらいですか?ほとんどのソースは、100%占有している間にgpuができるだけ多くのスレッドを使用してビジー状態に保たれるべきだと述べています。 (私は単純な1D配列コピーカーネルを想定していました)。メモリレイテンシは、ここでは100%占有を使用して隠すことができるより大きな問題です。パフォーマンスチャートをご覧ください:http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf#page=30 – djmj