gpt4 book ai didi

c++ - `cudaEventDestroy` 异步启动返回错误码时如何正确响应?

转载 作者:行者123 更新时间:2023-11-28 00:19:30 25 4
gpt4 key购买 nike

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

现在,假设 cudaEventDestroy 从之前的异步启动中返回一个错误,正如文档中指出的那样。

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

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

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

最佳答案

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

[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 上下文无效的类型,并且是持久的,无法清除。

关于c++ - `cudaEventDestroy` 异步启动返回错误码时如何正确响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com