I have a problem with the cudaMemcpy2DtoArray Function that throws a Invalid Argument exception (or Error)
i get a pointer to an “unsigned char” array. The size is widthheight3. This array should be mapped into a texture of size widthheight. I.e. this means every texel consists of uchar3, but this isn’t allowed. Due to this fact, i want to map the first 2 chars into a texture and the last one into another texture of size widthheight.
My solution was to create two 2D-CUDA-Arrays, one of type uchar2 and one of type uchar1. This wasn’t a problem, but then i have to memcopy. I have to cut out the the first two chars; for this issue i used the cudaMemcpy2DToArray function. Compiling isn’t a problem, but at the execution I get an invalid argument exception.
Here is the code for the first two chars
int width=1920,height=1080; unsigned char* inbuffer; texture<uchar2, 2, cudaReadModeNormalizedFloat> tex; cudaArray *d_2DArray; // Define ChannelDescriptions cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<uchar2>(); //Setting Texture Parameters tex.addressMode = cudaAddressModeClamp; tex.addressMode = cudaAddressModeClamp; tex.filterMode = cudaFilterModeLinear; tex.normalized = false; // access with normalized texture coordinates // allocate array and copy image data CUDA_SAFE_CALL( cudaMallocArray( &d_2DArray, &channelDesc, width, height )); CUDA_SAFE_CALL( cudaMemcpy2DToArray( d_2DArray, 0, 0, inbuffer,3*sizeof(unsigned char),2*sizeof(unsigned char),width*height, cudaMemcpyHostToDevice));
I think, I tried almost all I could imagine. (cudaMalloc3DArray, only the first line, etc.) I might be possible that the memcpy2d function wasn’t aimed for this issue. Maybe anyone has a solution for this problem.