2012-03-17 28 views
0

配列のセクションを抽出し、そのチャンクを別の配列に設定する必要があります。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

ありがとうございます。

答えて

1

デバイス上のあるアレイから別のアレイにデータをコピーしたいだけの場合は、カーネルは必要ありません。

あなたの元データとホスト・コードであなたに割り当てられたターゲットポインタを使用して、デバイスのポインタを持っている場合:

擬似コード:あなただけをコピーしたい場合は

//source and target device pointers 
double * source_d, target_d; 

//get offseted source pointer 
double * offTarget_d + offset * sizeof(double); 

//copy n elements from offseted source data to target device pointer 
cudaMemcpy(offTarget_d, source_d, n * sizeof(double), cudaMemcpyDeviceToDevice); 

それは明確ではありませんでした1D配列の範囲、または2D配列の各行の範囲を別の2D配列のターゲット行にコピーする場合

+0

ありがとう、私は私の質問を編集しました。 – Sayan

+1

@djmj:forループは実際には良いアイデアですが、ユニットストライドを持つループはありません。スレッドごとに複数のコピーが1つだけでなく効率的になります。スレッドのスケジューリングのオーバーヘッドや設定コストを隠すのに役立ちます。 – talonmies

+0

本当ですが、スレッドスケジューリングのパフォーマンスコストはどれくらいですか?ほとんどのソースは、100%占有している間にgpuができるだけ多くのスレッドを使用してビジー状態に保たれるべきだと述べています。 (私は単純な1D配列コピーカーネルを想定していました)。メモリレイテンシは、ここでは100%占有を使用して隠すことができるより大きな問題です。パフォーマンスチャートをご覧ください:http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf#page=30 – djmj

関連する問題