我正在使用纹理对象来访问PGM图像像素。我的愿望是让纹理获取给定坐标中的像素值,如果我超出边界,则为0。
这是我的纹理描述:
unsigned char *device_input=NULL;
size_t input_pitch;
checkCudaErrors(cudaMallocPitch(&device_input, &input_pitch, sizeof(unsigned char)*IMAGE_WIDTH, IMAGE_HEIGHT));
checkCudaErrors(cudaMemcpy2D(device_input, input_pitch, image, sizeof(unsigned char)*IMAGE_WIDTH, sizeof(unsigned char)*IMAGE_WIDTH, IMAGE_HEIGHT, cudaMemcpyHostToDevice));
cudaResourceDesc resDesc;
memset(&resDesc, 0, sizeof(resDesc));
resDesc.resType = cudaResourceTypePitch2D;
resDesc.res.pitch2D.devPtr = device_input; //
resDesc.res.pitch2D.pitchInBytes = input_pitch;
resDesc.res.pitch2D.width = IMAGE_WIDTH;
resDesc.res.pitch2D.height = IMAGE_HEIGHT;
resDesc.res.pitch2D.desc = cudaCreateChannelDesc<unsigned char>();
cudaTextureDesc texDesc;
memset(&texDesc, 0, sizeof(texDesc));
texDesc.readMode = cudaReadModeElementType;
texDesc.normalizedCoords=false;
texDesc.addressMode[0]=cudaAddressModeBorder;
texDesc.addressMode[1]=cudaAddressModeBorder;
cudaTextureObject_t tex;
cudaCreateTextureObject(&tex, &resDesc, &texDesc, NULL);
然而,在我的内核中:
tex2D<unsigned char>(tex_inputImage,-100,-100)
显然在图像边界之外的返回图像[0,0]而不是值0的值。
同样适用于:
tex2D<unsigned char>(tex_inputImage,IMAGE_WIDTH+1,IMAGE_HEIGHT+1)
返回图像[IMAGE_WIDTH,IMAGE_HEIGHT]的值而不是0。
请注意,通过使用标准化坐标,cudaAddressModeBorder按预期工作,但我不想使用标准化坐标。根据nvidia的编程指南(Here),非标准化坐标支持cudaAddressModeBorder。
我做错了吗?答案 0 :(得分:3)
以下是我自己的问题的答案:
该程序在驱动程序版本为319.32的计算机上运行,显然驱动程序在使用常规坐标(More on the problem here - check the last couple of replies)时遇到cudaAddressModeBorder
处理cudaAddressModeClamp
的错误。
错误在版本319.49中得到修复,cudaAddressModeBorder
按预期工作,包括标准化和非标准化坐标。