Hi everybody,
I am trying to pass a 3D-array of floats from host to device, which causes some headache, I hope somebody can help me out. So I would like to have an array of, say, 512x512x8 floats. Tried to do this with 3D arrays, but without success so far.
Of course I already read through the threads about this topic and did some google search, but I was not able to figure out how it actually works. I would really appreciate augmenting the documentation a bit.
I tried the following:
#define BUFFER_WIDTH 512
#define MAX_FORCES 8
//....
cudaChannelFormatDesc desc = cudaCreateChannelDesc<float>();
cudaExtent extent = make_cudaExtent( BUFFER_WIDTH, BUFFER_WIDTH, MAX_FORCES );
handleCudaError( cudaMalloc3DArray( &( this->forceWeightArray ), &desc, extent, cudaArrayDefault ) );
cudaMemcpy3DParms params = {0};
params.dstArray = this->forceWeightArray;
params.dstPos.x = 0;
params.dstPos.y = 0;
params.dstPos.z = 0;
params.extent = extent;
params.kind = cudaMemcpyHostToDevice;
params.srcPtr = make_cudaPitchedPtr( (void*)( this->forceWeightData ), BUFFER_WIDTH * sizeof( float ), BUFFER_WIDTH, BUFFER_WIDTH );
handleCudaError( cudaMemcpy3D( ¶ms ) );
cudaMemcpy3D fails with “invalid argument”. I tried different extents, pitches, widths and heights, but couldn’t get it to work.
I’ve got several questions there:
-
extent.width/height/depth in element count, right? for both calls?
-
pitch in bytes, right?
-
width of pitched pointer in element count, right?
-
height of pitched pointer in element count, right?
Can anybody give me a working code snippet on this?
Thanks!
Stumbled across the simpleLayeredTexture sample and finally figured it out: the error was the cudaArrayDefault parameter, which should be cudaArrayLayered.