当 `cudaEventDestroy` returns 来自异步启动的错误代码时如何正确响应?

How to properly respond when `cudaEventDestroy` returns an error code from an asynchronous launch?

我假设我们希望进行错误处理,如 this answer 中所述,我们在其中测试 return 代码,如果不成功则抛出异常。

现在,假设 cudaEventDestroy return 是先前的异步启动的错误,正如文档所指出的那样。

在这种情况下,事件是否已成功销毁?更一般地说,如果任何运行时函数 return 是先前异步启动的错误,我可以期望它们成功完成它们的功能吗?

如果这种情况发生在我的代码中不方便实际处理错误的地方,例如析构函数,我该怎么办?

看来,如果我不希望我的程序随机终止或丢失对错误的跟踪,我将不得不实施一个重复的错误记录系统,在该系统中我可以记录发生在无法记录的地方的错误真正处理它们,并更改样板以进行运行时 API 调用以检查 return 状态和我的重复错误记录系统。这看起来相当尴尬和次优,我希望我遗漏了一些简单的东西。

More generally, can I expect any runtime functions to have successfully completed their function if they return an errors from a previous, asynchronous launch?

总的来说,没有。以前的异步启动导致的许多类型的错误都属于使 CUDA 上下文无效的类型。一旦 CUDA 上下文失效,除了销毁它之外,无法对其进行任何类型的进一步操作。鉴于此,您关于假设 cudaEvent 状态的问题没有实际意义。

What can I do if this happens at a place in my code where it is inconvenient to actually handle the error, such as a destructor?

许多类型的 CUDA 错误是持久性的,尤其是那些反映无效 CUDA 上下文的错误[1]。这些类型的错误无法清除,并且会在任何后续的错误检查中重新出现 activity。除了在那些不方便这样做的地方外,您可以通过全面的错误检查来进行适当级别的错误控制。如果您担心析构函数期间的错误检查 activity 是在应用程序拆卸期间特别出现的,则不清楚这是否是一个问题。

[1]:对于 example

"cudaErrorIllegalAddress = 77 The device encountered a load or store instruction on an invalid memory address. The context cannot be used, so it must be destroyed (and a new one should be created). All existing device memory allocations from this context are invalid and must be reconstructed if the program is to continue using CUDA."

补充说明:

以异步启动示例返回的错误为例,不使 cuda 上下文无效的错误(例如无效的启动配置)应该立即报告并被捕获通过对内核启动进行适当的 CUDA 错误检查,我不希望这些是只能在稍后出现的类型,可能是在析构函数操作期间。在内核执行开始后 一段时间后 发生的大多数错误属于会使 CUDA 上下文无效的类型,并且是持久性的,无法清除。