Nvidia NPP nppiFilter 在与 2d 内核卷积时产生垃圾

2024-01-03

Nvidia 性能基元 (NPP) http://developer.nvidia.com/cuda/nvidia-performance-primitives提供了nppiFilter用于将用户提供的图像与用户提供的内核进行卷积的函数。对于一维卷积核,nppiFilter工作正常。然而,nppiFilter正在为 2D 内核生成垃圾图像。

I used the typical Lena image as input: enter image description here


这是我的实验1D卷积核,产生良好的输出。

#include <npp.h> // provided in CUDA SDK
#include <ImagesCPU.h> // these image libraries are also in CUDA SDK
#include <ImagesNPP.h>
#include <ImageIO.h>

void test_nppiFilter()
{
    npp::ImageCPU_8u_C1 oHostSrc;
    npp::loadImage("Lena.pgm", oHostSrc);
    npp::ImageNPP_8u_C1 oDeviceSrc(oHostSrc); // malloc and memcpy to GPU 
    NppiSize kernelSize = {3, 1}; // dimensions of convolution kernel (filter)
    NppiSize oSizeROI = {oHostSrc.width() - kernelSize.width + 1, oHostSrc.height() - kernelSize.height + 1};
    npp::ImageNPP_8u_C1 oDeviceDst(oSizeROI.width, oSizeROI.height); // allocate device image of appropriately reduced size
    npp::ImageCPU_8u_C1 oHostDst(oDeviceDst.size());
    NppiPoint oAnchor = {2, 1}; // found that oAnchor = {2,1} or {3,1} works for kernel [-1 0 1] 
    NppStatus eStatusNPP;

    Npp32s hostKernel[3] = {-1, 0, 1}; // convolving with this should do edge detection
    Npp32s* deviceKernel;
    size_t deviceKernelPitch;
    cudaMallocPitch((void**)&deviceKernel, &deviceKernelPitch, kernelSize.width*sizeof(Npp32s), kernelSize.height*sizeof(Npp32s));
    cudaMemcpy2D(deviceKernel, deviceKernelPitch, hostKernel,
                     sizeof(Npp32s)*kernelSize.width, // sPitch
                     sizeof(Npp32s)*kernelSize.width, // width
                     kernelSize.height, // height
                     cudaMemcpyHostToDevice);
    Npp32s divisor = 1; // no scaling

    eStatusNPP = nppiFilter_8u_C1R(oDeviceSrc.data(), oDeviceSrc.pitch(),
                                          oDeviceDst.data(), oDeviceDst.pitch(),
                                          oSizeROI, deviceKernel, kernelSize, oAnchor, divisor);

    cout << "NppiFilter error status " << eStatusNPP << endl; // prints 0 (no errors)
    oDeviceDst.copyTo(oHostDst.data(), oHostDst.pitch()); // memcpy to host
    saveImage("Lena_filter_1d.pgm", oHostDst); 
}

Output of the above code with kernel [-1 0 1] -- it looks like a reasonable gradient image: enter image description here


然而,nppiFilter如果我使用,输出垃圾图像2D卷积核。以下是我为使用 2D 内核运行而对上述代码进行的更改[-1 0 1; -1 0 1; -1 0 1]:

NppiSize kernelSize = {3, 3};
Npp32s hostKernel[9] = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
NppiPoint oAnchor = {2, 2}; // note: using anchor {1,1} or {0,0} causes error -24 (NPP_TEXTURE_BIND_ERROR)
saveImage("Lena_filter_2d.pgm", oHostDst);

下面是使用 2D 内核的输出图像[-1 0 1; -1 0 1; -1 0 1].

我究竟做错了什么?

这篇 StackOverflow 帖子 https://stackoverflow.com/questions/12778463/cuda-npp-filters描述了类似的问题,如用户 Steensrup 的图片所示:http://1ordrup.dk/kasper/image/Lena_boxFilter5.jpg http://1ordrup.dk/kasper/image/Lena_boxFilter5.jpg


最后一些注意事项:

  • 对于 2D 内核,对于某些锚点值(例如NppiPoint oAnchor = {0, 0} or {1, 1}),我收到错误-24,这意味着NPP_TEXTURE_BIND_ERROR根据核电站用户指南 http://developer.download.nvidia.com/compute/DevZone/docs/html/CUDALibraries/doc/NPP_Library.pdf。这个问题在这个 StackOverflow 帖子 https://stackoverflow.com/questions/12778463/cuda-npp-filters.
  • 这段代码非常冗长。这不是主要问题,但是有人对如何使这段代码更加简洁有任何建议吗?

您正在为内核数组使用 2D 内存分配器。内核数组是密集的一维数组,而不是典型 NPP 图像那样的二维跨步数组。

只需将 2D CUDA malloc 替换为大小为 kernelWidth*kernelHeight*sizeof(Npp32s) 的简单 cuda malloc,并执行正常的 CUDA memcopy 而不是 memcopy 2D。

//1D instead of 2D
cudaMalloc((void**)&deviceKernel, kernelSize.width * kernelSize.height * sizeof(Npp32s));
cudaMemcpy(deviceKernel, hostKernel, kernelSize.width * kernelSize.height * sizeof(Npp32s), cudaMemcpyHostToDevice);

顺便说一句,“比例因子”1 并不意味着不缩放。缩放系数为 2^(-ScaleFactor)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nvidia NPP nppiFilter 在与 2d 内核卷积时产生垃圾 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo

随机推荐

  • React hook 相当于设置状态后的回调函数[重复]

    这个问题在这里已经有答案了 在反应中 在钩子之前 当我们设置状态时 我们可以在状态设置后调用一个函数 如下所示 this setState gt Callback 这对于钩子来说相当于什么 我尝试这样做 const currentRange
  • 返回优化的 x 坐标以标准化/最大化具有定义的 y 位置的矩形数组的区域

    我已经包含了一个代码片段 希望能够很好地总结内容 并以某种 填空 状态表示 如果通过在更大的背景下看待问题有助于理解问题的根源 那么我最终要做的就是在手机上的日历上显示每日查看时间表 可能类似于手机上日历的工作方式 当事件开始在时间上重叠时
  • 使用 Highcharts.js 创建打孔卡样式图表

    我想通过 highcharts 复制 github 上呈现的 打孔卡 样式图 我真的很挣扎这个问题 这是一个jsfiddle http jsfiddle net CA2cT 1 这开始让我到达那里 我宁愿在 y 上花几天时间 在 x 上花时
  • 默认显示当前位置注释

    我在 Mapkit 中显示了当前位置注释 蓝点 粘贴蓝点后注释显示 当我启动视图时 如何让注释默认显示 敲击销钉 void mapView MKMapView mv didAddAnnotationViews NSArray views f
  • 从一个类获取值以在另一个类中使用它(java)

    我有两节课 ABC 班上 double a 0 5 public double lala return a 我想在另一个类中使用它 比如说 DEF 类 ABC abc double baba abc lala 但它说 java lang N
  • 如何在 OS X Yosemite 中开发状态栏应用程序?

    我一直在尝试为 Yosemite 开发一个状态栏应用程序 这是我的第一个 OS X 应用程序 但是当我搜索该文档时 NSStatusItem文档说几乎所有的属性和方法 例如 title highlightMode and image 在 O
  • NDepend - 寻找死方法

    我有两个公共方法 A 和 B 我修改了 CQL 以向我显示公共方法和死方法 如果 B 仅被 A 调用 并且 A 作为死方法 在应用程序中的任何地方都没有调用或引用 NDepend 是否可以通过进行一些设置或通过 CQL 将这两个方法显示为死
  • PHP5 中有效且可读的注释方法是什么?

    在我学习 PHP 的过去 2 个月里 我发现了不止两种人们用来注释代码的风格 我没有看到太多的一致性 我认为这通常意味着艺术家在工作 所以我想知道 仍然可读 实用的有效评论方式是什么 在一个地方并排查看所有有效的可能性将提供我正在寻找的改进
  • 以编程方式绘制 OpenCV 色调曲线

    我想实现像色调曲线这样的东西 I have predefined set of curves that I should apply to the image For instance 据我了解 在此图表中 我们看到当前音调值与新音调值的依
  • 导航栏隐藏不工作 IOS

    大家好 我是 iOS 开发新手 我有一个主屏幕 导航栏隐藏 从那里我使用后转导航到另一个视图 但是当我单击返回时 它在主屏幕上显示导航栏 这是我的问题描述 在主屏幕 onviewload 中我正在做 self navigationContr
  • 将 docker-compose.yml 文件转换为 kubernetes

    我正在使用运行以下命令的 kompose 将 docker compose 文件转换为 kubernetes kompose 转换 f docker compose yml to kubernetes image yaml 命令完成后 输出
  • Python 2 中 dict.items() 和 dict.iteritems() 有什么区别?

    之间是否存在任何适用的差异dict items http docs python org library stdtypes html dict items and dict iteritems http docs python org li
  • Vim:在视觉模式下选择文本块的更快方法

    I have been using vim for quite some time and am aware that selecting blocks of text in visual mode is as simple as SHIF
  • 在 Ubuntu Server 16.04 上安装 CouchDB 2.1

    有谁知道如何在 Ubuntu Server 16 04 上安装 CouchDB 手册中的CouchDB 文档 http docs couchdb org en 2 1 0 install unix html似乎被打破了 一个简单的apt g
  • 同一台计算机上的两个 GitHub 帐户

    首先 我知道这个问题已经被问过并回答了好几次 但是我找到的所有解决方案都不起作用 任务非常简单 我有两个 GitHub 帐户 一个是个人帐户 第二个是商业帐户 我尝试使用一些配置 但都是这样的 Host github com persona
  • 使用“scale_x_log10”时,如何将“geom_text”准确映射到“geom_bin2d”?

    关于如何标记计数的一个很好的答案geom bin2d 可以在这里找到 使用 R 获取热图中 bin 的计数 https stackoverflow com questions 28771018 getting counts on bins
  • 什么是全球交易?

    JSR 907 JTA 1 2定义 全局事务 术语 UserTransaction begin 方法启动一个全球交易和 将事务与调用线程关联起来 这意味着什么 是最外面的事务还是什么 基本上 本地事务和全局事务之间的区别在于资源限制 全局事
  • MVC 区域不渲染 _Layout

    我有 NET CORE 2 2 的 MVC 项目我在项目中添加了区域 它在本地计算机中可以正常工作 当应用程序成功发布时 我使用 Azure Devops 设置 CI CD 管道 我注意到我的区域渲染不正确 下面的内容来自 azure 网站
  • 如何在 Excel 中使用 VBA 创建和填充 ActiveX 组合框。

    我在尝试在 Excel 的 vba 中创建并填充 ActiveX 组合框时遇到问题 下面的代码在作为两个单独的宏运行时有效 但是当我尝试将两者放在一起时 会创建一个空的组合框 谁能告诉我这是为什么以及如何克服这个问题 提前致谢 杰威 Sub
  • Nvidia NPP nppiFilter 在与 2d 内核卷积时产生垃圾

    Nvidia 性能基元 NPP http developer nvidia com cuda nvidia performance primitives提供了nppiFilter用于将用户提供的图像与用户提供的内核进行卷积的函数 对于一维卷