Jak użyć make_cudaExtent do poprawnego zdefiniowania cudaExtent?

Chcę mieć tablicę float 3d w CUDA, oto mój kod:

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

Właściwie mój program działa dobrze. Ale nie jestem pewien, czy wynik jest słuszny. Oto mój problem, w liberay CUDA, powiedział, że pierwszym parametrem make_cudaExtent jest „Szerokość w bajtach”, a pozostałe dwa to wysokość i głębokość w elementach. Więc myślę, że w moim kodzie powyżej, piąta linia powinna być

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

Ale w ten sposób w cutilSafeCall wystąpiłby błąd „niepoprawny argument” (cudaMemcpy3D (& copyParams)); Czemu?

Kolejną zagadką jest napis cudaExtent, jak stwierdzono w bibliotece CUDA, jej szerokość komponentu oznacza „szerokość elementów w odniesieniu do pamięci tablicowej, w bajtach w odniesieniu do pamięci liniowej”. Więc myślę, że w moim kodzie, gdy odwołam się do volumeSize.width, powinien on być liczbą w elementach. Jednak jeśli używam

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

Wielkość volumeSize.width to SIZE_X * sizeof (VolumeType) (128 * 4), czyli liczba w bajtach zamiast liczby w elementach.

W wielu CUDA SDK używają char jako VolumeType, więc używają SIZE_X jako pierwszego argumentu w make_cudaExtent. Ale mój jest float, więc każdy może mi powiedzieć, jaki jest właściwy sposób na stworzenie cudaExtent, jeśli muszę go użyć do stworzenia tablicy 3D? Wielkie dzięki!

questionAnswers(2)

yourAnswerToTheQuestion