0

いくつかのプリミティブと Y 構造体の配列を持つ構造体 X を想定します。

typedef struct 
{ 
   int a;    
   Y** y;
} X;

X のインスタンス X1 はホストで初期化され、cudaMemcpy を介してデバイス メモリ上の X のインスタンス X2 にコピーされます。

これは X のすべてのプリミティブ (int a など) で正常に機能しますが、cudaMemcpy はすべての double ポインターを 1 つのポインターにフラット化するように見えるため、X の構造体配列 (y など) へのアクセスがある場合は常に範囲外の例外が発生します。 .

この場合、cudaMemcpy2D や cudaMemcpyArrayToArray などの別の memcpy 関数を使用する必要がありますか?

提案は大歓迎です。ありがとう!

編集

構造体の配列をコピーするための自然なアプローチ (「それが C だけの場合に私が行うこと」のように) は、配列を cudaMalloc し、次に cudaMalloc して各要素を個別に初期化することです。たとえば、次のようになります。

X** h_x;
X** d_x;
int num_x;

cudaMalloc((void**)&d_x, sizeof(X)*num_x);

int i=0;
for(;i<num_x;i++)
{
    cudaMalloc((void**)d_x[i], sizeof(X));
    cudaMemcpy(&d_x[i], &h_x[i], sizeof(X), cudaMemcpyHostToDevice);
}

ただし、for の cudaMalloc はクラッシュを生成します。私はまだ Cuda 関数でのポインターの使用法に慣れていないことを告白します。

4

1 に答える 1

4

cudaMemcpycudaMemcpy2DおよびcudaMemcpyArrayToArrayすべてホストの連続したメモリ領域からデバイスの連続したメモリ領域にコピーします。

デバイスに送信する中間連続バッファにすべてのデータをコピーする必要があります。

于 2013-07-22T00:41:54.873 に答える