Wie kann man make_cudaExtent verwenden, um ein cudaExtent korrekt zu definieren?

Ich möchte ein 3D-Float-Array in CUDA haben. Hier ist mein Code:

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

Eigentlich läuft mein Programm gut. Aber ich bin mir nicht sicher, ob das Ergebnis stimmt. Hier ist mein Problem, in der CUDA-Version heißt es, dass der erste Parameter von make_cudaExtent "Breite in Bytes" und die anderen beiden Höhe und Tiefe in Elementen sind. Also denke ich in meinem obigen Code sollte die fünfte Zeile sein

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

Auf diese Weise würde jedoch der Fehler "ungültiges Argument" in cutilSafeCall (cudaMemcpy3D (& copyParams)) auftreten. Warum?

Und ein weiteres Rätsel ist das strcut cudaExtent, dessen Komponentenbreite, wie in der CUDA-Bibliothek angegeben, für "Breite in Elementen, wenn auf den Array-Speicher Bezug genommen wird, in Bytes, wenn auf den linearen Speicher Bezug genommen wird" steht. Ich denke also, dass in meinem Code, wenn ich volumeSize.width beziehe, die Zahl in Elementen sein sollte. Allerdings wenn ich benutze

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

Die volumeSize.width wäre SIZE_X * sizeof (VolumeType) (128 * 4), dh Anzahl in Bytes anstelle von Anzahl in Elementen.

In vielen CUDA-SDKs wird char als VolumeType verwendet, daher wird nur SIZE_X als erstes Argument in make_cudaExtent verwendet. Aber meins ist float, also könnte mir jeder sagen, was der richtige Weg ist, um ein cudaExtent zu erstellen, wenn ich dieses verwenden muss, um ein 3D-Array zu erstellen? Danke vielmals!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage