Как использовать make_cudaExtent для правильного определения cudaExtent?

Я хочу иметь массив с плавающей точкой в CUDA, вот мой код:

#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) ); 

На самом деле, моя программа работает хорошо. Но я не уверен, что результат правильный. Вот моя проблема, в Libra CUDA, он сказал, что первый параметр make_cudaExtent это "Ширина в байтах" и два других - высота и глубина в элементах. Так что я думаю, что в моем коде выше, пятая строка должна быть

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

Но в этом случае будет ошибка "неверный аргумент" в cutilSafeCall (cudaMemcpy3D (& amp; copyParams)); Зачем?

И еще одна загадка - strcut cudaExtent, как указано в библиотеке CUDA, ширина его компонента означает «ширина в элементах при обращении к памяти массива, в байтах при обращении к линейной памяти». Поэтому я думаю, что в моем коде, когда я ссылаюсь на volumeSize.width, это должно быть число в элементах. Однако, если я использую

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

VolumeSize.width будет SIZE_X * sizeof (VolumeType) (128 * 4), то есть число в байтах вместо числа в элементах.

Во многих CUDA SDK они используют char в качестве VolumeType, поэтому они просто используют SIZE_X в качестве первого аргумента в make_cudaExtent. Но у меня есть float, так что любой может сказать мне, какой правильный способ создать cudaExtent, если мне нужно использовать это для создания 3D-массива ?? Большое спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос