CUDA库之NPP入门(一):NVIDIA 2D Image and Signal Processing Performance Primitives

提到图像处理,就不得不提一下NVIDIA的NPP库
以下翻译自 https://docs.nvidia.com/cuda/npp/index.html


文章目录

    • 一、What is NPP?
    • 二、API接口文档
    • 三、头文件
    • 四、库文件
    • 五、编译程序时,NPP库之间的链接关系
    • 六、NPP函数的命名方式


一、What is NPP?

NVIDIA NPP是2D图像和信号处理的CUDA加速库。NPP库可以在最大限度地提高灵活性,同时保持高性能。
可以采用以下两种方式使用NPP库

  • 作为一个独立的库,可以最小的工作量向应用程序添加GPU加速
  • 可以添加到开发人员的GPU代码中,作为一个有效互操作的协作库
    这两种方法都允许开发人员利用NVIDIA gpu的大量计算资源,同时减少开发时间。

二、API接口文档

这里官方有所解释,本篇不再单独介绍,后面如有时间,再介绍接口的使用。
1、通用接口: https://docs.nvidia.com/cuda/npp/general_conventions_lb.html
2、图像处理接口:https://docs.nvidia.com/cuda/npp/nppi_conventions_lb.html
3、信号处理接口:https://docs.nvidia.com/cuda/npp/npps_conventions_lb.html

三、头文件

其中所有的.h文件都安装在CUDA Toolkit目录的include文件下,其中有:

  • npp.h
  • nppdefs.h
  • nppcore.h
  • nppi.h
  • npps.h

四、库文件

本文在前面提到,NPP是用来处理图像和信号的,所以NPP库文件除了一些通用的功能外,主要分为图像和信号这两个独立的库。

  • NPPC:这个库是个core library,主要包含了来自npp.h头文件的的函数,其中该库还被其它两个库所共享;
  • NPPI:这个库是为图像处理 ( i m a g e P r o c e s s i n g ) (image Processing) (imageProcessing)所提供的功能,该库提供的函数是来自nppi.h头文件中所声明的;
  • NPPS:这个库是为信号处理 ( s i g n a l p r o c e s s i n g ) (signal processing) (signalprocessing)所提供的功能,该库提供的函数是来自npps.h头文件中所声明的。

五、编译程序时,NPP库之间的链接关系

静态NPP库依赖于一个名为cuLIBOS(libculibos.a)的通用线程抽象层库,该库现在作为工具箱的一部分分发。因此,当链接静态库时,必须将cuLIBOS提供给链接器。‘

为了最小化库加载和CUDA运行时启动时间,建议尽可能使用静态库。

为了提高使用动态库时的加载和运行时性能,NPP提供了一整套NPPI子库。当只链接到包含应用- 程序使用的函数的子库可以显著提高加载时间和运行时启动性能。

除此之外,有些NPPI函数在内部调用其他NPPI和/或NPPS函数,因此根据应用程序调用的函数,可能需要链接到一些额外的库。

NPPI子库按照NPPI头文件的拆分方式被拆分为多个部分。子库列表如下:
在这里插入图片描述

  • NPPC 在头文件nppCore.h中,这是NPP核心库,必须链接到应用应用程序中;

  • NPPIAL 在头文件 nppi_arithmetic_and_logical_operations.h中,定义了一些算术逻辑运算函数;

  • NPPICC 在头文件nppi_color_conversion.h中,定义了一些颜色转换(如NV12转RGB)和采样(如上采样下采样)功能;

  • NPPIDEI 在头文件nppi_data_exchange_and_initialization.h中,定义了一些Data交换和初始化的功能;

  • NPPIF 在头文件nppi_filtering_functions.h中,定义了滤波等计算机视觉相关的功能;

  • NPPIG 在头文件nppi_geometry_transforms.h中,几何变换函数在定义在里面;

  • NPPIM 在头文件nppi_morphological_operations.h中,定义了形态学运算函数;

  • NPPIST在头文件nppi_statistics_functions.h 和 nppi_linear_transforms.h中,定义了统计学与线性变换函数;

  • NPPISU在头文件nppi_support_functions.h中,定义了内存支持相关的功能;

  • NPPITC在头文件 nppi_threshold_and_compare_operations.h中,定义了阈值和比较运算函数。

例如,在Linux上,要使用NPP动态库编译一个小的颜色转换应用程序foo,可以使用以下命令

nvcc foo.c  -lnppc -lnppicc -o foo  # 除了lnppc不可缺少外,只需要链接lnppicc库

如果要针对静态NPP库进行编译,必须使用以下命令:

 nvcc foo.c  -lnppc_static -lnppicc_static -lculibos -o foo # lculibos必须添加进来

也可以使用本机主机C++编译器。根据主机操作系统的不同,比如我们需要需要一些附加的库,如pthread或dl。可以在Linux上使用以下命令

g++ foo.c  -lnppc_static -lnppicc_static -lculibos -lcudart_static -lpthread -ldl 
    -I <cuda-toolkit-path>/include -L <cuda-toolkit-path>/lib64 -o foo

六、NPP函数的命名方式

任意打开一个图像处理中的npp函数,如

NppStatus nppiYUV420ToBGR_8u_P3C3R(const Npp8u * const pSrc[3], int rSrcStep[3], Npp8u * pDst, int nDstStep, NppiSize oSizeROI);
;

nppiYUV420ToBGR_8u_P3C3R有着很长的一段后缀,这些后缀除了表示不同的数据类型外,海还用来表示原始数据的操作方法

  • “A”:如果图像是4通道图像,则为“ A”,这表示结果alpha通道不受图元影响。

  • “Cn”:图像由n个通道压缩像素组成,其中n可以是1、2、3或4。如RGB三个通道, RGBA四个通道;

  • “Pn”:图像由n个独立的图像平面组成,其中n可以是1、2、3或4。 可以理解为 RRRRRGGGGGGBBBBBB这两排列

  • "C" :(在通道信息之后)指示图元仅在颜色通道之一(“感兴趣的通道”)上运行。所有其他输出通道不受原语影响。

  • ”I“: 表示“in-place”的方式工作。在这种情况下,图像数据指针通常命名为pSrcDst,以指示图像数据同时用作源和目标。

  • “ M” 表示“mask操作”。这些类型的图元具有附加的“mask图像”作为输入。目标图像中的每个像素对应于mask图像中的像素。仅处理具有相应非零掩码像素的像素。

  • “ R” 只在矩形的“感兴趣区域”或“ROI”上操作。所有的ROI原语都有一个NppiSize类型的附加输入参数,它指定原语应该处理的矩形区域的宽度和高度。

  • “Sfs” 表示在输出结果值之前,通过固定的缩放比例和饱和度进行处理。

这些后缀一般是按照字母顺序出现,上面的后缀总是按字母顺序出现。一个4通道原语不影响阿尔法通道的屏蔽操作,如“AC4IMRSfs”。
nppiYUV420ToBGR_8u_P3C3R则表示3通道8位无符号平面YUV420到3通道8位无符号压缩BGR颜色转换。P3表示plane3即包含了三个独立的通道,也就是yyyyuuvvC3表示三个通道。

你可能感兴趣的:(编程语言,CUDA入门,python)