cudaGetLastError。哪个内核执行引发了它?

标签 cuda gpu

我已经实现了一个管道,其中许多内核在特定流中启动。内核被排入流中,并在调度程序认为最佳时执行。

在我的代码中,每次内核排队后,我都会通过调用 cudaGetLastError 来检查是否存在任何错误,根据文档,“它返回运行时调用的最后一个错误。此调用还可能返回先前异步的错误代码”发射”。因此,如果内核只是入队,而不是执行,我理解返回的错误仅指内核正确入队(参数检查、网格和 block 大小、共享内存等)。

我的问题是:我将许多不同的内核排入队列,而无需等待每个内核的执行完成。现在想象一下,我的一个内核(我们称之为 Kernel1)中有一个错误,它会导致非法内存访问(例如)。如果我在将其排队后立即检查 cudaGetLastError,则返回值是成功,因为它已正确排队。所以我的 CPU 线程继续移动并继续将内核排队到流中。在某个时刻 Kernel1 被执行并引发非法内存访问。因此,下次我检查 cudaGetLastError 时,我将得到 cuda 错误,但到那时,CPU 线程是代码中的另一个点。因此,我知道出现了错误,但我不知道哪个内核引发了该错误。

一个选项是同步(阻塞 CPU 线程)直到每个内核的执行完成,然后检查错误代码,但出于性能原因,这不是一个选项。

问题是,有什么方法可以查询哪个内核引发了 cudaGetLastError 返回的给定错误代码?如果没有,您认为处理此问题的最佳方法是什么?

最佳答案

有一个environment variable CUDA_​LAUNCH_​BLOCKING 可用于序列化内核启动的异步内核执行序列。这应该允许您通过主机代码中的内部错误检查或通过诸如cuda-memcheck之类的外部工具来隔离导致错误的内核实例。

关于cudaGetLastError。哪个内核执行引发了它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55020514/

相关文章:

graphics - Ubuntu 14.04如何在不安装nvidia驱动的情况下安装cuda 6.5

c++ - 在 Qt 中使用 Cuda 编译出现链接错误

ubuntu - 如何从远程计算机运行CUDA/OpenGL互操作(粒子)示例

cuda - NVIDIA 的 GPU 是大端还是小端?

python - Tensorflow 2.3.0 未检测到 GPU

cuda - 神秘的CUDA分析器错误

c++ - 将数据从较小的 vector 复制到较大的 vector

python - cuda python GPU numbapro 3d循环性能不佳

javascript - 有没有办法通过 JavaScript 来访问网页的一部分是否正在屏幕上呈现?

gpu - OpenACC 红黑 Gauss-Seidel 比 CPU 慢