Я хочу иметь 3d буев в CUDA, вот мой код:Как использовать make_cudaExtent для правильного определения cudaExtent?
#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(©Params));
На самом деле, моя программа работает хорошо. Но я не уверен, что результат правильный. Вот моя проблема, в CUDA liberay, он сказал, что первым параметром make_cudaExtent является «Ширина в байтах», а две другие - высота и глубина элементов. Так что я думаю, что в моем коде выше, пятая строка должна быть
cudaExtent volumeSize = make_cudaExtent(SIZE_X*sizeof(VolumeType), SIZE_Y, SIZE_Z);
Но таким образом, было бы ошибкой «неверный аргумент» в cutilSafeCall (cudaMemcpy3D (& 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), то есть число в байтах, а не число в элементах.
Во многих SDK CUDA они используют char как VolumeType, поэтому они просто используют SIZE_X в качестве первого аргумента в make_cudaExtent. Но мой плавает, так что любой может сказать мне, что это правильный способ создать cudaExtent, если мне нужно использовать его для создания 3D-массива? Большое спасибо!
Мне любопытно, как вы можете написать «На самом деле, моя программа работает хорошо, но я не уверен, что результат правильный». Разве это не противоречие? И как вы не можете быть уверены, что результат «правильный»? Неужели вы знаете, какой должен быть правильный результат? – talonmies
Я имею в виду, что программа может запускать и выводить результат, но я не уверен, что результат правильный. На самом деле мне нужна 3D-текстура, чтобы нарисовать картинку, но я не знаю, какова должна быть картина. И дело в том, как я копирую данные в 3d-массив, описанный выше. Если это не так, я думаю, что результат может иметь некоторые ошибки. – TonyLic