gpt4 book ai didi

c++ - NPP 和 CUDA 错误检查

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:10 32 4
gpt4 key购买 nike

我又一次继承了看起来可疑的代码;基本上是这样的:

(void) nppiFilter...(...);
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess)
{
std::cerr << cudaGetErrorString(err);
}

我们忽略 NPP 错误,而是检查 CUDA 错误。

首先,NPP 是否将 CUDA 错误标志设置为错误?我很确定答案是“不明确”,所以这段代码会错过仅限 NPP 的错误,但我想检查一下。

其次,是否有必要检查这两个错误,或者这是否足够:

NppStatus nppErr = nppiFilter...(...);
if (nppErr != NPP_NO_ERROR)
{
std::cerr << "NPP error " << nppErr;
}

或者我应该检查两者以防万一?有一个 NPP_CUDA_KERNEL_EXECUTION_ERROR 提示我检查 cudaGetLastError() 可能会有用,但它是吗?

最佳答案

First, does NPP set the CUDA error flag on error?

不,它没有。 CUDA 错误状态可能由 NPP 在幕后进行的某些操作设置,但 NPP 并未具体设置 CUDA 错误状态。

Or should I check both just in case?

只需检查 NPP 状态就足够了。但是,如果您想进行额外的调试分析,检查 CUDA 错误状态可能会有用。事实上,当我寻找额外的线索时,我经常运行 cuda-memcheck。唯一正常的值(value)是提供“额外的线索”。

一个安全的假设是,许多 CUDA 库可能具有异步启动工作的函数。也就是说:即使函数已将控制权返回给 CPU 线程,底层 GPU 事件可能仍在发生。在这种情况下,当您进行后续的库调用或 CUDA API 调用(可能是从设备到主机检索计算数据)时,设计良好的库将捕获由于“稍后”的异步事件而导致的错误。

在这种情况下,您无论如何都不能依赖函数的返回值。因此,在整个程序中仔细检查错误是最安全的选择,这包括库 API 级别(例如 NPP)和 CUDA API 级别。但出于生产目的,我会捕获每一个机会进行测试,不一定建议您插入额外的检查,例如:

error = cudaGetLastError();

(除非它紧跟在 CUDA API 调用之后并且这是您的策略**)

我也不建议任意插入:

error = cudaDeviceSynchronize();

但是,如果您正在设计一个库,您可能希望在函数的入口处对上述类型进行某种显式错误检查。

这在某种程度上显然是一个见仁见智的问题。您可能希望将错误检查发挥到极致。它应该不会对您的程序产生太大影响,只要您不插入同步调用来检查错误。

我上面的评论主要是关于我将如何编写生产代码。出于学习目的,或者任何时候您在编写代码时遇到问题,通常最好是 very rigorous about error checking ,并确实插入额外的错误检查以捕获异步错误,以便将错误定位到特定函数。

**您可能希望插入:

error = cudaGetLastError();

在每次内核调用之后,在您的代码中。这将捕获在启动时可检测到的任何内核错误,例如不正确的网格尺寸。这种类型的调用应该是相对轻量级的。

关于c++ - NPP 和 CUDA 错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50458216/

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