Asynchronous 如何检查在哪个异步CUDA调用中出现哪个CUDA错误?

Asynchronous 如何检查在哪个异步CUDA调用中出现哪个CUDA错误?,asynchronous,error-handling,cuda,Asynchronous,Error Handling,Cuda,假设我们有以下情况: launch_kernel_a(…); 启动内核b(…); cudaDeviceSynchronize(); if(cudaGetLastError()!=CudaSuccess) { //处理错误 ... } 我的理解是,在上述情况下,cudaGetLastError()可能会返回任一内核异步执行期间发生的执行错误。在这种情况下,如何确定是哪个内核在运行时导致错误发生 我的理解是,在上述情况下,cudaGetLastError()可能会返回任一内核异步执行期间发生的执行

假设我们有以下情况:

launch_kernel_a(…);
启动内核b(…);
cudaDeviceSynchronize();
if(cudaGetLastError()!=CudaSuccess)
{
//处理错误
...
}
我的理解是,在上述情况下,
cudaGetLastError()
可能会返回任一内核异步执行期间发生的执行错误。在这种情况下,如何确定是哪个内核在运行时导致错误发生

我的理解是,在上述情况下,
cudaGetLastError()
可能会返回任一内核异步执行期间发生的执行错误

没错。运行时API将返回上次遇到的错误。无法知道异步API调用序列中的哪个调用生成了错误

在这种情况下,如何确定是哪个内核在运行时导致错误发生

你不能。您需要在两次内核启动之间进行某种额外的API调用来确定错误。最糟糕的是调用
cudaDeviceSynchronize()
,尽管如果操作确实重叠,这会序列化操作(尽管我看不到流的使用,所以这里可能不会发生这种情况)


正如注释中所指出的——大多数内核运行时错误都会导致上下文破坏,因此,如果第一个内核出现错误,第二个内核将中止或拒绝运行,这可能对整个应用程序都是致命的。

在最一般的情况下,您不能这样做。如果您愿意插入同步,那么本地化就变得容易了。如果您想使用调试器方法,可以启用调试器在出现故障时启动,这样就可以清楚地知道是哪个内核导致了问题。您也可以使用该方法。如果您正在启动同一内核的两个实例,则即使该方法也无法正确地对其进行本地化。因此,无法在运行时对错误进行本地化?如果说我想重新启动失败的内核,可能使用不同的参数,那么无法确定哪个内核失败了,我必须假设在同步之间启动的所有内核都失败了?我不想重复我自己。我已经把我知道的告诉你了。其他人可能会有更好的建议。此外,您可能希望注意,在运行时以异步方式(即启动后、执行期间)失败的内核将损坏CUDA上下文。这样的上下文在运行时无法用于进一步的“重新启动”工作(或者,实际上,任何CUDA活动),除非您终止并重新启动应用程序或。谢谢,知道内核执行错误本质上是不可恢复的确实为我澄清了很多事情。我应该在这里发布之前检查一下。很抱歉让你重复一遍。