1. 簡介
====
NVIDIA Performance Primitives library (NPP)是一系列為加速進程的庫函數,NPP的原始目標是針對圖像和視頻進程,而現在以被開發工程師應用于其它很多領域,包括信號處理。與同級別的純CPU 函數相比,這些函數最高可實現5 - 10倍性能提升。利用NPP,開發者能夠利用 (CUDA4.1中)2000多個圖像處理與信號處理基元,在數小時之內即可實現應用程序的大幅性能提升。
無論用GPU加速的版本代替CPU基元還是將NPP基元與現有的GPU加速流水線相結合,NPP都能夠實現極高的性能,同時可縮短開發時間。
2. 使用方法
=========
2.1 文件
其中在安裝了CUDA工具包后,默認會安裝NPP library相關的頭文件和庫文件。
- 頭文件
其中所有的.h文件都安裝在CUDA Toolkit目錄的include文件下,其中有:
nppdefs.h
nppcore.h
nppi.h
npps.h
nppversion.h
npp.h
- 庫文件
從NPP 5.5版本開始,將所有的庫文件分為了三個獨立文件:
NPPC:這個庫是個core
library,主要包含了來自npp.h頭文件的的函數,其中該庫還被其它兩個庫所共享;NPPI:這個庫是為image Processing所提供的功能,
該庫提供的函數是來自nppi.h頭文件中所聲明的。NPPS:這個庫是為signal
processing所提供的功能,該庫提供的函數是來自npps.h頭文件中所聲明的。
若安裝了CUDA Toolkit后,其安裝目錄是在lib目錄下,在Linux下有如圖
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兩個庫,其它庫則根據需要添加。
#include \<npp.h\>
\__global_\_ void testCudaFun(Npp8u \*pDst,int num_types){
for (int i = 0; i \< num_types; i++){
printf("%d:%d\\n",i,pDst[i]);
}
}
int main(void){
const int num_types = 2\*sizeof(Npp8u);
Npp8u \*host_pDst = (Npp8u\*)malloc(num_types);
Npp8u \*dev_pDst = (Npp8u\*)nppsMalloc_8u(num_types);
for(int i=0; i\<num_types;i++) {
host_pDst[i] = i;
}
cudaMemcpy(dev_pDst,host_pDst,num_types,cudaMemcpyHostToDevice);
testCudaFun\<\<\<1,1\>\>\>(dev_pDst,num_types);
checkCudaErrors(cudaDeviceSynchronize());
return 0;
}```
#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等函數。
1. **Logical**
Logical系列的是一個與邏輯操作相關的API,有AndC、OrC、XorC、RshiftC、LshiftC、And、Or、Xor和Not等函數。
1. **Alpha**