| # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
| # | |
| # SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE | |
| # | |
| # This code was automatically generated across versions from 12.0.1 to 12.9.1. Do not modify it directly. | |
| from libc.stdint cimport intptr_t, uintptr_t | |
| import threading | |
| from .utils import FunctionNotFoundError, NotSupportedError | |
| from cuda.pathfinder import load_nvidia_dynamic_lib | |
| ############################################################################### | |
| # Extern | |
| ############################################################################### | |
| cdef extern from "<dlfcn.h>" nogil: | |
| void* dlopen(const char*, int) | |
| char* dlerror() | |
| void* dlsym(void*, const char*) | |
| int dlclose(void*) | |
| enum: | |
| RTLD_LAZY | |
| RTLD_NOW | |
| RTLD_GLOBAL | |
| RTLD_LOCAL | |
| const void* RTLD_DEFAULT 'RTLD_DEFAULT' | |
| cdef int get_cuda_version(): | |
| cdef void* handle = NULL | |
| cdef int err, driver_ver = 0 | |
| # Load driver to check version | |
| handle = dlopen('libcuda.so.1', RTLD_NOW | RTLD_GLOBAL) | |
| if handle == NULL: | |
| err_msg = dlerror() | |
| raise NotSupportedError(f'CUDA driver is not found ({err_msg.decode()})') | |
| cuDriverGetVersion = dlsym(handle, "cuDriverGetVersion") | |
| if cuDriverGetVersion == NULL: | |
| raise RuntimeError('Did not find cuDriverGetVersion symbol in libcuda.so.1') | |
| err = (<int (*)(int*) noexcept nogil>cuDriverGetVersion)(&driver_ver) | |
| if err != 0: | |
| raise RuntimeError(f'cuDriverGetVersion returned error code {err}') | |
| return driver_ver | |
| ############################################################################### | |
| # Wrapper init | |
| ############################################################################### | |
| cdef object __symbol_lock = threading.Lock() | |
| cdef bint __py_nvvm_init = False | |
| cdef void* __cuDriverGetVersion = NULL | |
| cdef void* __nvvmGetErrorString = NULL | |
| cdef void* __nvvmVersion = NULL | |
| cdef void* __nvvmIRVersion = NULL | |
| cdef void* __nvvmCreateProgram = NULL | |
| cdef void* __nvvmDestroyProgram = NULL | |
| cdef void* __nvvmAddModuleToProgram = NULL | |
| cdef void* __nvvmLazyAddModuleToProgram = NULL | |
| cdef void* __nvvmCompileProgram = NULL | |
| cdef void* __nvvmVerifyProgram = NULL | |
| cdef void* __nvvmGetCompiledResultSize = NULL | |
| cdef void* __nvvmGetCompiledResult = NULL | |
| cdef void* __nvvmGetProgramLogSize = NULL | |
| cdef void* __nvvmGetProgramLog = NULL | |
| cdef void* load_library() except* with gil: | |
| cdef uintptr_t handle = load_nvidia_dynamic_lib("nvvm")._handle_uint | |
| return <void*>handle | |
| cdef int __check_or_init_nvvm() except -1 nogil: | |
| global __py_nvvm_init | |
| cdef void* handle = NULL | |
| with gil, __symbol_lock: | |
| # Load function | |
| global __nvvmGetErrorString | |
| __nvvmGetErrorString = dlsym(RTLD_DEFAULT, 'nvvmGetErrorString') | |
| if __nvvmGetErrorString == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmGetErrorString = dlsym(handle, 'nvvmGetErrorString') | |
| global __nvvmVersion | |
| __nvvmVersion = dlsym(RTLD_DEFAULT, 'nvvmVersion') | |
| if __nvvmVersion == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmVersion = dlsym(handle, 'nvvmVersion') | |
| global __nvvmIRVersion | |
| __nvvmIRVersion = dlsym(RTLD_DEFAULT, 'nvvmIRVersion') | |
| if __nvvmIRVersion == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmIRVersion = dlsym(handle, 'nvvmIRVersion') | |
| global __nvvmCreateProgram | |
| __nvvmCreateProgram = dlsym(RTLD_DEFAULT, 'nvvmCreateProgram') | |
| if __nvvmCreateProgram == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmCreateProgram = dlsym(handle, 'nvvmCreateProgram') | |
| global __nvvmDestroyProgram | |
| __nvvmDestroyProgram = dlsym(RTLD_DEFAULT, 'nvvmDestroyProgram') | |
| if __nvvmDestroyProgram == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmDestroyProgram = dlsym(handle, 'nvvmDestroyProgram') | |
| global __nvvmAddModuleToProgram | |
| __nvvmAddModuleToProgram = dlsym(RTLD_DEFAULT, 'nvvmAddModuleToProgram') | |
| if __nvvmAddModuleToProgram == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmAddModuleToProgram = dlsym(handle, 'nvvmAddModuleToProgram') | |
| global __nvvmLazyAddModuleToProgram | |
| __nvvmLazyAddModuleToProgram = dlsym(RTLD_DEFAULT, 'nvvmLazyAddModuleToProgram') | |
| if __nvvmLazyAddModuleToProgram == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmLazyAddModuleToProgram = dlsym(handle, 'nvvmLazyAddModuleToProgram') | |
| global __nvvmCompileProgram | |
| __nvvmCompileProgram = dlsym(RTLD_DEFAULT, 'nvvmCompileProgram') | |
| if __nvvmCompileProgram == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmCompileProgram = dlsym(handle, 'nvvmCompileProgram') | |
| global __nvvmVerifyProgram | |
| __nvvmVerifyProgram = dlsym(RTLD_DEFAULT, 'nvvmVerifyProgram') | |
| if __nvvmVerifyProgram == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmVerifyProgram = dlsym(handle, 'nvvmVerifyProgram') | |
| global __nvvmGetCompiledResultSize | |
| __nvvmGetCompiledResultSize = dlsym(RTLD_DEFAULT, 'nvvmGetCompiledResultSize') | |
| if __nvvmGetCompiledResultSize == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmGetCompiledResultSize = dlsym(handle, 'nvvmGetCompiledResultSize') | |
| global __nvvmGetCompiledResult | |
| __nvvmGetCompiledResult = dlsym(RTLD_DEFAULT, 'nvvmGetCompiledResult') | |
| if __nvvmGetCompiledResult == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmGetCompiledResult = dlsym(handle, 'nvvmGetCompiledResult') | |
| global __nvvmGetProgramLogSize | |
| __nvvmGetProgramLogSize = dlsym(RTLD_DEFAULT, 'nvvmGetProgramLogSize') | |
| if __nvvmGetProgramLogSize == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmGetProgramLogSize = dlsym(handle, 'nvvmGetProgramLogSize') | |
| global __nvvmGetProgramLog | |
| __nvvmGetProgramLog = dlsym(RTLD_DEFAULT, 'nvvmGetProgramLog') | |
| if __nvvmGetProgramLog == NULL: | |
| if handle == NULL: | |
| handle = load_library() | |
| __nvvmGetProgramLog = dlsym(handle, 'nvvmGetProgramLog') | |
| __py_nvvm_init = True | |
| return 0 | |
| cdef int _check_or_init_nvvm() except -1 nogil: | |
| if __py_nvvm_init: | |
| return 0 | |
| return __check_or_init_nvvm() | |
| cdef dict func_ptrs = None | |
| cpdef dict _inspect_function_pointers(): | |
| global func_ptrs | |
| if func_ptrs is not None: | |
| return func_ptrs | |
| _check_or_init_nvvm() | |
| cdef dict data = {} | |
| global __nvvmGetErrorString | |
| data["__nvvmGetErrorString"] = <intptr_t>__nvvmGetErrorString | |
| global __nvvmVersion | |
| data["__nvvmVersion"] = <intptr_t>__nvvmVersion | |
| global __nvvmIRVersion | |
| data["__nvvmIRVersion"] = <intptr_t>__nvvmIRVersion | |
| global __nvvmCreateProgram | |
| data["__nvvmCreateProgram"] = <intptr_t>__nvvmCreateProgram | |
| global __nvvmDestroyProgram | |
| data["__nvvmDestroyProgram"] = <intptr_t>__nvvmDestroyProgram | |
| global __nvvmAddModuleToProgram | |
| data["__nvvmAddModuleToProgram"] = <intptr_t>__nvvmAddModuleToProgram | |
| global __nvvmLazyAddModuleToProgram | |
| data["__nvvmLazyAddModuleToProgram"] = <intptr_t>__nvvmLazyAddModuleToProgram | |
| global __nvvmCompileProgram | |
| data["__nvvmCompileProgram"] = <intptr_t>__nvvmCompileProgram | |
| global __nvvmVerifyProgram | |
| data["__nvvmVerifyProgram"] = <intptr_t>__nvvmVerifyProgram | |
| global __nvvmGetCompiledResultSize | |
| data["__nvvmGetCompiledResultSize"] = <intptr_t>__nvvmGetCompiledResultSize | |
| global __nvvmGetCompiledResult | |
| data["__nvvmGetCompiledResult"] = <intptr_t>__nvvmGetCompiledResult | |
| global __nvvmGetProgramLogSize | |
| data["__nvvmGetProgramLogSize"] = <intptr_t>__nvvmGetProgramLogSize | |
| global __nvvmGetProgramLog | |
| data["__nvvmGetProgramLog"] = <intptr_t>__nvvmGetProgramLog | |
| func_ptrs = data | |
| return data | |
| cpdef _inspect_function_pointer(str name): | |
| global func_ptrs | |
| if func_ptrs is None: | |
| func_ptrs = _inspect_function_pointers() | |
| return func_ptrs[name] | |
| ############################################################################### | |
| # Wrapper functions | |
| ############################################################################### | |
| cdef const char* _nvvmGetErrorString(nvvmResult result) except?NULL nogil: | |
| global __nvvmGetErrorString | |
| _check_or_init_nvvm() | |
| if __nvvmGetErrorString == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmGetErrorString is not found") | |
| return (<const char* (*)(nvvmResult) noexcept nogil>__nvvmGetErrorString)( | |
| result) | |
| cdef nvvmResult _nvvmVersion(int* major, int* minor) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmVersion | |
| _check_or_init_nvvm() | |
| if __nvvmVersion == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmVersion is not found") | |
| return (<nvvmResult (*)(int*, int*) noexcept nogil>__nvvmVersion)( | |
| major, minor) | |
| cdef nvvmResult _nvvmIRVersion(int* majorIR, int* minorIR, int* majorDbg, int* minorDbg) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmIRVersion | |
| _check_or_init_nvvm() | |
| if __nvvmIRVersion == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmIRVersion is not found") | |
| return (<nvvmResult (*)(int*, int*, int*, int*) noexcept nogil>__nvvmIRVersion)( | |
| majorIR, minorIR, majorDbg, minorDbg) | |
| cdef nvvmResult _nvvmCreateProgram(nvvmProgram* prog) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmCreateProgram | |
| _check_or_init_nvvm() | |
| if __nvvmCreateProgram == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmCreateProgram is not found") | |
| return (<nvvmResult (*)(nvvmProgram*) noexcept nogil>__nvvmCreateProgram)( | |
| prog) | |
| cdef nvvmResult _nvvmDestroyProgram(nvvmProgram* prog) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmDestroyProgram | |
| _check_or_init_nvvm() | |
| if __nvvmDestroyProgram == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmDestroyProgram is not found") | |
| return (<nvvmResult (*)(nvvmProgram*) noexcept nogil>__nvvmDestroyProgram)( | |
| prog) | |
| cdef nvvmResult _nvvmAddModuleToProgram(nvvmProgram prog, const char* buffer, size_t size, const char* name) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmAddModuleToProgram | |
| _check_or_init_nvvm() | |
| if __nvvmAddModuleToProgram == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmAddModuleToProgram is not found") | |
| return (<nvvmResult (*)(nvvmProgram, const char*, size_t, const char*) noexcept nogil>__nvvmAddModuleToProgram)( | |
| prog, buffer, size, name) | |
| cdef nvvmResult _nvvmLazyAddModuleToProgram(nvvmProgram prog, const char* buffer, size_t size, const char* name) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmLazyAddModuleToProgram | |
| _check_or_init_nvvm() | |
| if __nvvmLazyAddModuleToProgram == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmLazyAddModuleToProgram is not found") | |
| return (<nvvmResult (*)(nvvmProgram, const char*, size_t, const char*) noexcept nogil>__nvvmLazyAddModuleToProgram)( | |
| prog, buffer, size, name) | |
| cdef nvvmResult _nvvmCompileProgram(nvvmProgram prog, int numOptions, const char** options) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmCompileProgram | |
| _check_or_init_nvvm() | |
| if __nvvmCompileProgram == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmCompileProgram is not found") | |
| return (<nvvmResult (*)(nvvmProgram, int, const char**) noexcept nogil>__nvvmCompileProgram)( | |
| prog, numOptions, options) | |
| cdef nvvmResult _nvvmVerifyProgram(nvvmProgram prog, int numOptions, const char** options) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmVerifyProgram | |
| _check_or_init_nvvm() | |
| if __nvvmVerifyProgram == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmVerifyProgram is not found") | |
| return (<nvvmResult (*)(nvvmProgram, int, const char**) noexcept nogil>__nvvmVerifyProgram)( | |
| prog, numOptions, options) | |
| cdef nvvmResult _nvvmGetCompiledResultSize(nvvmProgram prog, size_t* bufferSizeRet) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmGetCompiledResultSize | |
| _check_or_init_nvvm() | |
| if __nvvmGetCompiledResultSize == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmGetCompiledResultSize is not found") | |
| return (<nvvmResult (*)(nvvmProgram, size_t*) noexcept nogil>__nvvmGetCompiledResultSize)( | |
| prog, bufferSizeRet) | |
| cdef nvvmResult _nvvmGetCompiledResult(nvvmProgram prog, char* buffer) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmGetCompiledResult | |
| _check_or_init_nvvm() | |
| if __nvvmGetCompiledResult == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmGetCompiledResult is not found") | |
| return (<nvvmResult (*)(nvvmProgram, char*) noexcept nogil>__nvvmGetCompiledResult)( | |
| prog, buffer) | |
| cdef nvvmResult _nvvmGetProgramLogSize(nvvmProgram prog, size_t* bufferSizeRet) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmGetProgramLogSize | |
| _check_or_init_nvvm() | |
| if __nvvmGetProgramLogSize == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmGetProgramLogSize is not found") | |
| return (<nvvmResult (*)(nvvmProgram, size_t*) noexcept nogil>__nvvmGetProgramLogSize)( | |
| prog, bufferSizeRet) | |
| cdef nvvmResult _nvvmGetProgramLog(nvvmProgram prog, char* buffer) except?_NVVMRESULT_INTERNAL_LOADING_ERROR nogil: | |
| global __nvvmGetProgramLog | |
| _check_or_init_nvvm() | |
| if __nvvmGetProgramLog == NULL: | |
| with gil: | |
| raise FunctionNotFoundError("function nvvmGetProgramLog is not found") | |
| return (<nvvmResult (*)(nvvmProgram, char*) noexcept nogil>__nvvmGetProgramLog)( | |
| prog, buffer) | |