【发布时间】:2019-03-07 22:52:35
【问题描述】:
我已经实现了一个管道,其中许多内核在特定流中启动。内核被排入流中,并在调度程序决定最佳时执行。
在我的代码中,在每次内核入队之后,我通过调用 cudaGetLastError 检查是否有任何错误,根据文档,“它从运行时调用返回最后一个错误。这个调用也可能从以前的异步返回错误代码发射”。因此,如果内核只是入队而不执行,我理解返回的错误仅指内核正确入队(参数检查、网格和块大小、共享内存等...)。
我的问题是:我将许多不同的内核排入队列,而无需等待每个内核的执行完成。现在想象一下,我的一个内核(我们称之为 Kernel1)中有一个错误,它会导致非法内存访问(例如)。如果我在入队后立即检查 cudaGetLastError,则返回值为成功,因为它已正确入队。所以我的 CPU 线程继续前进并继续将内核排队到流中。在某些时候 Kernel1 被执行并引发了非法内存访问。因此,下次我检查 cudaGetLastError 时,我会得到 cuda 错误,但到那时,CPU 线程是代码中的另一个点。因此,我知道有一个错误,但我不知道是哪个内核引发了它。
一个选项是同步(阻塞 CPU 线程)直到每个内核的执行完成,然后检查错误代码,但出于性能原因,这不是一个选项。
问题是,有什么方法可以查询哪个内核引发了 cudaGetLastError 返回的给定错误代码?如果不是,您认为最好的处理方法是什么?
【问题讨论】: