好吧,又多纠结了一天,还是得问下各位大侠们啊

sand_and_fish 2013-01-16 10:51:25
好吧,我纠结了很多天,实在是不明白为什么会出错?哪位高人大侠大哥大姐能来指导一下么?
贴代码:
__global__ void GetJointEntropyKernel(float * JonEnt, int * ang1, int * ang2, int xDim, int yDim, int zDim ,int Num)
{
int pid = threadIdx.x+blockIdx.x*blockDim.x;
if (pid<Num)
{
float HXY=0.0;
float pxy=0.0;;
int ptNum=0;
int idx,idy,idz;
int vpid;
idx=pid%xDim;
idz=pid/(xDim*yDim);
idy=pid/xDim-idz*yDim;
for (int vi=0;vi<360;vi++)
{
for (int vj=0;vj<360;vj++)
{
for (int k=-6;k<7;k++)
{
for (int j=-6;j<7;j++)
{
for (int i=-6;i<7;i++)
{
if ((i+idx)>=0&&(i+idx)<xDim&&(j+idy)>=0&&(j+idy)<yDim&&(k+idz)>=0&&(k+idz)<zDim)
{
vpid=(idx+i)+(idy+j)*xDim+(idz+k)*xDim*yDim;
if (vpid>=0&&vpid<Num)
{
if (ang1[vpid]==vi&&ang2[vpid]==vj)
{
pxy+=1;
++ptNum;
}
}
}
}
}
}
if (fabs(pxy)>1e-6)
{
HXY+=pxy*log(pxy);
}
}
}
JonEnt[pid]=HXY/(log(2.0)*ptNum)-log(float(ptNum));
}
}

这段代码是为了求取两个变量(不互相独立)的联合熵。
爆出的错误是非法访问,可是我真心不知道这个哪里来的非法访问,下面是爆出来的bug
cudaThreadSynchronize returned error code 6 after launching GetCEKernel!

First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0012fdcc..
First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0012fdc8..
First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0012fdc8..
First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0012fdc8..
First-chance exception at 0x7c812fd3 in myCuda1.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..

我隐隐有个想法:是不是因为我加了两层循环呢?可是为什么加了最外面的两层循环会出这样的问题呢?
谁能来给个提示也行啊,不胜感激涕零落成泥啊
...全文
6006 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
ydlydl888 2014-06-22
  • 打赏
  • 举报
回复
太专业了,很难看懂,努力学习
qq_16764723 2014-06-22
  • 打赏
  • 举报
回复
新手学习。。。。
xiucai007 2014-06-21
  • 打赏
  • 举报
回复
晕,没看懂怎么办?
  • 打赏
  • 举报
回复
CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。在CUDA的架构中,这些计算不再像过去所谓的GPGPU架构那样必须将计算映射到图形API(OpenGL和Direct 3D)中,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。
qq_16677571 2014-06-19
  • 打赏
  • 举报
回复
qq_16677331 2014-06-19
  • 打赏
  • 举报
回复
看不懂。。。。。
qq_16677145 2014-06-19
  • 打赏
  • 举报
回复
楼主问题解决了吗?求助!! !
xing2y 2014-06-19
  • 打赏
  • 举报
回复
wgp0123 2014-06-19
  • 打赏
  • 举报
回复
看了lz的代码以后,不清楚lz是不是明白了gpu并行的原理。每个kernel都可以看做所有线程并行执行的,所以在kernel函数里,就需要做数据的划分,每个线程只处理自己那部分的数据。
shhxi 2014-06-19
  • 打赏
  • 举报
回复
新手不懂顶个
sinat_16691591 2014-06-19
  • 打赏
  • 举报
回复
代码了什么的一直都渣得一塌糊涂...
qq_16690855 2014-06-19
  • 打赏
  • 举报
回复
lz请把调用kernel那行也贴出来,就是 GetJoinxxx<<<x,y,z>>>这种
sinat_16690177 2014-06-19
  • 打赏
  • 举报
回复
好多代码啊 哪里有问退呢
guozihui 2014-06-19
  • 打赏
  • 举报
回复
谢谢 请问那是什么问题怎么解决
qq_16689873 2014-06-19
  • 打赏
  • 举报
回复
看不懂
qq_16689873 2014-06-19
  • 打赏
  • 举报
回复
俺是新来的,来学习的
Js_Amor 2014-06-19
  • 打赏
  • 举报
回复
baidu_16685397 2014-06-19
  • 打赏
  • 举报
回复
看不懂看不懂
qq_15036817 2014-06-19
  • 打赏
  • 举报
回复
新手学习学习
qq_16684383 2014-06-19
  • 打赏
  • 举报
回复
就是注释掉最外面两层循环以后,发现程序可以正常运行,但是加上外面两层就挂掉了,而且这整个程序都是我在串行情况下运行结果正确的,但是放到Gpu上就有了上述错误,这个很诡异!!
加载更多回复(58)

231

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Windows XP
社区管理员
  • CUDA on Windows XP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