CUT_CHECK_ERROR 退出但在之前调用cudaGetLastError() 却是cudaSuccess

xinfei_young 2013-01-28 09:23:52
如题,请问是什么原因啊?改怎么改正?这样导致的问题是当数据小的时候可以得到正确结果,当数据比较大的时候,结果不正确。
DataToimaData<<<gridSize1,blockSize1>>> (Gpuimadata,Gpulargedata, nx, ny,imanxdata,imany,m_max);
checkCUDAError("kernel invocation");


cudaError_t err = cudaGetLastError(); \
if( cudaSuccess != err)
{
printf("Cuda error");
}

checkCUDAError("kernel invocation");
CUT_CHECK_ERROR("Kernel execution failed");
前面都是正确的,也没报错,执行最后一句的时候,程序退出,0x75bfd3cf 处最可能的异常: Microsoft C++ 异常: 内存位置 0x06c2b128 处的 cudaError_enum。
...全文
369 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
linxxx3 2013-01-29
lz竟然用了三种检查错误的函数,没有必要。 首先是CUT_CHECK_ERROR退出的问题,应该不是CUDA执行错误,而是这个宏(注意,不是函数)本身使用的有问题,检查cutil.h相关的头文件什么的吧。实在不行就别用这个了,cutil.h里的一些像CUDA_SAFE_CALL之类的宏,你自己抄过来写一个都可以用的,但是包含了这个文件,容易出各种编译链接的问题。 然后,调用 cudaGetLastError() 的时候,不管前面kernel有没有出错,这里都不会报错,因为前面调用了checkCUDAError,checkCUDAError在内部已经调用了cudaGetLastError(),如果查出错误,会将标志位重置为cudaSuccess,再调一次就没用了。
  • 打赏
  • 举报
回复
linxxx3 2013-01-29
引用 3 楼 xinfei_young 的回复:
我找到错误了,是tid越界了,在cpu上是不会出现越界的,但是在GPU上tid虽然逻辑上不会越界,但是还是要做限定
比如用了二维block的情况,tid是Idx * Idy,超出数据的范围是常有的。下标的计算确实比较伤脑筋。
  • 打赏
  • 举报
回复
xinfei_young 2013-01-29
我找到错误了,是tid越界了,在cpu上是不会出现越界的,但是在GPU上tid虽然逻辑上不会越界,但是还是要做限定
  • 打赏
  • 举报
回复
xinfei_young 2013-01-29
我用Parallel Nsight Debug,结果如下: Parallel Nsight Debug Detected MMU fault, Operation : Global Load Page Address : 0xff00000000 blockIdx : {203,187,0} First threadIdx : {0,0,0} 错误位置在device_function.h里的fdividef(float a, float b)里,请问是怎么回事?
  • 打赏
  • 举报
回复
相关推荐
发帖
CUDA
加入

496

社区成员

CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
申请成为版主
帖子事件
创建了帖子
2013-01-28 09:23
社区公告
暂无公告