Como usar o make_cudaExtent para definir um cudaExtent corretamente?

Eu quero ter uma matriz de flutuação 3d em CUDA, aqui está o meu código:

#define  SIZE_X 128 //numbers in elements
#define  SIZE_Y 128
#define  SIZE_Z 128
typedef float  VolumeType;
cudaExtent volumeSize = make_cudaExtent(SIZE_X, SIZE_Y, SIZE_Z); //The first argument should be SIZE_X*sizeof(VolumeType)??

float *d_volumeMem;
cutilSafeCall(cudaMalloc((void**)&d_volumeMem, SIZE_X*SIZE_Y*SIZE_Z*sizeof(float)));

.....//assign value to d_volumeMem in GPU

cudaArray *d_volumeArray = 0;
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<VolumeType>();
cutilSafeCall( cudaMalloc3DArray(&d_volumeArray, &channelDesc, volumeSize) ); 
cudaMemcpy3DParms copyParams = {0};
copyParams.srcPtr = make_cudaPitchedPtr((void*)d_volumeMem, SIZE_X*sizeof(VolumeType), SIZE_X, SIZE_Y); //
copyParams.dstArray = d_volumeArray;
copyParams.extent = volumeSize;
copyParams.kin = cudaMemcpyDeviceToDevice;
cutilSafeCall( cudaMemcpy3D(&copyParams) ); 

Na verdade, meu programa funciona bem. Mas não tenho certeza se o resultado está certo. Aqui está o meu problema, no liberay CUDA, ele disse que o primeiro parâmetro de make_cudaExtent é "Largura em bytes" e os outros dois é altura e profundidade em elementos. Então eu acho que no meu código acima, a quinta linha deve ser

cudaExtent volumeSize = make_cudaExtent(SIZE_X*sizeof(VolumeType), SIZE_Y, SIZE_Z); 

Mas, desta forma, haveria erro "argumento inválido" em cutilSafeCall (cudaMemcpy3D (& copyParams)); Por quê?

E outro quebra-cabeça é o strut cudaExtent, como a biblioteca CUDA afirmou, sua largura componente significa "Width in elements quando se refere à memória do array, em bytes quando se refere à memória linear". Então eu acho que no meu código quando eu me refiro volumeSize.width deve ser o número em elementos. No entanto, se eu usar

 cudaExtent volumeSize = make_cudaExtent(SIZE_X*sizeof(VolumeType), SIZE_Y, SIZE_Z); 

O volumeSize.width seria SIZE_X * sizeof (VolumeType) (128 * 4), que é o número em bytes em vez do número em elementos.

Em muitos SDK CUDA, eles usam char como o VolumeType, então eles só usam SIZE_X como o primeiro argumento em make_cudaExtent. Mas o meu é float, então, alguém poderia me dizer qual é o caminho certo para criar um cudaExtent se eu precisar usar isso para criar uma matriz 3D? Muito obrigado!

questionAnswers(2)

yourAnswerToTheQuestion