CUDA lié une texture a un CudaArray
Bonour,
J'utilise CUDA 2.0 sur une Geforce 9800GT.
Mon problème est relativement simple:
je Charge des données provenant d'un fichier raw dans une tableau 1D que je copie ensuite dans un cudaArray 3D
Je lie ensuite le cudaArray avec une texture 3D
Le probème est que la texture ne contient que des zeros .
Je pense donc que ma texture n'est pas correctement chargée
Je copie les données du tableau 1D dans le CudaArray 3D comme suit:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<unsigned char>();
CUDA_SAFE_CALL( cudaMalloc3DArray(&d_volumeArray, &channelDesc, volumeSize) );
// The sample does not work with pageable memory
// This is a known issue for beta that will be fixed for the public release
#define USE_PAGE_LOCKED_MEMORY 1
#if USE_PAGE_LOCKED_MEMORY
// copy to page-locked mem
cudaPitchedPtr pagelockedPtr;
pagelockedPtr.pitch = volumeSize.width*sizeof(unsigned char);
pagelockedPtr.xsize = volumeSize.width;
pagelockedPtr.ysize = volumeSize.height;
size_t size = volumeSize.width*volumeSize.height*volumeSize.depth*sizeof(unsigned char);
CUDA_SAFE_CALL( cudaMallocHost(&(pagelockedPtr.ptr), size) );
memcpy(pagelockedPtr.ptr, h_volume, size);
#endif
cudaMemcpy3DParms copyParams = {0};
#if USE_PAGE_LOCKED_MEMORY
copyParams.srcPtr = pagelockedPtr;
#else
copyParams.srcPtr = make_cudaPitchedPtr((void*)h_volume, volumeSize.width*sizeof(uchar), volumeSize.width, volumeSize.height);
#endif
copyParams.dstArray = d_volumeArray;
copyParams.extent = volumeSize;
copyParams.kind = cudaMemcpyHostToDevice;
CUDA_SAFE_CALL( cudaMemcpy3D(©Params) ); |
Declaration:
Code:
1 2
|
texture<unsigned char, 3, cudaReadModeNormalizedFloat> tex; // 3D texture |
Lien entre la texture et le CudaArray
Code:
1 2 3 4 5 6 7 8 9
|
// set texture parameters
tex.normalized = true; // access with normalized texture coordinates
tex.filterMode = cudaFilterModeLinear; // linear interpolation
tex.addressMode[0] = cudaAddressModeClamp; // wrap texture coordinates
tex.addressMode[1] = cudaAddressModeClamp;
// bind array to 3D texture
CUDA_SAFE_CALL(cudaBindTextureToArray(tex, d_volumeArray, channelDesc)); |
SVP pouvez vous me dire ce qui semble ne pas être fait correctement?