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
    评论
引用提到,当执行CUDA的核函数时,有时候核函数既不执行也不报错。引用指出,这种情况通常是由于显存访问错误导致的。当其他程序占用了大量显存并且同时运行时,再执行CUDA程序时,核函数可能不会执行,导致结果错误。 为了解决这个问题,可以尝试以下解决方案: 1. 检查显存的使用情况,确保没有其他程序占用了过多的显存资源。如果有,可以尝试关闭或减少其使用的显存资源。 2. 如果有多张GPU卡,可以尝试将CUDA程序切换到空闲的GPU卡上执行,这样可能能够避免核函数不执行的问题。 3. 使用cudaGetLastError()函数来检测核函数的执行是否出错。如果出错,可以使用cudaGetErrorString()函数输出错误信息,以便进一步排查和解决问题。 4. 如果以上方法不能解决问题,可以考虑升级显卡驱动程序或CUDA版本,以确保与硬件和软件环境的兼容性。 总之,核函数不执行的问题通常是由于显存访问错误或者其他程序占用显存导致的。通过检查显存使用情况,切换GPU卡执行CUDA程序,以及使用错误检测函数等方法,可以尝试解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [高版本CUDA 在算力低的显卡上不执行核函数如no kernel image is available for execution on the device](https://blog.csdn.net/lumping/article/details/113625816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [CUDA kernel函数不执行、不报错的问题](https://blog.csdn.net/weixin_43414513/article/details/122826254)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值