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(©Params) );
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!