__global__ void features_4bin_sparse(uchar* img, int srcWidth,int srcHeight,uchar* locaMat,float* hist,float*vx,float*vy,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)*srcWidth*3;
int dy = *(s+srcWidth*3) - *(s-srcWidth*3); //上下之差
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) = vxp[x]*block0 + vxp[y] +block0*block1; 得到 13582.000000
// 问题出现了,当我使用下面的时
// *(hist+2) = vxp[x]*block0 + vxp[y] +block0*block1*best_o; 得到的是0.000000
}
}
}
最后一个 // *(hist+2) = vxp[x]*block0 + vxp[y] +block0*block1*best_o; 得到的是0.000000
{
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)*srcWidth*3;
int dy = *(s+srcWidth*3) - *(s-srcWidth*3); //上下之差
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) = vxp[x]*block0 + vxp[y] +block0*block1; 得到 13582.000000
// 问题出现了,当我使用下面的时
// *(hist+2) = vxp[x]*block0 + vxp[y] +block0*block1*best_o; 得到的是0.000000
}
}
}
最后一个 // *(hist+2) = vxp[x]*block0 + vxp[y] +block0*block1*best_o; 得到的是0.000000
为啥不是 2.000000呢,很奇怪
请教别人:
“
如果与你目标计算结果有差异,一方面可能是你内核计算的时候,访问内存的位置是不正确的!导致做计算的两个数值不是你期望的!另一个方面,你的内核计算失败了,比如你内存访问出错(越界)。对于楼主出现的这个问题,我建议好好的检查一下数组下标的计算,看看是否访问到了正确的位置,或者在内核后面加上printf("%s\n", cudaGetErrorString(cudaGetLastError()))来看看你的内核是否正确被执行了! |
”
后来用cudaError_t err = cudaGetLastError();
if( cudaSuccess != err)
{
DH("Cuda error: %s",cudaGetErrorString( err) );
}
打印错误说是参数有问题,
主要是有个输入参数 uchar *dev_localMat 在cudaMalloc时把dev_localMat 写成了dev_src。
粗心害死人,几个小时又过去了,罪过罪过。