From a9869fd6eaeecc748fc5f10f4b331fa41efbdaca Mon Sep 17 00:00:00 2001 From: shawnz Date: Thu, 27 Feb 2025 18:43:53 +0800 Subject: [PATCH] Bug 5034785: Update all non-ctx nppi APIs to ctx APIs as per latest change on NPP --- .../FilterBorderControlNPP.cpp | 150 +++++++++++------- ..._gradientVectorPrewittBorderX_Vertical.pgm | Bin 0 -> 262159 bytes ...torPrewittBorderX_Vertical_BorderDiffs.pgm | Bin 0 -> 262159 bytes ...ewittBorderX_Vertical_MixedBorderDiffs.pgm | Bin 0 -> 262159 bytes ...ewittBorderX_Vertical_WithMixedBorders.pgm | Bin 0 -> 262159 bytes ...ttBorderX_Vertical_WithNoSourceBorders.pgm | Bin 0 -> 262159 bytes ...radientVectorPrewittBorderY_Horizontal.pgm | Bin 0 -> 262159 bytes ...rPrewittBorderY_Horizontal_BorderDiffs.pgm | Bin 0 -> 262159 bytes ...ittBorderY_Horizontal_MixedBorderDiffs.pgm | Bin 0 -> 262159 bytes ...ittBorderY_Horizontal_WithMixedBorders.pgm | Bin 0 -> 262159 bytes ...BorderY_Horizontal_WithNoSourceBorders.pgm | Bin 0 -> 262159 bytes .../boxFilterNPP/boxFilterNPP.cpp | 69 +++++--- .../boxFilterNPP/teapot512_boxFilter.pgm | Bin 0 -> 262159 bytes .../cannyEdgeDetectorNPP.cpp | 68 +++++--- .../teapot512_cannyEdgeDetection.pgm | Bin 0 -> 262159 bytes .../freeImageInteropNPP.cpp | 70 +++++--- .../histEqualizationNPP.cpp | 85 ++++++---- .../watershedSegmentationNPP.cpp | 10 +- 18 files changed, 279 insertions(+), 173 deletions(-) create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512.pgm_gradientVectorPrewittBorderX_Vertical.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_BorderDiffs.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_MixedBorderDiffs.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_WithMixedBorders.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_WithNoSourceBorders.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal_BorderDiffs.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal_MixedBorderDiffs.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal_WithMixedBorders.pgm create mode 100644 Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal_WithNoSourceBorders.pgm create mode 100644 Samples/4_CUDA_Libraries/boxFilterNPP/teapot512_boxFilter.pgm create mode 100644 Samples/4_CUDA_Libraries/cannyEdgeDetectorNPP/teapot512_cannyEdgeDetection.pgm diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/FilterBorderControlNPP.cpp b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/FilterBorderControlNPP.cpp index e79eb73b..d57bdd9b 100644 --- a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/FilterBorderControlNPP.cpp +++ b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/FilterBorderControlNPP.cpp @@ -74,26 +74,6 @@ inline int cudaDeviceInit(int argc, const char **argv) { return dev; } -bool printfNPPinfo(int argc, char *argv[]) { - const NppLibraryVersion *libVer = nppGetLibVersion(); - - printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, - libVer->build); - - int driverVersion, runtimeVersion; - cudaDriverGetVersion(&driverVersion); - cudaRuntimeGetVersion(&runtimeVersion); - - printf(" CUDA Driver Version: %d.%d\n", driverVersion / 1000, - (driverVersion % 100) / 10); - printf(" CUDA Runtime Version: %d.%d\n", runtimeVersion / 1000, - (runtimeVersion % 100) / 10); - - // Min spec is SM 1.0 devices - bool bVal = checkCudaCapabilities(1, 0); - return bVal; -} - int main(int argc, char *argv[]) { printf("%s Starting...\n\n", argv[0]); @@ -104,11 +84,50 @@ int main(int argc, char *argv[]) { cudaDeviceInit(argc, (const char **)argv); - if (printfNPPinfo(argc, argv) == false) { - cudaDeviceReset(); - exit(EXIT_SUCCESS); + NppStreamContext nppStreamCtx; + nppStreamCtx.hStream = 0; // The NULL stream by default, set this to whatever your stream ID is if not the NULL stream. + + cudaError_t cudaError = cudaGetDevice(&nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + { + printf("CUDA error: no devices supporting CUDA.\n"); + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; } + const NppLibraryVersion *libVer = nppGetLibVersion(); + + printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, libVer->build); + + int driverVersion, runtimeVersion; + cudaDriverGetVersion(&driverVersion); + cudaRuntimeGetVersion(&runtimeVersion); + + printf("CUDA Driver Version: %d.%d\n", driverVersion/1000, (driverVersion%100)/10); + printf("CUDA Runtime Version: %d.%d\n\n", runtimeVersion/1000, (runtimeVersion%100)/10); + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMajor, + cudaDevAttrComputeCapabilityMajor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMinor, + cudaDevAttrComputeCapabilityMinor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaStreamGetFlags(nppStreamCtx.hStream, &nppStreamCtx.nStreamFlags); + + cudaDeviceProp oDeviceProperties; + + cudaError = cudaGetDeviceProperties(&oDeviceProperties, nppStreamCtx.nCudaDeviceId); + + nppStreamCtx.nMultiProcessorCount = oDeviceProperties.multiProcessorCount; + nppStreamCtx.nMaxThreadsPerMultiProcessor = oDeviceProperties.maxThreadsPerMultiProcessor; + nppStreamCtx.nMaxThreadsPerBlock = oDeviceProperties.maxThreadsPerBlock; + nppStreamCtx.nSharedMemPerBlock = oDeviceProperties.sharedMemPerBlock; + char *filePath; if (checkCmdLineFlag(argc, (const char **)argv, "input")) { @@ -186,11 +205,11 @@ int main(int argc, char *argv[]) { npp::ImageNPP_16s_C1 oDeviceDstY(oSizeROI.width, oSizeROI.height); // run Prewitt edge detection gradient vector filter - NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R( + NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oSrcSize, oSrcOffset, oDeviceDstX.data(), oDeviceDstX.pitch(), oDeviceDstY.data(), oDeviceDstY.pitch(), 0, 0, 0, 0, oSizeROI, NPP_MASK_SIZE_3_X_3, - nppiNormL1, NPP_BORDER_REPLICATE)); + nppiNormL1, NPP_BORDER_REPLICATE, nppStreamCtx)); // allocate device destination images of appropriatedly size npp::ImageNPP_8u_C1 oDeviceDstOutX(oSizeROI.width, oSizeROI.height); @@ -198,13 +217,13 @@ int main(int argc, char *argv[]) { // convert 16s_C1 result images to binary 8u_C1 output images using constant // value to adjust amount of visible detail - NPP_CHECK_NPP(nppiCompareC_16s_C1R( + NPP_CHECK_NPP(nppiCompareC_16s_C1R_Ctx( oDeviceDstX.data(), oDeviceDstX.pitch(), 32, oDeviceDstOutX.data(), - oDeviceDstOutX.pitch(), oSizeROI, NPP_CMP_GREATER_EQ)); + oDeviceDstOutX.pitch(), oSizeROI, NPP_CMP_GREATER_EQ, nppStreamCtx)); - NPP_CHECK_NPP(nppiCompareC_16s_C1R( + NPP_CHECK_NPP(nppiCompareC_16s_C1R_Ctx( oDeviceDstY.data(), oDeviceDstY.pitch(), 32, oDeviceDstOutY.data(), - oDeviceDstOutY.pitch(), oSizeROI, NPP_CMP_GREATER_EQ)); + oDeviceDstOutY.pitch(), oSizeROI, NPP_CMP_GREATER_EQ, nppStreamCtx)); // create host images for the results npp::ImageCPU_8u_C1 oHostDstX(oDeviceDstOutX.size()); @@ -234,10 +253,10 @@ int main(int argc, char *argv[]) { // copy and enlarge the original device source image and surround it with a // white edge (border) - NPP_CHECK_NPP(nppiCopyConstBorder_8u_C1R( + NPP_CHECK_NPP(nppiCopyConstBorder_8u_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oSrcSize, oEnlargedDeviceSrc.data(), oEnlargedDeviceSrc.pitch(), oEnlargedSrcSize, - oMaskSize.width / 2, oMaskSize.height / 2, 255)); + oMaskSize.width / 2, oMaskSize.height / 2, 255, nppStreamCtx)); // adjust oEnlargedDeviceSrc pixel pointer to point to the first pixel of // the original source image in the enlarged source image @@ -261,23 +280,25 @@ int main(int argc, char *argv[]) { // run Prewitt edge detection gradient vector filter bypassing border // control due to enlarged source image - NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R( + NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R_Ctx( pAdjustedSrc, oEnlargedDeviceSrc.pitch(), oEnlargedSrcSize, oSrcOffset, oDeviceDstX.data(), oDeviceDstX.pitch(), oDeviceDstY.data(), oDeviceDstY.pitch(), 0, 0, 0, 0, oSizeROI, NPP_MASK_SIZE_3_X_3, - nppiNormL1, NPP_BORDER_REPLICATE)); + nppiNormL1, NPP_BORDER_REPLICATE, nppStreamCtx)); // convert 16s_C1 result images to binary 8u_C1 output images using constant // value to adjust amount of visible detail - NPP_CHECK_NPP(nppiCompareC_16s_C1R(oDeviceDstX.data(), oDeviceDstX.pitch(), - 32, oDeviceDstOutXNoBorders.data(), - oDeviceDstOutXNoBorders.pitch(), - oSizeROI, NPP_CMP_GREATER_EQ)); + NPP_CHECK_NPP(nppiCompareC_16s_C1R_Ctx(oDeviceDstX.data(), oDeviceDstX.pitch(), + 32, oDeviceDstOutXNoBorders.data(), + oDeviceDstOutXNoBorders.pitch(), + oSizeROI, NPP_CMP_GREATER_EQ, + nppStreamCtx)); - NPP_CHECK_NPP(nppiCompareC_16s_C1R(oDeviceDstY.data(), oDeviceDstY.pitch(), - 32, oDeviceDstOutYNoBorders.data(), - oDeviceDstOutYNoBorders.pitch(), - oSizeROI, NPP_CMP_GREATER_EQ)); + NPP_CHECK_NPP(nppiCompareC_16s_C1R_Ctx(oDeviceDstY.data(), oDeviceDstY.pitch(), + 32, oDeviceDstOutYNoBorders.data(), + oDeviceDstOutYNoBorders.pitch(), + oSizeROI, NPP_CMP_GREATER_EQ, + nppStreamCtx)); // create additional output files std::string sResultXNoBordersFilename = sResultBaseFilename; std::string sResultYNoBordersFilename = sResultBaseFilename; @@ -305,15 +326,17 @@ int main(int argc, char *argv[]) { // diff the two 8u_C1 result images one with and one without border control - NPP_CHECK_NPP(nppiAbsDiff_8u_C1R( + NPP_CHECK_NPP(nppiAbsDiff_8u_C1R_Ctx( oDeviceDstOutXNoBorders.data(), oDeviceDstOutXNoBorders.pitch(), oDeviceDstOutX.data(), oDeviceDstOutX.pitch(), - oDeviceDstOutXDiff.data(), oDeviceDstOutXDiff.pitch(), oSizeROI)); + oDeviceDstOutXDiff.data(), oDeviceDstOutXDiff.pitch(), oSizeROI, + nppStreamCtx)); - NPP_CHECK_NPP(nppiAbsDiff_8u_C1R( + NPP_CHECK_NPP(nppiAbsDiff_8u_C1R_Ctx( oDeviceDstOutYNoBorders.data(), oDeviceDstOutYNoBorders.pitch(), oDeviceDstOutY.data(), oDeviceDstOutY.pitch(), - oDeviceDstOutYDiff.data(), oDeviceDstOutYDiff.pitch(), oSizeROI)); + oDeviceDstOutYDiff.data(), oDeviceDstOutYDiff.pitch(), oSizeROI, + nppStreamCtx)); // create additional output files std::string sResultXDiffFilename = sResultBaseFilename; @@ -380,11 +403,11 @@ int main(int argc, char *argv[]) { // run Prewitt edge detection gradient vector filter to generate the left // side of the output image - NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R( + NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R_Ctx( pAdjustedSrc, oEnlargedDeviceSrc.pitch(), oEnlargedSrcSize, oSrcOffset, oDeviceDstX.data(), oDeviceDstX.pitch(), oDeviceDstY.data(), oDeviceDstY.pitch(), 0, 0, 0, 0, oSizeROI, NPP_MASK_SIZE_3_X_3, - nppiNormL1, NPP_BORDER_REPLICATE)); + nppiNormL1, NPP_BORDER_REPLICATE, nppStreamCtx)); // now move the enlarged source pointer to the horizontal middle of the // enlarged source image and tell the function where it was moved to @@ -401,23 +424,26 @@ int main(int argc, char *argv[]) { // run Prewitt edge detection gradient vector filter to generate the right // side of the output image adjusting the destination image pointers // appropriately - NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R( + NPP_CHECK_NPP(nppiGradientVectorPrewittBorder_8u16s_C1R_Ctx( pAdjustedSrc, oEnlargedDeviceSrc.pitch(), oEnlargedSrcSize, oSrcOffset, oDeviceDstX.data() + nLeftWidth, oDeviceDstX.pitch(), oDeviceDstY.data() + nLeftWidth, oDeviceDstY.pitch(), 0, 0, 0, 0, - oSizeROI, NPP_MASK_SIZE_3_X_3, nppiNormL1, NPP_BORDER_REPLICATE)); + oSizeROI, NPP_MASK_SIZE_3_X_3, nppiNormL1, NPP_BORDER_REPLICATE, + nppStreamCtx)); // convert 16s_C1 result images to binary 8u_C1 output images using constant // value to adjust amount of visible detail - NPP_CHECK_NPP(nppiCompareC_16s_C1R(oDeviceDstX.data(), oDeviceDstX.pitch(), - 32, oDeviceDstOutXMixedBorders.data(), - oDeviceDstOutXMixedBorders.pitch(), - oSizeROI, NPP_CMP_GREATER_EQ)); + NPP_CHECK_NPP(nppiCompareC_16s_C1R_Ctx(oDeviceDstX.data(), oDeviceDstX.pitch(), + 32, oDeviceDstOutXMixedBorders.data(), + oDeviceDstOutXMixedBorders.pitch(), + oSizeROI, NPP_CMP_GREATER_EQ, + nppStreamCtx)); - NPP_CHECK_NPP(nppiCompareC_16s_C1R(oDeviceDstY.data(), oDeviceDstY.pitch(), - 32, oDeviceDstOutYMixedBorders.data(), - oDeviceDstOutYMixedBorders.pitch(), - oSizeROI, NPP_CMP_GREATER_EQ)); + NPP_CHECK_NPP(nppiCompareC_16s_C1R_Ctx(oDeviceDstY.data(), oDeviceDstY.pitch(), + 32, oDeviceDstOutYMixedBorders.data(), + oDeviceDstOutYMixedBorders.pitch(), + oSizeROI, NPP_CMP_GREATER_EQ, + nppStreamCtx)); // create additional output files std::string sResultXMixedBordersFilename = sResultBaseFilename; std::string sResultYMixedBordersFilename = sResultBaseFilename; @@ -439,15 +465,17 @@ int main(int argc, char *argv[]) { // diff the original 8u_C1 result images with border control and the mixed // border control images, they should match (diff image will be all black) - NPP_CHECK_NPP(nppiAbsDiff_8u_C1R( + NPP_CHECK_NPP(nppiAbsDiff_8u_C1R_Ctx( oDeviceDstOutXMixedBorders.data(), oDeviceDstOutXMixedBorders.pitch(), oDeviceDstOutX.data(), oDeviceDstOutX.pitch(), - oDeviceDstOutXDiff.data(), oDeviceDstOutXDiff.pitch(), oSizeROI)); + oDeviceDstOutXDiff.data(), oDeviceDstOutXDiff.pitch(), oSizeROI, + nppStreamCtx)); - NPP_CHECK_NPP(nppiAbsDiff_8u_C1R( + NPP_CHECK_NPP(nppiAbsDiff_8u_C1R_Ctx( oDeviceDstOutYMixedBorders.data(), oDeviceDstOutYMixedBorders.pitch(), oDeviceDstOutY.data(), oDeviceDstOutY.pitch(), - oDeviceDstOutYDiff.data(), oDeviceDstOutYDiff.pitch(), oSizeROI)); + oDeviceDstOutYDiff.data(), oDeviceDstOutYDiff.pitch(), oSizeROI, + nppStreamCtx)); // create additional output files std::string sResultXMixedDiffFilename = sResultBaseFilename; diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512.pgm_gradientVectorPrewittBorderX_Vertical.pgm b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512.pgm_gradientVectorPrewittBorderX_Vertical.pgm new file mode 100644 index 0000000000000000000000000000000000000000..cb16736e171eb3fffc40d0cebd63fba9c367c29e GIT binary patch literal 262159 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 literal 0 HcmV?d00001 diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_BorderDiffs.pgm b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_BorderDiffs.pgm new file mode 100644 index 0000000000000000000000000000000000000000..693a9af66e42e8a5fff6ac32da7b7dcb40657df5 GIT binary patch literal 262159 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 literal 0 HcmV?d00001 diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_MixedBorderDiffs.pgm b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_MixedBorderDiffs.pgm new file mode 100644 index 0000000000000000000000000000000000000000..1099979c7f8e33f7ce23676e2de8829418499aed GIT binary patch literal 262159 zcmWGA3}W7(mhgfAng#k((4o6Trxgdx+0LDFDJ6B}ZZi zfZ~6&1{jGk5B2kC0)Pg@NTo&-!0?Ot|D?3)M-#wsO8_KAKeQV-+`?c4`v;VvN%B5O z!)POrq#zs2ib2syn)^UHMiT&OVK#_WgQAl(=Ye#LCIHgHZ1AcE#U^R41L+uzf6~Hi z5UVCVI!V_th`m4RG}5D!bRDCiJcvU89G%!pbnK##$-qJEqfw`k76RZDK#CTUHIQQX zs9L&*060EL9SEemD@QG)VF-|x1i-3k=$cWZ2OtDUiBwY54uDritt2M|NQqQZ)RNB|+)H`)kw%M1}zI zu?kW-S_2RntV2f`@k>HR6Tr}kRpMO=id7<2lc1DH6GxQ|d;tPP$)j&fgQb}+qC|47!oD{XhnmMX&fJ0!k02ts17+~v3i2uAU3pyhB{JO0HaNSp%JGf zxsuck0iy)~Nx?hl6@v-@qT_V51{n15NvZ=$i&D~5lj@dH^#c$BpeQBYT99g@iVLC? z5pVCPN?L^g(J=~k09Z9KaZ8LEu!*C@0EYl5N{M#@NHsBWON<)gZ5>rfyAU8YMxibs zQ8`rCC^cw9fW!y|D<93>!w7(4lmzd9l#?=QK!VYuN(UkYz!6G<#iXhy!RS$?0}uiv z$0x}e$nex?4MRqtk*Ng~pQLC7si$=fKx^|!@$Ya~3yx1xJPFo-JBQ+yA>NYF_$NNB zC{+oLPLd1(>%bMwxWq}Z0W>W^iuzHt6oddcHc8VD)`BCVaR`%S!D#%G6kHT42E`_+ zMu7BSjcKZs+@tYNYJ5UCI)>`TQPpk3 z(lBT=lHoV7PHN{@^3oz1t{>F`2?0<9l2rjfdjV9AFe)1d@#83oI|M-S&p=iJfaZVP zMw25m8vo>k8YOx_Ax=*GL!+M@t$3UZat$8oQ7Nj20H^>UC)8;a|5W$isDb!HU^M>m zhtF`Ah2&$BeF@P9N<1WM9n~0l=c4lq5r% zgGN=;H3UErNyGMa?|i4_1yIVk>V=AKc5=^O%}98Giq08%`>==x7HC zJwR~$gAxoKoi}O~jY9wwpF}kPK-)$BgR?)eobl3LyZBPGWL2IQv85 ze<*ls)Qv=jz-asv8BoJj87N~DZUBN*ft!BBloi7@sD`D#Kru@=QbDRf@lQCV49h?o z#-0MjEK%_fTJlL);V=%VVd^z-0wCl!P%~jP{}T$OAt?`ze*)z?NX=;U56S2y=x9*Z zCRDD2)QrYI!Jr(P3P72gaQ+8JKLKS!)Bhvg)u7Bxpa1|V8J+qcrU?ZUx%lHBqyn7( zhiM3mY;S>Lm$>*J+2J&7eNU(X0Focg{=+u2+f3(3#hhzteUjp$D9{i(& zQ_!ry=PER%qg?Vs0DlVrlspEg_y;+Rd~c2FBr*g*!HherjmAHb!8l}<5sd!0%dWWO)XIB0G0oAa?7YS^bY}W{NqRfAi2@#r+=K#(?(Dn<7xnmW`BCd#K71^ zMEnno!$xhT4*+Fy90dSK3cT>2J}w!xWgtQT6v=qwe;^z+YA4-702Kc?GC4R|;Ak7t z&3&U5(KrM^2>=|^81{fgN8=wOT!xnb&iDsOP}8g6QX0QCT|HULKBpEdzL*h~fGOKfpX?V2BC&tUWWsCz&IyrAP9Fk%~9lAtKK z$TkqeX%snQR5Mx#fb%70#5{Az&0J?m-yUsjyIo(J)zbK1_U+ z9;zV#DFD!1507Rz1F8U>4;3DzhHMBx;vX$u;aoTa;y=uS0wO+24&4v{#VH6Q`v4a0 zxWtjwj(FoCWBLvXbGM-QT5z{gzx5EcKUX=13S0dO>9i$<^nlJC&@U@2@G!4jjy z5D5XC1ps=~VvT>gd2(QFr<*tFZxOEe#|Ur?0V=r_J)L1UmR7c7w{0YefL02crl(TgsC&L7G?9(6lP2!Ns%gpmco zi2_vsnK#NFMj-%>YqaJ)SPa>Z=m`W_Zj?QwLjWAtXz>dcL-rM#JhId%dx(bsC~iR* z$s42bj}#cgoe7HU(fA+kv5eb)pp8Hn^*@?&wDf@{JIWo>AplAMs2;$GZVUlb^`pF@ z90J(lpHP7?l>IyEcC-)xwE$3run3^Yk8*}p2w;is(fmKGVi>|d-3pxyXsQYl#{rExvEyB^b zqw$X~?1qILN{pj$Al@4t0D^?Wa3xV%0Hg6gT%#GMztG|zL)~cp#|V<)C4ijgu|zf& zq2cBKk?tGh0svcNqYVg-^xztP{zobRkeG0Pj>bPcD268ksQ|zh|HISMqrO6f07?Qt z2vg1)EjlO+rG`iP9iKYhX(yDhK;FmP4&X#8W38TyDK z;(s(A=o8|D%ob<@7{CU=APbO@<{W6u4_pN>(gJ+2`4^G^Amm_k+o*f!5CY(=PtEuT z8%PI-k6J;U5CAp(pzQ#v7&sdLR0&498ba0hr>o0HEu%&VP&59i;hs@I=MWf80CW!U zL1rB|{y{B)LFTSe=g=nvK=Dt_P5^yeJ!%WpLI9EgsAk-#K|?GAM&o~oMHrQx3yJ^H z766rlb?6vJ+XOJ0um*cdfW|*WDQI6#oNy^2=x< z8Q8Q3?*9*9Bn+U{0~_#z#CAyh4_GXWwh;z89e`s1Obmoe2F&7t@a&+p6IuWaP(%!n zwSzJy2FOw1C;+E|0dT;8RXhXW*THHfGyx2V^G4%;K!P2`QfT}SNK_1nr6|51<$(MD z162Wx2LB)kf&c$O1A&9UA)`(hkPrZk0)lIS0kM75(g6mjjqKP2WMh0pQFJCPsKbj8N}G3jpwR5E(&0u0ArX8r4FR5CG+Ua3Ubf zbdYYcG>&Q-Bq0DA03MCSK@u4Q;S5j$pupbIv_nDQ4F;_g#y?dql^YD!Biw2gB#y<@LbtoB0Q5L31^H2(<;p^7X zC>*|V3-cMiRyz5^e=yTW>A@ZX_~IXYEXZK@z^MCZ7XqUd0PVtd)a20+7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=CQ7{?;qaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFj4^k(o+ff literal 0 HcmV?d00001 diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_WithNoSourceBorders.pgm b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderX_Vertical_WithNoSourceBorders.pgm new file mode 100644 index 0000000000000000000000000000000000000000..b191e108118068ea8954cbcf95bd31710a901a36 GIT binary patch literal 262159 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 literal 0 HcmV?d00001 diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal.pgm b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal.pgm new file mode 100644 index 0000000000000000000000000000000000000000..dff3532370ff779518de7822135e99d27b56c098 GIT binary patch literal 262159 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 literal 0 HcmV?d00001 diff --git a/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal_WithNoSourceBorders.pgm b/Samples/4_CUDA_Libraries/FilterBorderControlNPP/data/teapot512_gradientVectorPrewittBorderY_Horizontal_WithNoSourceBorders.pgm new file mode 100644 index 0000000000000000000000000000000000000000..5037464d359e3b32097a403fdc4be5ced42caab5 GIT binary patch literal 262159 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 -bool printfNPPinfo(int argc, char *argv[]) { - const NppLibraryVersion *libVer = nppGetLibVersion(); - - printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, - libVer->build); - - int driverVersion, runtimeVersion; - cudaDriverGetVersion(&driverVersion); - cudaRuntimeGetVersion(&runtimeVersion); - - printf(" CUDA Driver Version: %d.%d\n", driverVersion / 1000, - (driverVersion % 100) / 10); - printf(" CUDA Runtime Version: %d.%d\n", runtimeVersion / 1000, - (runtimeVersion % 100) / 10); - - // Min spec is SM 1.0 devices - bool bVal = checkCudaCapabilities(1, 0); - return bVal; -} - int main(int argc, char *argv[]) { printf("%s Starting...\n\n", argv[0]); try { std::string sFilename; char *filePath; + NppStreamContext nppStreamCtx; + nppStreamCtx.hStream = 0; // The NULL stream by default, set this to whatever your stream ID is if not the NULL stream. - findCudaDevice(argc, (const char **)argv); - - if (printfNPPinfo(argc, argv) == false) { - exit(EXIT_SUCCESS); + cudaError_t cudaError = cudaGetDevice(&nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + { + printf("CUDA error: no devices supporting CUDA.\n"); + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; } + const NppLibraryVersion *libVer = nppGetLibVersion(); + + printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, libVer->build); + + int driverVersion, runtimeVersion; + cudaDriverGetVersion(&driverVersion); + cudaRuntimeGetVersion(&runtimeVersion); + + printf("CUDA Driver Version: %d.%d\n", driverVersion/1000, (driverVersion%100)/10); + printf("CUDA Runtime Version: %d.%d\n\n", runtimeVersion/1000, (runtimeVersion%100)/10); + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMajor, + cudaDevAttrComputeCapabilityMajor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMinor, + cudaDevAttrComputeCapabilityMinor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaStreamGetFlags(nppStreamCtx.hStream, &nppStreamCtx.nStreamFlags); + + cudaDeviceProp oDeviceProperties; + + cudaError = cudaGetDeviceProperties(&oDeviceProperties, nppStreamCtx.nCudaDeviceId); + + nppStreamCtx.nMultiProcessorCount = oDeviceProperties.multiProcessorCount; + nppStreamCtx.nMaxThreadsPerMultiProcessor = oDeviceProperties.maxThreadsPerMultiProcessor; + nppStreamCtx.nMaxThreadsPerBlock = oDeviceProperties.maxThreadsPerBlock; + nppStreamCtx.nSharedMemPerBlock = oDeviceProperties.sharedMemPerBlock; + if (checkCmdLineFlag(argc, (const char **)argv, "input")) { getCmdLineArgumentString(argc, (const char **)argv, "input", &filePath); } else { @@ -154,10 +171,10 @@ int main(int argc, char *argv[]) { NppiPoint oAnchor = {oMaskSize.width / 2, oMaskSize.height / 2}; // run box filter - NPP_CHECK_NPP(nppiFilterBoxBorder_8u_C1R( + NPP_CHECK_NPP(nppiFilterBoxBorder_8u_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oSrcSize, oSrcOffset, oDeviceDst.data(), oDeviceDst.pitch(), oSizeROI, oMaskSize, oAnchor, - NPP_BORDER_REPLICATE)); + NPP_BORDER_REPLICATE, nppStreamCtx)); // declare a host image for the result npp::ImageCPU_8u_C1 oHostDst(oDeviceDst.size()); diff --git a/Samples/4_CUDA_Libraries/boxFilterNPP/teapot512_boxFilter.pgm b/Samples/4_CUDA_Libraries/boxFilterNPP/teapot512_boxFilter.pgm new file mode 100644 index 0000000000000000000000000000000000000000..a681196d65b83fa38ec49d6e1c6916c62c1e5f2a GIT binary patch literal 262159 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

