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

hor*_*ann 5 cuda gpu gpu-programming

我有一个CUDA代码,其工作方式如下:

cpyDataGPU --> CPU     

while(nsteps){

    cudaKernel1<<<,>>>
    function1();    
    cudaKernel2<<<,>>>

}

cpyDataGPU --> CPU
Run Code Online (Sandbox Code Playgroud)

而function1就像这样:

function1{

    cudaKernel3<<<,>>>
    cudaKernel4<<<,>>>

    cpyNewNeedDataCPU --> GPU   // Error line
    cudaKernel5<<<,>>>
}
Run Code Online (Sandbox Code Playgroud)

根据cudaMemcpy文档,此函数可以产生4种不同的错误代码:“ cudaSuccess”,“ cudaErrorInvalidValue”,“ cudaErrorInvalidDevicePointer”和“ cudaErrorInvalidMemcpyDirection”。

但是,我收到以下错误:“ cudaErrorLaunchFailure”:“执行内核时设备上发生了异常。常见原因包括取消引用无效的设备指针和访问共享内存。在调用cudaThreadExit()之前,无法使用设备所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,则必须对其进行重新构造。”

有人对我为什么会收到此错误有任何想法吗?我究竟做错了什么?

在先前的内核调用¿之后复制数据CPU-> GPU是否有意义?问题是,我必须在每个步骤将数据复制到这里,因为它可能在每个“ while”步骤中都会更改。

提前解冻很多!!

Tom*_*Tom 5

您链接的文档还说:

请注意,此函数还可能返回先前异步启动的错误代码。

调用时cudaMemcpy(),程序将等待所有之前的GPU工作完成(请记住内核启动是异步的),然后检查状态并在一切正常的情况下执行memcpy。但是,在这种情况下,您的一个内核已失败。

此错误的最常见原因是越界访问,就像x86区域中的段错误一样。

cudaErrorLaunchFailure:执行内核时设备上发生了异常。常见原因包括取消引用无效的设备指针和超出范围共享内存。在调用cudaThreadExit()之前,无法使用该设备。所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,则必须对其进行重构。

调试此问题的最简单方法是使用cuda-memcheck。另外,您可以通过cudaDeviceSynchronize()在每次内核启动后调用并检查返回值来确定哪个内核失败。