¿Cómo usar make_cudaExtent para definir un cudaExtent correctamente?

Quiero tener una matriz flotante 3d en CUDA, aquí está mi 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) ); 

En realidad, mi programa funciona bien. Pero no estoy seguro de que el resultado sea correcto. Aquí está mi problema, en el CAYA liberay, dijo que el primer parámetro de make_cudaExtent es "Ancho en bytes" y los otros dos son la altura y la profundidad en elementos. Así que creo que en mi código anterior, la quinta línea debería ser

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

Pero de esta manera, habría un error "argumento inválido" en cutilSafeCall (cudaMemcpy3D (& copyParams)); ¿Por qué?

Y otro rompecabezas es el struda cxtxtxt, como lo dijo la biblioteca CUDA, su ancho de componente significa "Ancho en elementos cuando se refiere a la memoria de matriz, en bytes cuando se refiere a memoria lineal". Así que creo que en mi código cuando refiero volumeSize.width debería ser número en elementos. Sin embargo, si uso

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

El volumeSize.width sería SIZE_X * sizeof (VolumeType) (128 * 4), es decir, número en bytes en lugar de número en elementos.

En muchos SDK de CUDA, usan char como VolumeType, así que solo usan SIZE_X como el primer argumento en make_cudaExtent. Pero el mío es flotante, entonces, cualquiera podría decirme cuál es la forma correcta de crear un cudaExtenso si necesito usar esto para crear una matriz 3D. ¡Muchas gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta