使用cudaMemcpy时出现奇怪错误:cudaErrorLaunchFailure
我有一个CUDA代码,其工作原理如下:使用cudaMemcpy时出现奇怪错误:cudaErrorLaunchFailure,cuda,gpu,Cuda,Gpu,我有一个CUDA代码,其工作原理如下: cpyDataGPU --> CPU while(nsteps){ cudaKernel1<<<,>>> function1(); cudaKernel2<<<,>>> } cpyDataGPU --> CPU cpyDataGPU-->CPU while(nsteps){ 库达克内1 功能1(); cudaKernel2
cpyDataGPU --> CPU
while(nsteps){
cudaKernel1<<<,>>>
function1();
cudaKernel2<<<,>>>
}
cpyDataGPU --> CPU
cpyDataGPU-->CPU
while(nsteps){
库达克内1
功能1();
cudaKernel2
}
cpyDataGPU-->CPU
函数1是这样的:
function1{
cudaKernel3<<<,>>>
cudaKernel4<<<,>>>
cpyNewNeedDataCPU --> GPU // Error line
cudaKernel5<<<,>>>
}
function1{
库达克内尔3
库达克内尔4
cpyNewNeedDataCPU-->GPU//错误行
库达克内尔5
}
根据,此函数可以生成4种不同的错误代码:“cudaSuccess”、“cudaErrorInvalidValue”、“CUDAERRORINvalidDeviceInter”和“cudaErrorInvalidMemcpyDirection”
但是,我收到以下错误:“cudaErrorLaunchFailure”:“执行内核时设备上发生异常。常见原因包括取消引用无效的设备指针和访问越界共享内存。只有在cudathReadExit()之前才能使用该设备。”调用。如果程序要继续使用CUDA,所有现有设备内存分配都无效,必须重新构造。”
有人知道我为什么会犯这个错误吗?
我做错了什么
在以前的内核调用之后复制数据CPU-->GPU有意义吗?问题是,我必须在每一步复制这些数据,因为它可能在每一个“while”步骤中发生变化
Thaks提前了很多时间 调用内核后是否检查错误状态?因为(几乎?)所有cuda调用都可能会从以前失败的调用或内核返回错误。由于您的启动失败,我怀疑拷贝之前的一个内核是错误的真正来源。您链接的文档还显示: 请注意,此函数还可能返回以前异步启动的错误代码 调用
cudaMemcpy()
时,程序将等待前面所有GPU工作完成(请记住内核启动是异步的),然后检查状态,如果一切正常,则执行memcpy。然而,在本例中,您的一个内核失败了
此错误最常见的原因是越界访问,很像x86领域中的segfault
cudaErrorLaunchFailure:执行内核时设备上发生异常。常见的原因包括取消对无效设备指针的引用和访问越界共享内存。在调用cudaThreadExit()之前,无法使用该设备。所有现有设备内存分配无效,如果程序要继续使用CUDA,则必须重新配置
最简单的调试方法是使用cuda memcheck。或者,您可以通过在每次内核启动后调用
cudaDeviceSynchronize()
并检查返回值来确定哪个内核失败。我已经按照您使用cudaDeviceSynchronize()
对我说的那样调试了代码,并且我在以前的内核中有一个错误。。最后我发现了这个bug并修复了它。非常感谢大家的帮助!