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)
五、編譯程式時,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