本人在做关于图像特征提取的项目。基本完工,但是发现一个问题,开始以为是bug,后来觉得是不是cudaHostAlloc(cudaHostAllocPortable)分配的数据(二维float)拷贝到device,再放到texture里浮点的表示方法会改变,导致浮点结果有误差?
具体如下。
//Host端建立一个二维float数组,作为源,数组长宽为width,height(我分别尝试了2种方式,发现结果最后浮点相差大约5%)
- cudaHostAlloc((void **)&img, widthheightsizeof(float),cudaHostAllocPortable);
- img=new float[widthheight];
//对img赋值
…
//在device建立一块空间用于存放这个数据
float Src;
int pitch;
cudaMallocPitch((void*)(&Src), &pitch, widthsizeof(float), (size_t)height));
//将源数据拷贝到device
cudaMemcpy2D(Src,pitch,data,widthsizeof(float),widthsizeof(float), (size_t)height,cudaMemcpyHostToDevice));
//将Src绑定到纹理
texture<float, 2, cudaReadModeElementType> TexInt;
cudaBindTexture2D(0, &TexInt, Src, &channelDesc, width, height , pitch));
//接着我的程序大量访问纹理做计算(有局部性)
…
a =tex2D(TexInt , x1, y1)+tex2D(TexInt , x2, y2)+…
//最后发现程序只改变1和2,其他都没有改变的情况下,最后的结果有所差异。例如后者找到了599个特征点,前者指找到585个。但除了少掉的几个其他特征点的值都正确。
我怀疑是不是cudaHostAlloc分配的空间对浮点数产生了影响?有没有人也碰到过类似的情况和经验。
谢谢