使用cudaMemcpy时出现奇怪错误:cudaErrorLaunchFailure

使用cudaMemcpy时出现奇怪错误:cudaErrorLaunchFailure,cuda,gpu,Cuda,Gpu,我有一个CUDA代码,其工作原理如下: cpyDataGPU --> CPU while(nsteps){ cudaKernel1<<<,>>> function1(); cudaKernel2<<<,>>> } cpyDataGPU --> CPU cpyDataGPU-->CPU while(nsteps){ 库达克内1 功能1(); cudaKernel2

我有一个CUDA代码,其工作原理如下:

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并修复了它。非常感谢大家的帮助!