NaK)^`|l$JWc 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, libVer->minor, - libVer->build); - - int driverVersion, runtimeVersion; - cudaDriverGetVersion(&driverVersion); - cudaRuntimeGetVersion(&runtimeVersion); - - printf(" CUDA Driver Version: %d.%d\n", driverVersion / 1000, - (driverVersion % 100) / 10); - printf(" CUDA Runtime Version: %d.%d\n", runtimeVersion / 1000, - (runtimeVersion % 100) / 10); - - // Min spec is SM 1.0 devices - bool bVal = checkCudaCapabilities(1, 0); - return bVal; -} - int main(int argc, char *argv[]) { printf("%s Starting...\n\n", argv[0]); @@ -97,10 +77,50 @@ int main(int argc, char *argv[]) { cudaDeviceInit(argc, (const char **)argv); - if (printfNPPinfo(argc, argv) == false) { - exit(EXIT_SUCCESS); + NppStreamContext nppStreamCtx; + nppStreamCtx.hStream = 0; // The NULL stream by default, set this to whatever your stream ID is if not the NULL stream. + + cudaError_t cudaError = cudaGetDevice(&nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + { + printf("CUDA error: no devices supporting CUDA.\n"); + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; } + const NppLibraryVersion *libVer = nppGetLibVersion(); + + printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, libVer->build); + + int driverVersion, runtimeVersion; + cudaDriverGetVersion(&driverVersion); + cudaRuntimeGetVersion(&runtimeVersion); + + printf("CUDA Driver Version: %d.%d\n", driverVersion/1000, (driverVersion%100)/10); + printf("CUDA Runtime Version: %d.%d\n\n", runtimeVersion/1000, (runtimeVersion%100)/10); + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMajor, + cudaDevAttrComputeCapabilityMajor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMinor, + cudaDevAttrComputeCapabilityMinor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaStreamGetFlags(nppStreamCtx.hStream, &nppStreamCtx.nStreamFlags); + + cudaDeviceProp oDeviceProperties; + + cudaError = cudaGetDeviceProperties(&oDeviceProperties, nppStreamCtx.nCudaDeviceId); + + nppStreamCtx.nMultiProcessorCount = oDeviceProperties.multiProcessorCount; + nppStreamCtx.nMaxThreadsPerMultiProcessor = oDeviceProperties.maxThreadsPerMultiProcessor; + nppStreamCtx.nMaxThreadsPerBlock = oDeviceProperties.maxThreadsPerBlock; + nppStreamCtx.nSharedMemPerBlock = oDeviceProperties.sharedMemPerBlock; + if (checkCmdLineFlag(argc, (const char **)argv, "input")) { getCmdLineArgumentString(argc, (const char **)argv, "input", &filePath); } else { @@ -190,11 +210,11 @@ int main(int argc, char *argv[]) { Npp16s nHighThreshold = 256; if ((nBufferSize > 0) && (pScratchBufferNPP != 0)) { - NPP_CHECK_NPP(nppiFilterCannyBorder_8u_C1R( + NPP_CHECK_NPP(nppiFilterCannyBorder_8u_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oSrcSize, oSrcOffset, oDeviceDst.data(), oDeviceDst.pitch(), oSizeROI, NPP_FILTER_SOBEL, NPP_MASK_SIZE_3_X_3, nLowThreshold, nHighThreshold, nppiNormL2, - NPP_BORDER_REPLICATE, pScratchBufferNPP)); + NPP_BORDER_REPLICATE, pScratchBufferNPP, nppStreamCtx)); } // free scratch buffer memory diff --git a/Samples/4_CUDA_Libraries/cannyEdgeDetectorNPP/teapot512_cannyEdgeDetection.pgm b/Samples/4_CUDA_Libraries/cannyEdgeDetectorNPP/teapot512_cannyEdgeDetection.pgm new file mode 100644 index 0000000000000000000000000000000000000000..84b090d99b917516f05cdae94f7c5bd4c031319d GIT binary patch literal 262159 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, libVer->minor, - libVer->build); - - int driverVersion, runtimeVersion; - cudaDriverGetVersion(&driverVersion); - cudaRuntimeGetVersion(&runtimeVersion); - - printf(" CUDA Driver Version: %d.%d\n", driverVersion / 1000, - (driverVersion % 100) / 10); - printf(" CUDA Runtime Version: %d.%d\n", runtimeVersion / 1000, - (runtimeVersion % 100) / 10); - - bool bVal = checkCudaCapabilities(cudaVerMajor, cudaVerMinor); - return bVal; -} - // Error handler for FreeImage library. // In case this handler is invoked, it throws an NPP exception. extern "C" void FreeImageErrorHandler(FREE_IMAGE_FORMAT oFif, @@ -157,11 +138,50 @@ int main(int argc, char *argv[]) { cudaDeviceInit(argc, (const char **)argv); - // Min spec is SM 1.0 devices - if (printfNPPinfo(argc, argv, 1, 0) == false) { - exit(EXIT_SUCCESS); + NppStreamContext nppStreamCtx; + nppStreamCtx.hStream = 0; // The NULL stream by default, set this to whatever your stream ID is if not the NULL stream. + + cudaError_t cudaError = cudaGetDevice(&nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + { + printf("CUDA error: no devices supporting CUDA.\n"); + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; } + const NppLibraryVersion *libVer = nppGetLibVersion(); + + printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, libVer->build); + + int driverVersion, runtimeVersion; + cudaDriverGetVersion(&driverVersion); + cudaRuntimeGetVersion(&runtimeVersion); + + printf("CUDA Driver Version: %d.%d\n", driverVersion/1000, (driverVersion%100)/10); + printf("CUDA Runtime Version: %d.%d\n\n", runtimeVersion/1000, (runtimeVersion%100)/10); + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMajor, + cudaDevAttrComputeCapabilityMajor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMinor, + cudaDevAttrComputeCapabilityMinor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaStreamGetFlags(nppStreamCtx.hStream, &nppStreamCtx.nStreamFlags); + + cudaDeviceProp oDeviceProperties; + + cudaError = cudaGetDeviceProperties(&oDeviceProperties, nppStreamCtx.nCudaDeviceId); + + nppStreamCtx.nMultiProcessorCount = oDeviceProperties.multiProcessorCount; + nppStreamCtx.nMaxThreadsPerMultiProcessor = oDeviceProperties.maxThreadsPerMultiProcessor; + nppStreamCtx.nMaxThreadsPerBlock = oDeviceProperties.maxThreadsPerBlock; + nppStreamCtx.nSharedMemPerBlock = oDeviceProperties.sharedMemPerBlock; + if (checkCmdLineFlag(argc, (const char **)argv, "input")) { getCmdLineArgumentString(argc, (const char **)argv, "input", &filePath); } else { @@ -260,9 +280,9 @@ int main(int argc, char *argv[]) { Npp8u *pDstImageCUDA = nppiMalloc_8u_C1(oSizeROI.width, oSizeROI.height, &nDstPitchCUDA); NPP_ASSERT_NOT_NULL(pDstImageCUDA); - NPP_CHECK_NPP(nppiFilterBox_8u_C1R(pSrcImageCUDA, nSrcPitchCUDA, - pDstImageCUDA, nDstPitchCUDA, oSizeROI, - oMaskSize, oMaskAchnor)); + NPP_CHECK_NPP(nppiFilterBox_8u_C1R_Ctx(pSrcImageCUDA, nSrcPitchCUDA, + pDstImageCUDA, nDstPitchCUDA, oSizeROI, + oMaskSize, oMaskAchnor, nppStreamCtx)); // create the result image storage using FreeImage so we can easily // save FIBITMAP *pResultBitmap = FreeImage_Allocate( diff --git a/Samples/4_CUDA_Libraries/histEqualizationNPP/histEqualizationNPP.cpp b/Samples/4_CUDA_Libraries/histEqualizationNPP/histEqualizationNPP.cpp index ae897b27..1869feb7 100644 --- a/Samples/4_CUDA_Libraries/histEqualizationNPP/histEqualizationNPP.cpp +++ b/Samples/4_CUDA_Libraries/histEqualizationNPP/histEqualizationNPP.cpp @@ -73,26 +73,6 @@ inline int cudaDeviceInit(int argc, const char **argv) { return dev; } -bool printfNPPinfo(int argc, char *argv[]) { - const NppLibraryVersion *libVer = nppGetLibVersion(); - - printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, - libVer->build); - - int driverVersion, runtimeVersion; - cudaDriverGetVersion(&driverVersion); - cudaRuntimeGetVersion(&runtimeVersion); - - printf(" CUDA Driver Version: %d.%d\n", driverVersion / 1000, - (driverVersion % 100) / 10); - printf(" CUDA Runtime Version: %d.%d\n", runtimeVersion / 1000, - (runtimeVersion % 100) / 10); - - // Min spec is SM 1.1 devices - bool bVal = checkCudaCapabilities(1, 1); - return bVal; -} - int main(int argc, char *argv[]) { printf("%s Starting...\n\n", argv[0]); @@ -102,10 +82,50 @@ int main(int argc, char *argv[]) { cudaDeviceInit(argc, (const char **)argv); - if (printfNPPinfo(argc, argv) == false) { - exit(EXIT_SUCCESS); + NppStreamContext nppStreamCtx; + nppStreamCtx.hStream = 0; // The NULL stream by default, set this to whatever your stream ID is if not the NULL stream. + + cudaError_t cudaError = cudaGetDevice(&nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + { + printf("CUDA error: no devices supporting CUDA.\n"); + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; } + const NppLibraryVersion *libVer = nppGetLibVersion(); + + printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, libVer->build); + + int driverVersion, runtimeVersion; + cudaDriverGetVersion(&driverVersion); + cudaRuntimeGetVersion(&runtimeVersion); + + printf("CUDA Driver Version: %d.%d\n", driverVersion/1000, (driverVersion%100)/10); + printf("CUDA Runtime Version: %d.%d\n\n", runtimeVersion/1000, (runtimeVersion%100)/10); + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMajor, + cudaDevAttrComputeCapabilityMajor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaDeviceGetAttribute(&nppStreamCtx.nCudaDevAttrComputeCapabilityMinor, + cudaDevAttrComputeCapabilityMinor, + nppStreamCtx.nCudaDeviceId); + if (cudaError != cudaSuccess) + return NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY; + + cudaError = cudaStreamGetFlags(nppStreamCtx.hStream, &nppStreamCtx.nStreamFlags); + + cudaDeviceProp oDeviceProperties; + + cudaError = cudaGetDeviceProperties(&oDeviceProperties, nppStreamCtx.nCudaDeviceId); + + nppStreamCtx.nMultiProcessorCount = oDeviceProperties.multiProcessorCount; + nppStreamCtx.nMaxThreadsPerMultiProcessor = oDeviceProperties.maxThreadsPerMultiProcessor; + nppStreamCtx.nMaxThreadsPerBlock = oDeviceProperties.maxThreadsPerBlock; + nppStreamCtx.nSharedMemPerBlock = oDeviceProperties.sharedMemPerBlock; + if (checkCmdLineFlag(argc, (const char **)argv, "input")) { getCmdLineArgumentString(argc, (const char **)argv, "input", &filePath); } else { @@ -182,8 +202,9 @@ int main(int argc, char *argv[]) { (int)oDeviceSrc.height()}; // full image // create device scratch buffer for nppiHistogram size_t nDeviceBufferSize; - nppiHistogramEvenGetBufferSize_8u_C1R(oSizeROI, levelCount, - &nDeviceBufferSize); + nppiHistogramEvenGetBufferSize_8u_C1R_Ctx(oSizeROI, levelCount, + &nDeviceBufferSize, + nppStreamCtx); Npp8u *pDeviceBuffer; NPP_CHECK_CUDA(cudaMalloc((void **)&pDeviceBuffer, nDeviceBufferSize)); @@ -191,9 +212,9 @@ int main(int argc, char *argv[]) { Npp32s levelsHost[levelCount]; NPP_CHECK_NPP(nppiEvenLevelsHost_32s(levelsHost, levelCount, 0, binCount)); // compute the histogram - NPP_CHECK_NPP(nppiHistogramEven_8u_C1R( + NPP_CHECK_NPP(nppiHistogramEven_8u_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oSizeROI, histDevice, levelCount, - 0, binCount, pDeviceBuffer)); + 0, binCount, pDeviceBuffer, nppStreamCtx)); // copy histogram and levels to host memory Npp32s histHost[binCount]; NPP_CHECK_CUDA(cudaMemcpy(histHost, histDevice, binCount * sizeof(Npp32s), @@ -254,20 +275,22 @@ int main(int argc, char *argv[]) { sizeof(Npp32s) * (levelCount), cudaMemcpyHostToDevice)); - NPP_CHECK_NPP(nppiLUT_Linear_8u_C1R( + NPP_CHECK_NPP(nppiLUT_Linear_8u_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oDeviceDst.data(), oDeviceDst.pitch(), oSizeROI, - lutDevice, // value and level arrays are in GPU device memory - lvlsDevice, levelCount)); + lutDevice, // value and level arrays are in host memory + lvlsDevice, levelCount, + nppStreamCtx)); NPP_CHECK_CUDA(cudaFree(lutDevice)); NPP_CHECK_CUDA(cudaFree(lvlsDevice)); #else - NPP_CHECK_NPP(nppiLUT_Linear_8u_C1R( + NPP_CHECK_NPP(nppiLUT_Linear_8u_C1R_Ctx( oDeviceSrc.data(), oDeviceSrc.pitch(), oDeviceDst.data(), oDeviceDst.pitch(), oSizeROI, lutHost, // value and level arrays are in host memory - levelsHost, levelCount)); + levelsHost, levelCount, + nppStreamCtx)); #endif // copy the result image back into the storage that contained the diff --git a/Samples/4_CUDA_Libraries/watershedSegmentationNPP/watershedSegmentationNPP.cpp b/Samples/4_CUDA_Libraries/watershedSegmentationNPP/watershedSegmentationNPP.cpp index e6800ab2..825cea6f 100644 --- a/Samples/4_CUDA_Libraries/watershedSegmentationNPP/watershedSegmentationNPP.cpp +++ b/Samples/4_CUDA_Libraries/watershedSegmentationNPP/watershedSegmentationNPP.cpp @@ -328,9 +328,10 @@ main( int argc, char** argv ) int nCompressedLabelCount = 0; - nppStatus = nppiCompressMarkerLabelsUF_32u_C1IR(pSegmentLabelsOutputBufferDev[nImage], oSizeROI[nImage].width * sizeof(Npp32u), oSizeROI[nImage], - oSizeROI[nImage].width * oSizeROI[nImage].height, &nCompressedLabelCount, - pCompressedLabelsScratchBufferDev); + nppStatus = nppiCompressMarkerLabelsUF_32u_C1IR_Ctx(pSegmentLabelsOutputBufferDev[nImage], oSizeROI[nImage].width * sizeof(Npp32u), oSizeROI[nImage], + oSizeROI[nImage].width * oSizeROI[nImage].height, &nCompressedLabelCount, + pCompressedLabelsScratchBufferDev, + nppStreamCtx); if (nppStatus != NPP_SUCCESS) { @@ -539,6 +540,3 @@ main( int argc, char** argv ) return 0; } - - -