CUDA内核函数参数不定时出现的错误

__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

为啥不是  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。

粗心害死人,几个小时又过去了,罪过罪过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值