【问题标题】:Strange error while using cudaMemcpy: cudaErrorLaunchFailure使用 cudaMemcpy 时出现奇怪的错误:cudaErrorLaunchFailure
【发布时间】:2012-05-05 13:12:34
【问题描述】:

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

cpyDataGPU --> CPU     

while(nsteps){

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

}

cpyDataGPU --> CPU

而function1是这样的:

function1{

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

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

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

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

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

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

提前多谢!!

【问题讨论】:

    标签: cuda gpu


    【解决方案1】:

    您链接的文档还说:

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

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

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

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

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

    【讨论】:

    • 我已经调试了代码,正如你用cudaDeviceSynchronize() 对我说的那样,我在以前的内核中遇到了错误。 ..最后我发现了这个错误并修复了它。非常感谢大家的帮助!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 2020-08-30
      • 2013-05-05
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多