NVIDIA NPP

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相關的頭文件和庫文件。

  1. 頭文件

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

  • nppdefs.h

  • nppcore.h

  • nppi.h

  • npps.h

  • nppversion.h

  • npp.h

  1. 庫文件

從NPP 5.5版本開始,將所有的庫文件分為了三個獨立文件:

  • NPPC:這個庫是個core
    library,主要包含了來自npp.h頭文件的的函數,其中該庫還被其它兩個庫所共享;

  • NPPI:這個庫是為image Processing所提供的功能,
    該庫提供的函數是來自nppi.h頭文件中所聲明的。

  • NPPS:這個庫是為signal
    processing所提供的功能,該庫提供的函數是來自npps.h頭文件中所聲明的。

若安裝了CUDA Toolkit后,其安裝目錄是在lib目錄下,在Linux下有如圖
1所示的動態和靜態文件。


圖 1.png

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**
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 動態鏈接,在可執行文件裝載時或運行時,由操作系統的裝載程序加載庫。大多數操作系統將解析外部引用(比如庫)作為加載過...
    小5筒閱讀 5,566評論 0 3
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • CUDA從入門到精通(零):寫在前面 本文原版鏈接: 在老板的要求下,本博主從2012年上高性能計算課程開始接觸C...
    Pitfalls閱讀 3,668評論 1 3
  • 一、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,880評論 0 27
  • 夜半 我執筆紙上 想寫詩,俳句,酸倒牙的詞曲 因為…… 空曠的街道 悲鳴地鐘表 窗外的滂沱大雨 以及 漸漸消失的你……
    青鵝閱讀 135評論 0 0