テクスチャを一度宣言して、すべてのカーネルとファイルで使用したいと思います。したがって、ヘッダーとして宣言し、extern
他のすべてのファイルにヘッダーを含めます(SOに従って、externを使用してソースファイル間で変数を共有するにはどうすればよいですか?)
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;
するfile1.cu
とfile2.cu
、コンパイラは再定義があると言います。
編集:
CUDAバージョンでも同じことを試しました5.0
が、同じ問題が発生します。とのアドレスを印刷するtexImage
とfile1.cu
、file2.cu
同じアドレスになりません。変数の宣言に問題があるはずですtexImage
。