- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我又一次继承了看起来可疑的代码;基本上是这样的:
(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/
NPP 函数,更具体的 npps ( https://docs.nvidia.com/cuda/npp/group__npps.html ) 是否可以作为设备函数调用? 如果我创建一个全局函数,我可以
我使用 Npp (Notepad++) 编译 Tex 文件。但是每次我重新打开任何 tex 文件时,Npp 都无法识别它并使用另一种语言来突出显示,我必须自己选择语言 -> tex。因为我仅将 Npp
我在 npp 中的问题是,当我添加退格时,它会添加缩进。例如,我正在插入一个退格键,如链接图片所示: Npp 在开头添加自动空格... 由于这是一个固定长度的记录,它会破坏文件。如何禁用此行为? 感谢
我正在使用 Notepad++ 风格的正则表达式。这个... Find: ([^`]{1,23} ) Replace: $0\n ...接受这个输入字符串... Now is the time for
我在尝试为一些 NPP icc 函数创建静态包装器以从 cGo (Golang) 环境中调用它们时遇到了问题。 我能够使用提供的静态 NPP 库创建和编译(C 语言)可执行文件,并且运行良好。然后我将
我一直在尝试通过 Python 访问 Nvidia Performance Primitives 库,我在这个网站上找到了一个非常有用的教程,最后更新于 2011 年:http://openvidia
CUDA NPP 库支持使用 nppiFilter_8u_C1R 命令过滤图像,但不断出现错误。我可以毫无问题地启动并运行 boxFilterNPP 示例代码。 eStatusNPP = nppiFi
我正在尝试使用 NVIDIA NPP 来试验一些图像大小调整例程。我想调整到一个精确的尺寸。我一直在研究使用 NVIDIA NPP 调整图像大小,但它的所有调整大小函数都采用 X 和 Y 维度的比例因
我正在尝试使用 Nvidia 性能基元库来调整图像大小,但 nppiResize_8u_C3R 函数抛出一个 NPP_RESIZE_FACTOR_ERROR,该错误未在文档中列为一个该函数的错误返回码
我正在尝试对图像中的所有像素求和,并使用 CUDA NPP 库获取所有像素的平均值。我的图像是尺寸为 w256 x h1024 的 8 位 unsigned char 灰度图像。我已尝试遵循声明指针并
我又一次继承了看起来可疑的代码;基本上是这样的: (void) nppiFilter...(...); cudaError_t err = cudaGetLastError(); if (err !=
问题在标题中:我在 Npp 中打开了很多文件,并且只想通过 Alt+F6 编译最左边的文件(NppExec-Plugin),我正在用 ConTeXt 编译 tex 文件。 目前我的命令是: cd $(
我在 Windows 7 下使用 Notepad++。我曾经为 Perl 应用程序使用 npp.exec 插件,它在以下代码中运行良好: SET OUTFILE = C:\00_Data\output
尝试学习 Regex 子程序。我制作了这个正则表达式来匹配 IP 地址。它在 Notepad++ 中工作,但是当我在网络中的 PCRE 测试器中尝试它时,它只匹配最后一组中最多 2 个数字的 IP。你
因为我的插件需要使用 JavaScript 代码与同一页面上的其他插件进行交互:obj1.invokeWith(obj2) 在此方法中,obj2 的一个 NPObject 对象被传递给 obj1。如何
我有一个 8 位 unsigned char 图像,它是灰度的(值在 0-255 之间),我想使用 NPP CUDA 库文档,它提供了一些函数,例如 nppiSum_8u64s_C1R,找到所有像素的
在Nvidia Performance Primitives (NPP) CUDA SDK distribution中的图像处理实例,图像通常作为 ImageCPU 对象存储在 CPU 上,图像通常作
CUDA 构建的 NPP 库是仅使用 freeImage 还是我可以使用其他结构或仅使用 unsigned char *image 作为 NPPs 函数的输入。 我提出这个问题的原因是 NPP 的所有
我用 C 编写了一个 NPAPI 插件,它需要调用 NPN_Invoke 功能 (为了调用 JavaScript 函数)。 但是 NPN_Invoke() 需要 NPP实例作为参数。 只有 NP_Ne
Nvidia Performance Primitives (NPP)提供 nppiFilter 函数,用于将用户提供的图像与用户提供的内核进行卷积。对于一维卷积核,nppiFilter 可以正常工作
我是一名优秀的程序员,十分优秀!