1. 程式人生 > 其它 >CUDA庫之NPP:NVIDIA 2D Image and Signal Processing Performance Primitives

CUDA庫之NPP:NVIDIA 2D Image and Signal Processing Performance Primitives

技術標籤:程式語言|CUDA入門

NPP庫初體驗
以下翻譯自 https://docs.nvidia.com/cuda/npp/index.html


文章目錄


一、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是用來處理影象和訊號的,所以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標頭檔案的拆分方式被拆分為多個部分。子庫列表如下:
在這裡插入圖片描述

例如,在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