【问题标题】:NPP and CUDA error checkingNPP 和 CUDA 错误检查
【发布时间】:2018-05-22 09:16:35
【问题描述】:

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

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

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

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

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

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

或者我应该同时检查以防万一?有一个NPP_CUDA_KERNEL_EXECUTION_ERROR 向我暗示,也许检查cudaGetLastError() 会很有用,但它是吗?

【问题讨论】:

    标签: c++ cuda npp


    【解决方案1】:

    首先,NPP 是否在错误时设置 CUDA 错误标志?

    不,它没有。 CUDA 错误状态可能是由 NPP 在后台执行的操作设置的,但 NPP 并没有专门设置 CUDA 错误状态。

    或者我应该同时检查以防万一?

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

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

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

    error = cudaGetLastError();
    

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

    我也不建议随意插入:

    error = cudaDeviceSynchronize();
    

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

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

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

    **您可能希望插入:

    error = cudaGetLastError();
    

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

    【讨论】:

    • 感谢您的信息;在实际代码中,我对每个 API 使用 this technique,现在对 NPP 检查使用类似的,另外还有一个 #ifdef __cplusplus throw std::runtime_error(cudaGetErrorString(err)); #else exit(-1); #endif。我还有一个#define 用于在cudaGetLastError() 之前执行cudaDeviceSynchronize() 以进行更好的调试。 (顺便说一句,幸运的是继承的 NPP 代码不会像我之前得到的 CUDA 代码那样失败)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2012-02-28
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多