From e32d17e67e3a55f8e192edef24d1a6bfa155b2d6 Mon Sep 17 00:00:00 2001 From: Shawn Zeng Date: Tue, 10 Mar 2026 16:05:27 +0800 Subject: [PATCH] Bug 5952280: Add cuModuleUnload(Module) to release resource for 6 samples --- Samples/0_Introduction/matrixMulDrv/matrixMulDrv.cpp | 1 + .../matrixMulDynlinkJIT/matrixMulDynlinkJIT.cpp | 10 ++++++---- .../simpleTextureDrv/simpleTextureDrv.cpp | 1 + Samples/0_Introduction/vectorAddDrv/vectorAddDrv.cpp | 1 + Samples/0_Introduction/vectorAddMMAP/vectorAddMMAP.cpp | 1 + Samples/3_CUDA_Features/memMapIPCDrv/memMapIpc.cpp | 1 + 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Samples/0_Introduction/matrixMulDrv/matrixMulDrv.cpp b/Samples/0_Introduction/matrixMulDrv/matrixMulDrv.cpp index 815801b8..add08ebb 100644 --- a/Samples/0_Introduction/matrixMulDrv/matrixMulDrv.cpp +++ b/Samples/0_Introduction/matrixMulDrv/matrixMulDrv.cpp @@ -255,6 +255,7 @@ void runTest(int argc, char **argv) checkCudaErrors(cuMemFree(d_A)); checkCudaErrors(cuMemFree(d_B)); checkCudaErrors(cuMemFree(d_C)); + checkCudaErrors(cuModuleUnload(cuModule)); checkCudaErrors(cuCtxDestroy(cuContext)); } diff --git a/Samples/0_Introduction/matrixMulDynlinkJIT/matrixMulDynlinkJIT.cpp b/Samples/0_Introduction/matrixMulDynlinkJIT/matrixMulDynlinkJIT.cpp index 3260a2ee..34302dfe 100644 --- a/Samples/0_Introduction/matrixMulDynlinkJIT/matrixMulDynlinkJIT.cpp +++ b/Samples/0_Introduction/matrixMulDynlinkJIT/matrixMulDynlinkJIT.cpp @@ -68,6 +68,7 @@ extern "C" void computeGold(float *, const float *, const float *, unsigned int, // Globals //////////////////////////////////////////////////////////////////////////////// CUcontext g_cuContext; +CUmodule g_cuModule; bool noprompt = false; static const char *sSDKsample = "matrixMulDynlinkJIT (CUDA dynamic linking)"; @@ -90,7 +91,6 @@ CUresult initCUDA(int argc, char **argv, CUfunction *pMatrixMul, int *block_size { CUresult status; CUdevice cuDevice; - CUmodule cuModule; CUfunction cuFunction; int major, minor, block_size, devID = 0; char deviceName[256]; @@ -185,10 +185,10 @@ CUresult initCUDA(int argc, char **argv, CUfunction *pMatrixMul, int *block_size #if defined(_WIN64) || defined(__LP64__) status = - cuModuleLoadDataEx(&cuModule, matrixMul_kernel_64_ptxdump, jitNumOptions, jitOptions, (void **)jitOptVals); + cuModuleLoadDataEx(&g_cuModule, matrixMul_kernel_64_ptxdump, jitNumOptions, jitOptions, (void **)jitOptVals); #else status = - cuModuleLoadDataEx(&cuModule, matrixMul_kernel_32_ptxdump, jitNumOptions, jitOptions, (void **)jitOptVals); + cuModuleLoadDataEx(&g_cuModule, matrixMul_kernel_32_ptxdump, jitNumOptions, jitOptions, (void **)jitOptVals); #endif printf("> PTX JIT log:\n%s\n", jitLogBuffer); @@ -206,9 +206,10 @@ CUresult initCUDA(int argc, char **argv, CUfunction *pMatrixMul, int *block_size // retrieve CUDA function from the compiled module status = cuModuleGetFunction( - &cuFunction, cuModule, (block_size == 16) ? "matrixMul_bs16_32bit" : "matrixMul_bs32_32bit"); + &cuFunction, g_cuModule, (block_size == 16) ? "matrixMul_bs16_32bit" : "matrixMul_bs32_32bit"); if (CUDA_SUCCESS != status) { + cuModuleUnload(g_cuModule); cuCtxDestroy(g_cuContext); exit(EXIT_FAILURE); } @@ -337,6 +338,7 @@ int main(int argc, char **argv) checkCudaErrors(cuMemFree(d_A)); checkCudaErrors(cuMemFree(d_B)); checkCudaErrors(cuMemFree(d_C)); + checkCudaErrors(cuModuleUnload(g_cuModule)); checkCudaErrors(cuCtxDestroy(g_cuContext)); printf("Test run %s\n", (1 == res) ? "success!" : "failed!"); diff --git a/Samples/0_Introduction/simpleTextureDrv/simpleTextureDrv.cpp b/Samples/0_Introduction/simpleTextureDrv/simpleTextureDrv.cpp index aa6b2627..85c29d8c 100644 --- a/Samples/0_Introduction/simpleTextureDrv/simpleTextureDrv.cpp +++ b/Samples/0_Introduction/simpleTextureDrv/simpleTextureDrv.cpp @@ -297,6 +297,7 @@ void runTest(int argc, char **argv) free(image_path); free(ref_path); + checkCudaErrors(cuModuleUnload(cuModule)); checkCudaErrors(cuCtxDestroy(cuContext)); exit(bTestResults ? EXIT_SUCCESS : EXIT_FAILURE); diff --git a/Samples/0_Introduction/vectorAddDrv/vectorAddDrv.cpp b/Samples/0_Introduction/vectorAddDrv/vectorAddDrv.cpp index e6a1a051..9d36f777 100644 --- a/Samples/0_Introduction/vectorAddDrv/vectorAddDrv.cpp +++ b/Samples/0_Introduction/vectorAddDrv/vectorAddDrv.cpp @@ -211,6 +211,7 @@ int CleanupNoFailure() free(h_C); } + checkCudaErrors(cuModuleUnload(cuModule)); checkCudaErrors(cuCtxDestroy(cuContext)); return EXIT_SUCCESS; diff --git a/Samples/0_Introduction/vectorAddMMAP/vectorAddMMAP.cpp b/Samples/0_Introduction/vectorAddMMAP/vectorAddMMAP.cpp index c5c28ff5..5a07ff33 100644 --- a/Samples/0_Introduction/vectorAddMMAP/vectorAddMMAP.cpp +++ b/Samples/0_Introduction/vectorAddMMAP/vectorAddMMAP.cpp @@ -247,6 +247,7 @@ int CleanupNoFailure() free(h_C); } + checkCudaErrors(cuModuleUnload(cuModule)); checkCudaErrors(cuCtxDestroy(cuContext)); return EXIT_SUCCESS; diff --git a/Samples/3_CUDA_Features/memMapIPCDrv/memMapIpc.cpp b/Samples/3_CUDA_Features/memMapIPCDrv/memMapIpc.cpp index 09937acc..d8355f2b 100644 --- a/Samples/3_CUDA_Features/memMapIPCDrv/memMapIpc.cpp +++ b/Samples/3_CUDA_Features/memMapIPCDrv/memMapIpc.cpp @@ -419,6 +419,7 @@ static void childProcess(int devId, int id, char **argv) // Clean up! checkCudaErrors(cuStreamDestroy(stream)); + checkCudaErrors(cuModuleUnload(cuModule)); checkCudaErrors(cuCtxDestroy(ctx)); // Unmap the allocations from our address space. Unmapping will also free the