5

我有一个 CUDA 代码,如下所示:

cpyDataGPU --> CPU     

while(nsteps){

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

}

cpyDataGPU --> CPU

而function1是这样的:

function1{

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

    cpyNewNeedDataCPU --> GPU   // Error line
    cudaKernel5<<<,>>>
}

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

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

有没有人知道我为什么会收到这个错误¿?我究竟做错了什么?

在先前的内核调用之后复制数据 CPU-> GPU 是否有意义¿?问题是,我必须在每个步骤中复制该数据,因为它可能会在每个“while”步骤中发生变化。

提前谢谢!

4

2 回答 2

5

您链接的文档还说:

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

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

此错误的最常见原因是越界访问,很像 x86 领域中的段错误。

cudaErrorLaunchFailure :执行内核时设备发生异常。常见原因包括取消引用无效的设备指针和访问越界共享内存。在调用 cudaThreadExit() 之前无法使用该设备。如果程序要继续使用 CUDA,所有现有的设备内存分配都是无效的,必须重新构建。

The easiest way to debug this would be to use cuda-memcheck. Alternatively you can identify which kernel failed by calling cudaDeviceSynchronize() after each kernel launch and checking the return value.

于 2012-04-25T10:20:53.110 回答
2

您是否在调用内核后检查错误状态?因为(几乎?)所有 cuda 调用都可能从​​先前失败的调用或内核返回错误。由于您遇到启动失败,我怀疑副本之前的内核之一是错误的真正来源。

于 2012-04-24T20:51:53.500 回答