NVIDIA NPP
1. 簡介
NVIDIA Performance Primitives library (NPP) 是一系列為加速進程的庫函數,NPP的原始目標是針對圖像和視頻進程,而現在以被開發工程師應用於其它很多領域,包括信號處理。與同級別的純 CPU 函數相比,這些函數最高可實現5 - 10倍性能提升。利用NPP,開發者能夠利用 (CUDA 4.1中) 2000多個圖像處理與信號處理基元,在數小時之內即可實現應用程序的大幅性能提升。
無論用GPU加速的版本代替CPU基元還是將NPP基元與現有的GPU加速流水線相結合,NPP都能夠實現極高的性能,同時可縮短開發時間。
2. 使用方法
2.1 文件
其中在安裝了CUDA工具包后,默認會安裝NPP library相關的頭文件和庫文件。
1) 頭文件
其中所有的.h文件都安裝在CUDA Toolkit目錄的include文件下,其中有:
-
nppdefs.h
-
nppcore.h
-
nppi.h
-
npps.h
-
nppversion.h
-
npp.h
2) 庫文件
從NPP 5.5版本開始,將所有的庫文件分為了三個獨立文件:
-
NPPC:這個庫是個core library,主要包含了來自npp.h頭文件的的函數,其中該庫還被其它兩個庫所共享;
-
NPPI:這個庫是為image Processing所提供的功能, 該庫提供的函數是來自nppi.h頭文件中所聲明的。
-
NPPS:這個庫是為signal processing所提供的功能,該庫提供的函數是來自npps.h頭文件中所聲明的。
若安裝了CUDA Toolkit后,其安裝目錄是在lib目錄下,在Linux下有如圖 1所示的動態和靜態文件。
圖 1
2.2 編譯方式
由於NPP提供靜態和動態庫文件,所以它有兩種編譯方式,其中若在Linux中有foo.c程序,則兩種編譯方式為:
-
動態編譯
nvcc foo.c -lnppi -o foo
-
靜態編譯
nvcc foo.c -lnppi_static -lculibos -o foo
2.3 API使用方式
對於NPP提供了API的操作內存空間是在device上的,所以不能將這些API應用於host中,但可以在host函數中調用。同時在NPP項目中需要添加include和library所需要的目錄。
-
一般情況下需要添加cuda tookit的include目錄,默認是:/usr/local/cuda-7.0/include;
-
對於library的文件,一般需要culibs和nppc_static兩個庫,其它庫則根據需要添加。1 #include <npp.h>
2
3 __global__ void testCudaFun(Npp8u *pDst, int num_types){
4
5 for ( int i = 0; i < num_types; i++){
6
7 printf( " %d:%d\n ",i,pDst[i]);
8
9 }
10
11 }
12
13 int main( void){
14
15 const int num_types = 2* sizeof(Npp8u);
16
17 Npp8u *host_pDst = (Npp8u*) malloc(num_types);
18
19 Npp8u *dev_pDst = (Npp8u*)nppsMalloc_8u(num_types);
20
21 for( int i= 0; i<num_types;i++) {
22
23 host_pDst[i] = i;
24
25 }
26
27 cudaMemcpy(dev_pDst,host_pDst,num_types,cudaMemcpyHostToDevice);
28
29 testCudaFun<<< 1, 1>>>(dev_pDst,num_types);
30
31 checkCudaErrors(cudaDeviceSynchronize());
32
33 return 0;
34
35 }
3. 功能
NPP針對Image Processing和Signal Processing兩種不同的目標,實現了兩套不同的API供使用。其中Image Processing是與圖像處理相關的API,而Signal Processing是與信號處理相關的API。
3.1 Image Processing
Arithmetic and Logical 操作
1) Arithmetic
這個系列的API主要是與圖形操作相關的算術運算,有AddC、Mul、MulC、MulScale、MulCScale、Sub、SubC Div、DivC、Div_Round、AbsDiffC、Abs、Add、AbsDiff、AddSquare、Sqr、AddProduct、Sqrt、AddWeighted、Ln和Exp等函數。
2) Logical
Logical系列的是一個與邏輯操作相關的API,有AndC、OrC、XorC、RshiftC、LshiftC、And、Or、Xor和Not等函數。
3) Alpha
3.2 Signal processing
暫空