CUDA的类型转换计算

global void features_4bin_sparse(uchar* img, int srcWidth,int srcHeight,uchar* locaMat,float* hist,floatvx,floatvy,int* vxp,int* vyp)
{
int best_o;
int y=threadIdx.x;
int x=blockIdx.x;

if (x<gridDim.x-1 && x>0 && y>0 && y<blockDim.x-1)
{

int block0 = blockDim.x/4;
int block1 = gridDim.x/4;

uchar *s = img + min(x, srcWidth-2)*3 + min(y, srcHeight-2)srcWidth3;
int dy = (s+srcWidth3) - (s-srcWidth3); //上下之差
int dx = (s+3) - (s-3); //左右之差
float v = sqrt((float)(dx
dx + dy
dy));
best_o = locaMat[(255-dy)*511+(dx+255)];

if (x==2&&y==10)
{
(hist+2) = best_o; // (hist+2) 得到是0.000000
//
(hist+2) = vxp[x]block0 + vxp[y]; 得到的是2.000000
//
(hist+2) = block0
block1; 得到 13580.000000
//*(hist+2) = vxpblock0 + vxp[y] +block0block1; 得到 13582.000000
// 问题出现了,当我使用下面的时
// (hist+2) = vxp[x]block0 + vxp[y] +block0block1best_o; 得到的是0.000000

}
}

}

最后一个 // (hist+2) = vxp[x]block0 + vxp[y] +block0block1best_o; 得到的是0.000000
为啥不是 2.000000呢,很奇怪

LZ你好,根据你下面的算法,个人感觉:
int y=threadIdx.x; //block 0
int x=blockIdx.x; //block 1
是不是x,y写反了?应该写成:
int x=threadIdx.x; //block 0
int y=blockIdx.x; //block 1
至于后面出现的问题,个人也没想出是什么原因。如果是x,y顺序确实反了,可以调换一下再试试。
能力有限,仅供参考~

好的,谢谢

如果与你目标计算结果有差异,一方面可能是你内核计算的时候,访问内存的位置是不正确的!导致做计算的两个数值不是你期望的!另一个方面,你的内核计算失败了,比如你内存访问出错(越界)。对于楼主出现的这个问题,我建议好好的检查一下数组下标的计算,看看是否访问到了正确的位置,或者在内核后面加上printf(“%s\n”, cudaGetErrorString(cudaGetLastError()))来看看你的内核是否正确被执行了!

嗯,我用cudaGetErrorString(cudaGetLastError())试试,不能printf,在动态库里面的,打印日志打出来的,哈,谢谢

谢谢,已经调试好了,主要是有个输入参数 uchar *dev_localMat 在cudaMalloc时把dev_localMat 写成了dev_src。