dev_imageStack の使用に依存します。dev_imageStack は、GPU メモリへのポインタを保持する CPU メモリへのポインタです。dev_imageStack をカーネルに渡して読み取ることができず、カーネルがクラッシュする可能性が高くなります。dev_imageStack[0].. dev_imageStack[X] をカーネルに渡すことができます。これは、GPU メモリへのポインターであるためです。
すべてのフレームをポインターで渡す必要がある場合は、1D 配列を割り当て、カーネル内でフレーム オフセットを実行して正しいフレームを取得することをお勧めします。
unsigned char* dev_imageStack;
cudaMalloc((void**)&dev_imageStack, imageSize*X);
そして、それを使用するときは、Y*imageSize で配列にオフセットしてフレームにアクセスする必要があります。ここで、Y はアクセスするフレームです。
説明した方法と同じようにしたい場合は、次のようにする必要があります。
unsigned char** host_imageStack = new unsigned char*[X];
for(int i = 0; i < X; i++)
{
cudaMalloc( (void**) &host_imageStack[i], imageSize*sizeof(char));
cudaMemcpy(host_imageStack[i], "char_ptr_to_frame_i_on_host", imageSize*sizeof(char),cudaMemcpyHostToDevice);
}
unsigned char** dev_imageStack;
cudaMalloc((void**)&dev_imageStack, X*sizeof(char*));
cudaMemcpy(dev_imageStack,host_imageStack,X*sizeof(char*),cudaMemcpyHostToDevice);
これで、dev_imageStack をカーネルへの 2D ポインターとして使用できるようになりました。フレームとピクセルへのアクセスは、カーネルで dev_imageStack[frame_id][pixel_id] を呼び出すことによって行われます。