从bug到非bug-记一次debug之旅

虽然严格上说,小弟使用CUDA还不到一年,但是这一年中,被这个“怪物”折磨得够呛,今天的只是再普通不过的小插曲,希望这个过程能够给初学者一些启发。

先看一个例子

CODE:

#include

__global__ void test(int x){
        Int y=x ;
}
int main(){
        int *in;
        int len = sizeof(int);
        cudaMalloc((void**)&in,len);
       
        test<<<5,256>>>(*in);

        cudaFree(in);
}代码很简短,目的只是想把in的值传给x,当然我在项目中遇到的问题代码远比这复杂,这只是为了要说明这个问题而特意写的。使用nvcc编译后,会提示你y只声明但没有使用,编译会通过,但是你在运行时会提示段错误,段错误一般意味着访问越界或者访问了不能或不应该访问的区域。使用cuda-gdb调试会定位到test<<<5,256>>>(*in)这行,但是我当时左看右看,半天都不明白个所以然。很明显内核是在设备上运行,而in是分配在设备上,应当没有任何问题。为什么会出现段错误,这时我想到了编译器解释<<<>>>语法的过程,首先设置网格和块的大小,再将参数从主机传到设备上,再启动内核等等!我声明的in指针是在主机上,但是值却在设备上,这就是问题所在了。知道问题所在了,就好解决了。各位同学想必有自己的解决方案了吧!我的方法如下,你的方法呢?

CODE:

#include

__global__ void test(int *x){
        Int y=*x ;
}
int main(){
        int *in;
        int len = sizeof(int);
        cudaMalloc((void**)&in,len);
       
        test<<<5,256>>>(in);

        cudaFree(in);
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23057064/viewspace-659759/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23057064/viewspace-659759/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值