いくつかのプリミティブと 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 関数でのポインターの使用法に慣れていないことを告白します。