我想声明我的纹理一次并在我的所有内核和文件中使用它。因此,我将其声明为extern
头文件,并将头文件包含在所有其他文件中(遵循 SO How do I use extern to share variables between source files?)
我有一个cudaHeader.cuh
包含我的纹理的头文件:
extern texture<uchar4, 2, cudaReadModeElementType> texImage;
在我的file1.cu
中,我分配了我的 CUDA 数组并将其绑定到纹理:
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc< uchar4 >( );
cudaStatus=cudaMallocArray( &cu_array_image, &channelDesc, width, height );
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMallocArray failed! cu_array_image couldn't be created.\n");
return cudaStatus;
}
cudaStatus=cudaMemcpyToArray( cu_array_image, 0, 0, image, size_image, cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpyToArray failed! Copy from the host memory to the device texture memory failed.\n");
return cudaStatus;
}
// set texture parameters
texImage.addressMode[0] = cudaAddressModeWrap;
texImage.addressMode[1] = cudaAddressModeWrap;
texImage.filterMode = cudaFilterModePoint;
texImage.normalized = false; // access with normalized texture coordinates
// Bind the array to the texture
cudaStatus=cudaBindTextureToArray( texImage, cu_array_image, channelDesc);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaBindTextureToArray failed! cu_array couldn't be bind to texImage.\n");
return cudaStatus;
}
中 file2.cu
,我在函数中使用纹理kernel
如下:
__global__ void kernel(int width, int height, unsigned char *dev_image) {
int x = blockIdx.x*blockDim.x + threadIdx.x;
int y = blockIdx.y*blockDim.y + threadIdx.y;
if(y< height) {
uchar4 tempcolor=tex2D(texImage, x, y);
//if(tempcolor.x==0)
// printf("tempcolor.x %d \n", tempcolor.x);
dev_image[y*width*3+x*3]= tempcolor.x;
dev_image[y*width*3+x*3+1]= tempcolor.y;
dev_image[y*width*3+x*3+2]= tempcolor.z;
}
}
问题是当我在file2.cu
. 即使我kernel
直接在 中使用该函数file1.cu
,数据也不正确。
如果我添加:texture<uchar4, 2, cudaReadModeElementType> texImage;
in file1.cu
and file2.cu
,编译器会说有一个重新定义。
编辑:
我用 CUDA 版本尝试了同样的事情,5.0
但出现了同样的问题。如果我打印texImage
infile1.cu
和的地址file2.cu
,我没有相同的地址。变量的声明肯定有问题texImage
。