???? CUDA ???? CUDA ????? ???? ??? ???? ??? ???? ?? cuModuleLoad API? ?? ???? API? ???? ?? ?????. ???? ????? ?? ????? ??? ???? ??? ???? ???. ?? ???? ? CUDA ????? ?? ??? ????? ???? ???. ?? ???? ??? ??? ???? ?? ?????? ?????? ??? ????? ???? ????? ?? ???? ???.
? ?????? ??? ??? ???? ?? CUDA 12.0? ??? ????? ???? ?? ??? ?? ?????.
???? ?? ??(Context-dependent loading)
????? ?? ??? ?? CUDA ????? ??? ?????. ?? ?? ????? ??? ???? ??? ? ????? ??? ?? ?? ?????? ??? ???? ???? ??? ?????.
// Device 0
cuDeviceGet(&device0, 0);
cuDevicePrimaryCtxRetain(&ctx0, device0);
cuModuleLoad(&module0, “myModule.cubin”);
// Device 1
cuDeviceGet(&device1, 1);
cuDevicePrimaryCtxRetain(&ctx1, device1);
cuModuleLoad(&module1, “myModule.cubin”);
? ?????? ??? ????? ?? ?? ???? ? ? ?? ??? CUfunction? ???? ???:
// Device 0
cuModuleGetFuntion(&function0, module0, “myKernel”);
cuLaunchKernel(function0, …);
// Device 1
cuModuleGetFuntion(&function1, module1, “myKernel”);
cuLaunchKernel(function1, …);
? ?? ?????/??? ??? ???? ???? ??? ??????? ?? ???? ?????. ??? cuModuleUnload API? ???? ? ??? ????? ????? ??.
? ??? ?????? ??????? ?? ??? ???? ?? ?? CUDA ???? API? ???? ?? ?? ?????. ???????? ??? ????? ??? ?? ??? ???? ?? ?? ????.
// Application code
libraryInitialize();
cuDevicePrimaryCtxRetain(&ctx0, device0);
libraryFunc();
cuDevicePrimaryCtxRetain(&ctx0, device1);
libraryFunc();
libraryDeinitialize();
// Library code
libraryInitialize() {
map<CUcontext, CUmodule> moduleContextMap;
}
libraryFunc() {
cuCtxGetCurrent(&ctx);
if (!moduleContextMap.contains(ctx)){
cuModuleLoad(&module, “myModule.cubin”);
moduleContextMap[ctx] = module;
}
else {
module = moduleContextMap[ctx];
}
cuModuleGetFuntion(&function, module, “myKernel”);
cuLaunchKernel(function, …);
}
libraryDeinitialize() {
moduleContextMap.clear();
}
?? ???? ?????? ? ????? ????, ????? ??? ????? ???? ???. ?? ??? ?? ????? ???? ??? ???? ?? ??? ???? ???.
???? ?????? ??? ????? ??? ??? ??? ? ????. ??? ?????? ???? ??? ?? ???? ??? ?? ??????.
?, ????? ???? ??? ??? ??? ??? ????? ??? ????. ?? ?? ???? ???? ?? ???, ?????? ???? ?? ???? ?? ?????? ??????? ?? ???? ?? ???? ???? ??? ? ? ????.
?? ?? ??? ?????? ?????? ??? ?? ? ??? ?? ??? ???? ?? ? ??? ????? ???? ?? ??? ???? ????.
???? ??? ??
CUDA 12.0??? cuLibrary* ? cuKernel* API? ?????? ???? ??? ??? ???? ??? ??? ?????. ???? ??? ??? ??? ?? ???????? ????? ???? ?????, ? CUDA ????? ?? ?? ?? ? ???? CUDA ????? ?? ???? ?????.
// Load library
cuLibraryLoadFromFile(&library,“myModule.cubin”, …);
cuLibraryGetKernel(&kernel, library, “myKernel”);
// Launch kernel on the primary context of device 0
cuDevicePrimaryCtxRetain(&ctx0, device0);
cuLaunchKernel((CUkernel)kernel, …);
// Launch kernel on the primary context of device 1
cuDevicePrimaryCtxRetain(&ctx1, device1);
cuLaunchKernel((CUkernel)kernel, …);
// Unload library
cuLibraryUnload(library);
?? ???? ? ? ??? cuLibraryLoadFromFile API? ????? ????? ????? ?? ??? ?????. ????? cuDevicePrimaryCtxRetain ?? ?????.
?? ?? ????? CUfunction? ??? ?? ?? CUkernel ???? ??? ??? ???? ??? ??? ? ????. cuLibraryGetKernel? ???? ?? myKernel? ?? ???? ?? ??? ?????. ?? ??, CUkernel ???? ??? ??? ???? cuLaunchKernel? ?? ???? ??? ??? ? ????. CUDA ????? ?? ???? ?? ??? ????? ?? ??? ?????? ???? ??? ?????.
?? ?????? ?????? ??? ? ??? ?? ? ??? ? ?? ???? ????? ???.
// Application code
libraryInitialize();
cuDevicePrimaryCtxRetain(&ctx0, device0);
libraryFunc();
cuDevicePrimaryCtxRetain(&ctx0, device1);
libraryFunc();
libraryDeinitialize();
// Library code
libraryInitialize() {
cuLibraryLoadFromFile(&library,“myModule.cubin”, …);
cuLibraryGetKernel(&kernel, library, “myKernel”);
}
libraryFunc() {
cuLaunchKernel((CUkernel)kernel, …);
}
libraryDeinitialize() {
cuLibraryUnload(library);
}
?????? ? ?? ????? ??? ???? ??? ??? ??? ???. ???? ??? ??? ?? ???, CUDA ????? ??? ????? ???? ?? ?? ? ??? ??? ??? ? ????.
__managed__ ??? ???
??? ??? ????? ??? ?? ???? ??? ? ????. ?? ??, ??? ??? ??? ??? ? ??, ???? ?? ??? ???? ?? ??? ??? ? ????. ???? ?? CUDA ??????? ??? ?? __device__ ???? ??, ??? ?? __managed__ ??? ?? CUDA ???? ?? ??????? ??? ???? ?????.
CUDA 12.0 ???? ???? API? ?? CUDA ????? ??? ?? ??? ??? ??? ??? ??? ??? ?????. CUDA 12.0?? ? ???? API cuLibraryGeManaged? ???? CUDA ???? ??? ?? ??? ??? ??? ? ????.
???? ??? ?? ????
? ?????? CUDA ????? ???? ?? ???? ??? ??? ? ?? ??? ???? ??? CUDA ???? API? ??? ?????. ??? ???? ?? ???? ??? ??? ???? ???? ?????. ?? ?? ???? ??? ?? ????? ?? GPU?? ??? ???? ????? ?? ????, ?? ???? ?? ????? ??? ??? ??? ????.
??? API ??? ????? CUDA ???? ? ?? ?? 12 ??? ???????. cuLibrary* ? cuKernel* API? ?? ??? ??? CUDA ???? API ??? ????? ????.