NPP

NPP

NVIDIA NPP는 CUDA 가속 2D 이미지 및 신호처리를 수행하기 위한 함수 라이브러리이다. 라이브러리는 Cuda 설치시 CUDA Toolkit’s 디렉토리에 있다.

/include/
/lib/

Header Files

npp.h
nppdefs.h
nppcore.h
nppi.h
npps.h

Lib Files

/lib/nppc.lib
/lib/nppial.lib
/lib/nppicc.lib
/lib/nppidei.lib
/lib/nppif.lib
/lib/nppig.lib
/lib/nppim.lib
/lib/nppist.lib
/lib/nppisu.lib
/lib/nppitc.lib
/lib/npps.lib

사용법

cuda 버퍼 생성 -> cuda 버퍼에 이미지 데이터 셋팅 -> 함수 실행 -> cuda 버퍼에서 결과 복사.

### 함수 이름 규칙

  • “A” : 이미지가 4채널인 경우, 알파채널이 프리미티브 영향을 받지 않음.
  • “Cn” : 이미지는 n채널 압축 픽셀로 구성되며, n은 1,2,3,4 일 수 있음.
  • “Pn” : n개의 개별 이미지 평면으로 구성되며, n은 1,2,3,4 일 수 있음.
  • “C” : 채널 정보 다음에 나오는 C는 프리미티브가 색상 채널 중 하나인 “관심 채널”에서만 작동함을 나타냄.
  • “I” : 이미지 데이터가 원본과 대상역할을 동시에 함을 나타냄.
  • “M” : 마스킹 작동을 나타냄. 해당 마스크 픽셀이 0이 아닌 픽셀만 처리됨.
  • “R” : 프리미티브가 직사각형 “ROI”에서만 작동됨을 나타냄.
  • “Sfs” : 결과 값이 기록되기 전에 고정 크기 조정 및 채도에 의해 처리됨을 나타냄.

예제 소스

    
    // pSrc, pSum, pDeviceBuffer are all device pointers. 
    Npp32f * pSrc; 
    Npp32f * pSum; 
    Npp8u * pDeviceBuffer;
    int nLength = 1024;

    // Allocate the device memroy.
    cudaMalloc((void **)(&pSrc), sizeof(Npp32f) * nLength);
    nppsSet_32f(1.0f, pSrc, nLength);  
    cudaMalloc((void **)(&pSum), sizeof(Npp32f) * 1);

    // Compute the appropriate size of the scratch-memory buffer 
    int nBufferSize;
    nppsSumGetBufferSize_32f(nLength, &nBufferSize);
    // Allocate the scratch buffer 
    cudaMalloc((void **)(&pDeviceBuffer), nBufferSize);

    // Call the primitive with the scratch buffer
    nppsSum_32f(pSrc, nLength, pSum, pDeviceBuffer);
    Npp32f nSumHost;
    cudaMemcpy(&nSumHost, pSum, sizeof(Npp32f) * 1, cudaMemcpyDeviceToHost);
    printf("sum = %f\n", nSumHost); // nSumHost = 1024.0f;

    // Free the device memory
    cudaFree(pSrc);
    cudaFree(pDeviceBuffer);
    cudaFree(pSum);
  

(https://docs.nvidia.com/cuda/npp/introduction.html) 출처 - CUDA NPP