// SPDX-License-Identifier: Mulan PSL v2
/*
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This software is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *         http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

use xgpu_macros::api_hook;

#[api_hook(DriverApi, backend = crate::hook_impl::ipc::driver::DriverApiImpl)]
mod api {
    use std::ffi::{c_char, c_int, c_uchar, c_uint, c_ulonglong, c_ushort, c_void};

    use cudax::driver::*;

    unsafe extern "C" {
        pub fn cuGetErrorString(error: CUresult, p_str: *mut *const c_char) -> CUresult;

        pub fn cuGetErrorName(error: CUresult, p_str: *mut *const c_char) -> CUresult;

        pub fn cuInit(flags: c_uint) -> CUresult;

        pub fn cuDriverGetVersion(driver_version: *mut c_int) -> CUresult;

        pub fn cuDeviceGet(device: *mut CUdevice, ordinal: c_int) -> CUresult;

        pub fn cuDeviceGetCount(count: *mut c_int) -> CUresult;

        pub fn cuDeviceGetName(name: *mut c_char, len: c_int, dev: CUdevice) -> CUresult;

        pub fn cuDeviceGetUuid(uuid: *mut CUuuid, dev: CUdevice) -> CUresult;

        pub fn cuDeviceGetUuid_v2(uuid: *mut CUuuid, dev: CUdevice) -> CUresult;

        pub fn cuDeviceGetLuid(
            luid: *mut c_char,
            device_node_mask: *mut c_uint,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuDeviceTotalMem_v2(bytes: *mut usize, dev: CUdevice) -> CUresult;

        pub fn cuDeviceGetTexture1DLinearMaxWidth(
            max_width_in_elements: *mut usize,
            format: CUarray_format,
            num_channels: c_uint,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuDeviceGetAttribute(
            pi: *mut c_int,
            attrib: CUdevice_attribute,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuDeviceGetNvSciSyncAttributes(
            nv_sci_sync_attr_list: *mut c_void,
            dev: CUdevice,
            flags: c_int,
        ) -> CUresult;

        pub fn cuDeviceSetMemPool(dev: CUdevice, pool: CUmemoryPool) -> CUresult;

        pub fn cuDeviceGetMemPool(pool: *mut CUmemoryPool, dev: CUdevice) -> CUresult;

        pub fn cuDeviceGetDefaultMemPool(pool_out: *mut CUmemoryPool, dev: CUdevice) -> CUresult;

        pub fn cuDeviceGetExecAffinitySupport(
            pi: *mut c_int,
            type_: CUexecAffinityType,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuFlushGPUDirectRDMAWrites(
            target: CUflushGPUDirectRDMAWritesTarget,
            scope: CUflushGPUDirectRDMAWritesScope,
        ) -> CUresult;

        pub fn cuDeviceGetProperties(prop: *mut CUdevprop, dev: CUdevice) -> CUresult;

        pub fn cuDeviceComputeCapability(
            major: *mut c_int,
            minor: *mut c_int,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuDevicePrimaryCtxRetain(p_ctx: *mut CUcontext, dev: CUdevice) -> CUresult;

        pub fn cuDevicePrimaryCtxRelease_v2(dev: CUdevice) -> CUresult;

        pub fn cuDevicePrimaryCtxSetFlags_v2(dev: CUdevice, flags: c_uint) -> CUresult;

        pub fn cuDevicePrimaryCtxGetState(
            dev: CUdevice,
            flags: *mut c_uint,
            active: *mut c_int,
        ) -> CUresult;

        pub fn cuDevicePrimaryCtxReset_v2(dev: CUdevice) -> CUresult;

        pub fn cuCtxCreate_v2(p_ctx: *mut CUcontext, flags: c_uint, dev: CUdevice) -> CUresult;

        pub fn cuCtxCreate_v3(
            p_ctx: *mut CUcontext,
            params_array: *mut CUexecAffinityParam,
            num_params: c_int,
            flags: c_uint,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuCtxDestroy_v2(ctx: CUcontext) -> CUresult;

        pub fn cuCtxPushCurrent_v2(ctx: CUcontext) -> CUresult;

        pub fn cuCtxPopCurrent_v2(p_ctx: *mut CUcontext) -> CUresult;

        pub fn cuCtxSetCurrent(ctx: CUcontext) -> CUresult;

        pub fn cuCtxGetCurrent(p_ctx: *mut CUcontext) -> CUresult;

        pub fn cuCtxGetDevice(device: *mut CUdevice) -> CUresult;

        pub fn cuCtxGetFlags(flags: *mut c_uint) -> CUresult;

        pub fn cuCtxSetFlags(flags: c_uint) -> CUresult;

        pub fn cuCtxGetId(ctx: CUcontext, ctx_id: *mut c_ulonglong) -> CUresult;

        pub fn cuCtxSynchronize() -> CUresult;

        pub fn cuCtxSetLimit(limit: CUlimit, value: usize) -> CUresult;

        pub fn cuCtxGetLimit(pvalue: *mut usize, limit: CUlimit) -> CUresult;

        pub fn cuCtxGetCacheConfig(p_config: *mut CUfunc_cache) -> CUresult;

        pub fn cuCtxSetCacheConfig(config: CUfunc_cache) -> CUresult;

        pub fn cuCtxGetApiVersion(ctx: CUcontext, version: *mut c_uint) -> CUresult;

        pub fn cuCtxGetStreamPriorityRange(
            least_priority: *mut c_int,
            greatest_priority: *mut c_int,
        ) -> CUresult;

        pub fn cuCtxResetPersistingL2Cache() -> CUresult;

        pub fn cuCtxGetExecAffinity(
            p_exec_affinity: *mut CUexecAffinityParam,
            type_: CUexecAffinityType,
        ) -> CUresult;

        pub fn cuCtxAttach(p_ctx: *mut CUcontext, flags: c_uint) -> CUresult;

        pub fn cuCtxDetach(ctx: CUcontext) -> CUresult;

        pub fn cuCtxGetSharedMemConfig(p_config: *mut CUsharedconfig) -> CUresult;

        pub fn cuCtxSetSharedMemConfig(config: CUsharedconfig) -> CUresult;

        pub fn cuModuleLoad(module: *mut CUmodule, fname: *const c_char) -> CUresult;

        pub fn cuModuleLoadData(module: *mut CUmodule, image: *const c_void) -> CUresult;

        pub fn cuModuleLoadDataEx(
            module: *mut CUmodule,
            image: *const c_void,
            num_options: c_uint,
            options: *mut CUjit_option,
            option_values: *mut *mut c_void,
        ) -> CUresult;

        pub fn cuModuleLoadFatBinary(module: *mut CUmodule, fat_cubin: *const c_void) -> CUresult;

        pub fn cuModuleUnload(hmod: CUmodule) -> CUresult;

        pub fn cuModuleGetLoadingMode(mode: *mut CUmoduleLoadingMode) -> CUresult;

        pub fn cuModuleGetFunction(
            hfunc: *mut CUfunction,
            hmod: CUmodule,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuModuleGetFunctionCount(count: *mut c_uint, mod_: CUmodule) -> CUresult;

        pub fn cuModuleEnumerateFunctions(
            functions: *mut CUfunction,
            num_functions: c_uint,
            mod_: CUmodule,
        ) -> CUresult;

        pub fn cuModuleGetGlobal_v2(
            dptr: *mut CUdeviceptr,
            bytes: *mut usize,
            hmod: CUmodule,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuLinkCreate_v2(
            num_options: c_uint,
            options: *mut CUjit_option,
            option_values: *mut *mut c_void,
            state_out: *mut CUlinkState,
        ) -> CUresult;

        pub fn cuLinkAddData_v2(
            state: CUlinkState,
            type_: CUjitInputType,
            data: *mut c_void,
            size: usize,
            name: *const c_char,
            num_options: c_uint,
            options: *mut CUjit_option,
            option_values: *mut *mut c_void,
        ) -> CUresult;

        pub fn cuLinkAddFile_v2(
            state: CUlinkState,
            type_: CUjitInputType,
            path: *const c_char,
            num_options: c_uint,
            options: *mut CUjit_option,
            option_values: *mut *mut c_void,
        ) -> CUresult;

        pub fn cuLinkComplete(
            state: CUlinkState,
            cubin_out: *mut *mut c_void,
            size_out: *mut usize,
        ) -> CUresult;

        pub fn cuLinkDestroy(state: CUlinkState) -> CUresult;

        pub fn cuModuleGetTexRef(
            p_tex_ref: *mut CUtexref,
            hmod: CUmodule,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuModuleGetSurfRef(
            p_surf_ref: *mut CUsurfref,
            hmod: CUmodule,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuLibraryLoadData(
            library: *mut CUlibrary,
            code: *const c_void,
            jit_options: *mut CUjit_option,
            jit_options_values: *mut *mut c_void,
            num_jit_options: c_uint,
            library_options: *mut CUlibraryOption,
            library_option_values: *mut *mut c_void,
            num_library_options: c_uint,
        ) -> CUresult;

        pub fn cuLibraryLoadFromFile(
            library: *mut CUlibrary,
            file_name: *const c_char,
            jit_options: *mut CUjit_option,
            jit_options_values: *mut *mut c_void,
            num_jit_options: c_uint,
            library_options: *mut CUlibraryOption,
            library_option_values: *mut *mut c_void,
            num_library_options: c_uint,
        ) -> CUresult;

        pub fn cuLibraryUnload(library: CUlibrary) -> CUresult;

        pub fn cuLibraryGetKernel(
            p_kernel: *mut CUkernel,
            library: CUlibrary,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuLibraryGetKernelCount(count: *mut c_uint, lib: CUlibrary) -> CUresult;

        pub fn cuLibraryEnumerateKernels(
            kernels: *mut CUkernel,
            num_kernels: c_uint,
            lib: CUlibrary,
        ) -> CUresult;

        pub fn cuLibraryGetModule(p_mod: *mut CUmodule, library: CUlibrary) -> CUresult;

        pub fn cuKernelGetFunction(p_func: *mut CUfunction, kernel: CUkernel) -> CUresult;

        pub fn cuLibraryGetGlobal(
            dptr: *mut CUdeviceptr,
            bytes: *mut usize,
            library: CUlibrary,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuLibraryGetManaged(
            dptr: *mut CUdeviceptr,
            bytes: *mut usize,
            library: CUlibrary,
            name: *const c_char,
        ) -> CUresult;

        pub fn cuLibraryGetUnifiedFunction(
            fptr: *mut *mut c_void,
            library: CUlibrary,
            symbol: *const c_char,
        ) -> CUresult;

        pub fn cuKernelGetAttribute(
            pi: *mut c_int,
            attrib: CUfunction_attribute,
            kernel: CUkernel,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuKernelSetAttribute(
            attrib: CUfunction_attribute,
            val: c_int,
            kernel: CUkernel,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuKernelSetCacheConfig(
            kernel: CUkernel,
            config: CUfunc_cache,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuKernelGetName(name: *mut *const c_char, hfunc: CUkernel) -> CUresult;

        pub fn cuKernelGetParamInfo(
            kernel: CUkernel,
            param_index: usize,
            param_offset: *mut usize,
            param_size: *mut usize,
        ) -> CUresult;

        pub fn cuMemGetInfo_v2(free: *mut usize, total: *mut usize) -> CUresult;

        pub fn cuMemAlloc_v2(dptr: *mut CUdeviceptr, bytesize: usize) -> CUresult;

        pub fn cuMemAllocPitch_v2(
            dptr: *mut CUdeviceptr,
            p_pitch: *mut usize,
            width_in_bytes: usize,
            height: usize,
            element_size_bytes: c_uint,
        ) -> CUresult;

        pub fn cuMemFree_v2(dptr: CUdeviceptr) -> CUresult;

        pub fn cuMemGetAddressRange_v2(
            pbase: *mut CUdeviceptr,
            psize: *mut usize,
            dptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuMemAllocHost_v2(pp: *mut *mut c_void, bytesize: usize) -> CUresult;

        pub fn cuMemFreeHost(p: *mut c_void) -> CUresult;

        pub fn cuMemHostAlloc(pp: *mut *mut c_void, bytesize: usize, flags: c_uint) -> CUresult;

        pub fn cuMemHostGetDevicePointer_v2(
            pdptr: *mut CUdeviceptr,
            p: *mut c_void,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuMemHostGetFlags(pflags: *mut c_uint, p: *mut c_void) -> CUresult;

        pub fn cuMemAllocManaged(
            dptr: *mut CUdeviceptr,
            bytesize: usize,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuDeviceRegisterAsyncNotification(
            device: CUdevice,
            callback_func: CUasyncCallback,
            user_data: *mut c_void,
            callback: *mut CUasyncCallbackHandle,
        ) -> CUresult;

        pub fn cuDeviceUnregisterAsyncNotification(
            device: CUdevice,
            callback: CUasyncCallbackHandle,
        ) -> CUresult;

        pub fn cuDeviceGetByPCIBusId(dev: *mut CUdevice, pci_bus_id: *const c_char) -> CUresult;

        pub fn cuDeviceGetPCIBusId(pci_bus_id: *mut c_char, len: c_int, dev: CUdevice) -> CUresult;

        pub fn cuIpcGetEventHandle(p_handle: *mut CUipcEventHandle, event: CUevent) -> CUresult;

        pub fn cuIpcOpenEventHandle(ph_event: *mut CUevent, handle: CUipcEventHandle) -> CUresult;

        pub fn cuIpcGetMemHandle(p_handle: *mut CUipcMemHandle, dptr: CUdeviceptr) -> CUresult;

        pub fn cuIpcOpenMemHandle_v2(
            pdptr: *mut CUdeviceptr,
            handle: CUipcMemHandle,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuIpcCloseMemHandle(dptr: CUdeviceptr) -> CUresult;

        pub fn cuMemHostRegister_v2(p: *mut c_void, bytesize: usize, flags: c_uint) -> CUresult;

        pub fn cuMemHostUnregister(p: *mut c_void) -> CUresult;

        pub fn cuMemcpy(dst: CUdeviceptr, src: CUdeviceptr, byte_count: usize) -> CUresult;

        pub fn cuMemcpyPeer(
            dst_device: CUdeviceptr,
            dst_context: CUcontext,
            src_device: CUdeviceptr,
            src_context: CUcontext,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyHtoD_v2(
            dst_device: CUdeviceptr,
            src_host: *const c_void,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyDtoH_v2(
            dst_host: *mut c_void,
            src_device: CUdeviceptr,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyDtoD_v2(
            dst_device: CUdeviceptr,
            src_device: CUdeviceptr,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyDtoA_v2(
            dst_array: CUarray,
            dst_offset: usize,
            src_device: CUdeviceptr,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyAtoD_v2(
            dst_device: CUdeviceptr,
            src_array: CUarray,
            src_offset: usize,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyHtoA_v2(
            dst_array: CUarray,
            dst_offset: usize,
            src_host: *const c_void,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyAtoH_v2(
            dst_host: *mut c_void,
            src_array: CUarray,
            src_offset: usize,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpyAtoA_v2(
            dst_array: CUarray,
            dst_offset: usize,
            src_array: CUarray,
            src_offset: usize,
            byte_count: usize,
        ) -> CUresult;

        pub fn cuMemcpy2D_v2(p_copy: *const CUDA_MEMCPY2D) -> CUresult;

        pub fn cuMemcpy2DUnaligned_v2(p_copy: *const CUDA_MEMCPY2D) -> CUresult;

        pub fn cuMemcpy3D_v2(p_copy: *const CUDA_MEMCPY3D) -> CUresult;

        pub fn cuMemcpy3DPeer(p_copy: *const CUDA_MEMCPY3D_PEER) -> CUresult;

        pub fn cuMemcpyAsync(
            dst: CUdeviceptr,
            src: CUdeviceptr,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpyPeerAsync(
            dst_device: CUdeviceptr,
            dst_context: CUcontext,
            src_device: CUdeviceptr,
            src_context: CUcontext,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpyHtoDAsync_v2(
            dst_device: CUdeviceptr,
            src_host: *const c_void,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpyDtoHAsync_v2(
            dst_host: *mut c_void,
            src_device: CUdeviceptr,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpyDtoDAsync_v2(
            dst_device: CUdeviceptr,
            src_device: CUdeviceptr,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpyHtoAAsync_v2(
            dst_array: CUarray,
            dst_offset: usize,
            src_host: *const c_void,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpyAtoHAsync_v2(
            dst_host: *mut c_void,
            src_array: CUarray,
            src_offset: usize,
            byte_count: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemcpy2DAsync_v2(p_copy: *const CUDA_MEMCPY2D, h_stream: CUstream) -> CUresult;

        pub fn cuMemcpy3DAsync_v2(p_copy: *const CUDA_MEMCPY3D, h_stream: CUstream) -> CUresult;

        pub fn cuMemcpy3DPeerAsync(
            p_copy: *const CUDA_MEMCPY3D_PEER,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemsetD8_v2(dst_device: CUdeviceptr, uc: c_uchar, n: usize) -> CUresult;

        pub fn cuMemsetD16_v2(dst_device: CUdeviceptr, us: c_ushort, n: usize) -> CUresult;

        pub fn cuMemsetD32_v2(dst_device: CUdeviceptr, ui: c_uint, n: usize) -> CUresult;

        pub fn cuMemsetD2D8_v2(
            dst_device: CUdeviceptr,
            dst_pitch: usize,
            uc: c_uchar,
            width: usize,
            height: usize,
        ) -> CUresult;

        pub fn cuMemsetD2D16_v2(
            dst_device: CUdeviceptr,
            dst_pitch: usize,
            us: c_ushort,
            width: usize,
            height: usize,
        ) -> CUresult;

        pub fn cuMemsetD2D32_v2(
            dst_device: CUdeviceptr,
            dst_pitch: usize,
            ui: c_uint,
            width: usize,
            height: usize,
        ) -> CUresult;

        pub fn cuMemsetD8Async(
            dst_device: CUdeviceptr,
            uc: c_uchar,
            n: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemsetD16Async(
            dst_device: CUdeviceptr,
            us: c_ushort,
            n: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemsetD32Async(
            dst_device: CUdeviceptr,
            ui: c_uint,
            n: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemsetD2D8Async(
            dst_device: CUdeviceptr,
            dst_pitch: usize,
            uc: c_uchar,
            width: usize,
            height: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemsetD2D16Async(
            dst_device: CUdeviceptr,
            dst_pitch: usize,
            us: c_ushort,
            width: usize,
            height: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemsetD2D32Async(
            dst_device: CUdeviceptr,
            dst_pitch: usize,
            ui: c_uint,
            width: usize,
            height: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuArrayCreate_v2(
            p_handle: *mut CUarray,
            p_allocate_array: *const CUDA_ARRAY_DESCRIPTOR,
        ) -> CUresult;

        pub fn cuArrayGetDescriptor_v2(
            p_array_descriptor: *mut CUDA_ARRAY_DESCRIPTOR,
            h_array: CUarray,
        ) -> CUresult;

        pub fn cuArrayGetSparseProperties(
            sparse_properties: *mut CUDA_ARRAY_SPARSE_PROPERTIES,
            array: CUarray,
        ) -> CUresult;

        pub fn cuMipmappedArrayGetSparseProperties(
            sparse_properties: *mut CUDA_ARRAY_SPARSE_PROPERTIES,
            mipmap: CUmipmappedArray,
        ) -> CUresult;

        pub fn cuArrayGetMemoryRequirements(
            memory_requirements: *mut CUDA_ARRAY_MEMORY_REQUIREMENTS,
            array: CUarray,
            device: CUdevice,
        ) -> CUresult;

        pub fn cuMipmappedArrayGetMemoryRequirements(
            memory_requirements: *mut CUDA_ARRAY_MEMORY_REQUIREMENTS,
            mipmap: CUmipmappedArray,
            device: CUdevice,
        ) -> CUresult;

        pub fn cuArrayGetPlane(
            p_plane_array: *mut CUarray,
            h_array: CUarray,
            plane_idx: c_uint,
        ) -> CUresult;

        pub fn cuArrayDestroy(h_array: CUarray) -> CUresult;

        pub fn cuArray3DCreate_v2(
            p_handle: *mut CUarray,
            p_allocate_array: *const CUDA_ARRAY3D_DESCRIPTOR,
        ) -> CUresult;

        pub fn cuArray3DGetDescriptor_v2(
            p_array_descriptor: *mut CUDA_ARRAY3D_DESCRIPTOR,
            h_array: CUarray,
        ) -> CUresult;

        pub fn cuMipmappedArrayCreate(
            p_handle: *mut CUmipmappedArray,
            p_mipmapped_array_desc: *const CUDA_ARRAY3D_DESCRIPTOR,
            num_mipmap_levels: c_uint,
        ) -> CUresult;

        pub fn cuMipmappedArrayGetLevel(
            p_level_array: *mut CUarray,
            h_mipmapped_array: CUmipmappedArray,
            level: c_uint,
        ) -> CUresult;

        pub fn cuMipmappedArrayDestroy(h_mipmapped_array: CUmipmappedArray) -> CUresult;

        pub fn cuMemGetHandleForAddressRange(
            handle: *mut c_void,
            dptr: CUdeviceptr,
            size: usize,
            handle_type: CUmemRangeHandleType,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemAddressReserve(
            ptr: *mut CUdeviceptr,
            size: usize,
            alignment: usize,
            addr: CUdeviceptr,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemAddressFree(ptr: CUdeviceptr, size: usize) -> CUresult;

        pub fn cuMemCreate(
            handle: *mut CUmemGenericAllocationHandle,
            size: usize,
            prop: *const CUmemAllocationProp,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemRelease(handle: CUmemGenericAllocationHandle) -> CUresult;

        pub fn cuMemMap(
            ptr: CUdeviceptr,
            size: usize,
            offset: usize,
            handle: CUmemGenericAllocationHandle,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemMapArrayAsync(
            map_info_list: *mut CUarrayMapInfo,
            count: c_uint,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemUnmap(ptr: CUdeviceptr, size: usize) -> CUresult;

        pub fn cuMemSetAccess(
            ptr: CUdeviceptr,
            size: usize,
            desc: *const CUmemAccessDesc,
            count: usize,
        ) -> CUresult;

        pub fn cuMemGetAccess(
            flags: *mut c_ulonglong,
            location: *const CUmemLocation,
            ptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuMemExportToShareableHandle(
            shareable_handle: *mut c_void,
            handle: CUmemGenericAllocationHandle,
            handle_type: CUmemAllocationHandleType,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemImportFromShareableHandle(
            handle: *mut CUmemGenericAllocationHandle,
            os_handle: *mut c_void,
            sh_handle_type: CUmemAllocationHandleType,
        ) -> CUresult;

        pub fn cuMemGetAllocationGranularity(
            granularity: *mut usize,
            prop: *const CUmemAllocationProp,
            option: CUmemAllocationGranularity_flags,
        ) -> CUresult;

        pub fn cuMemGetAllocationPropertiesFromHandle(
            prop: *mut CUmemAllocationProp,
            handle: CUmemGenericAllocationHandle,
        ) -> CUresult;

        pub fn cuMemRetainAllocationHandle(
            handle: *mut CUmemGenericAllocationHandle,
            addr: *mut c_void,
        ) -> CUresult;

        pub fn cuMemFreeAsync(dptr: CUdeviceptr, h_stream: CUstream) -> CUresult;

        pub fn cuMemAllocAsync(
            dptr: *mut CUdeviceptr,
            bytesize: usize,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemPoolTrimTo(pool: CUmemoryPool, min_bytes_to_keep: usize) -> CUresult;

        pub fn cuMemPoolSetAttribute(
            pool: CUmemoryPool,
            attr: CUmemPool_attribute,
            value: *mut c_void,
        ) -> CUresult;

        pub fn cuMemPoolGetAttribute(
            pool: CUmemoryPool,
            attr: CUmemPool_attribute,
            value: *mut c_void,
        ) -> CUresult;

        pub fn cuMemPoolSetAccess(
            pool: CUmemoryPool,
            map: *const CUmemAccessDesc,
            count: usize,
        ) -> CUresult;

        pub fn cuMemPoolGetAccess(
            flags: *mut CUmemAccess_flags,
            mem_pool: CUmemoryPool,
            location: *mut CUmemLocation,
        ) -> CUresult;

        pub fn cuMemPoolCreate(
            pool: *mut CUmemoryPool,
            pool_props: *const CUmemPoolProps,
        ) -> CUresult;

        pub fn cuMemPoolDestroy(pool: CUmemoryPool) -> CUresult;

        pub fn cuMemAllocFromPoolAsync(
            dptr: *mut CUdeviceptr,
            bytesize: usize,
            pool: CUmemoryPool,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemPoolExportToShareableHandle(
            handle_out: *mut c_void,
            pool: CUmemoryPool,
            handle_type: CUmemAllocationHandleType,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemPoolImportFromShareableHandle(
            pool_out: *mut CUmemoryPool,
            handle: *mut c_void,
            handle_type: CUmemAllocationHandleType,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMemPoolExportPointer(
            share_data_out: *mut CUmemPoolPtrExportData,
            ptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuMemPoolImportPointer(
            ptr_out: *mut CUdeviceptr,
            pool: CUmemoryPool,
            share_data: *mut CUmemPoolPtrExportData,
        ) -> CUresult;

        pub fn cuMulticastCreate(
            mc_handle: *mut CUmemGenericAllocationHandle,
            prop: *const CUmulticastObjectProp,
        ) -> CUresult;

        pub fn cuMulticastAddDevice(
            mc_handle: CUmemGenericAllocationHandle,
            dev: CUdevice,
        ) -> CUresult;

        pub fn cuMulticastBindMem(
            mc_handle: CUmemGenericAllocationHandle,
            mc_offset: usize,
            mem_handle: CUmemGenericAllocationHandle,
            mem_offset: usize,
            size: usize,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMulticastBindAddr(
            mc_handle: CUmemGenericAllocationHandle,
            mc_offset: usize,
            memptr: CUdeviceptr,
            size: usize,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuMulticastUnbind(
            mc_handle: CUmemGenericAllocationHandle,
            dev: CUdevice,
            mc_offset: usize,
            size: usize,
        ) -> CUresult;

        pub fn cuMulticastGetGranularity(
            granularity: *mut usize,
            prop: *const CUmulticastObjectProp,
            option: CUmulticastGranularity_flags,
        ) -> CUresult;

        pub fn cuPointerGetAttribute(
            data: *mut c_void,
            attribute: CUpointer_attribute,
            ptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuMemPrefetchAsync(
            dev_ptr: CUdeviceptr,
            count: usize,
            dst_device: CUdevice,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemPrefetchAsync_v2(
            dev_ptr: CUdeviceptr,
            count: usize,
            location: CUmemLocation,
            flags: c_uint,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuMemAdvise(
            dev_ptr: CUdeviceptr,
            count: usize,
            advice: CUmem_advise,
            device: CUdevice,
        ) -> CUresult;

        pub fn cuMemAdvise_v2(
            dev_ptr: CUdeviceptr,
            count: usize,
            advice: CUmem_advise,
            location: CUmemLocation,
        ) -> CUresult;

        pub fn cuMemRangeGetAttribute(
            data: *mut c_void,
            data_size: usize,
            attribute: CUmem_range_attribute,
            dev_ptr: CUdeviceptr,
            count: usize,
        ) -> CUresult;

        pub fn cuMemRangeGetAttributes(
            data: *mut *mut c_void,
            data_sizes: *mut usize,
            attributes: *mut CUmem_range_attribute,
            num_attributes: usize,
            dev_ptr: CUdeviceptr,
            count: usize,
        ) -> CUresult;

        pub fn cuPointerSetAttribute(
            value: *const c_void,
            attribute: CUpointer_attribute,
            ptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuPointerGetAttributes(
            num_attributes: c_uint,
            attributes: *mut CUpointer_attribute,
            data: *mut *mut c_void,
            ptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuStreamCreate(ph_stream: *mut CUstream, flags: c_uint) -> CUresult;

        pub fn cuStreamCreateWithPriority(
            ph_stream: *mut CUstream,
            flags: c_uint,
            priority: c_int,
        ) -> CUresult;

        pub fn cuStreamGetPriority(h_stream: CUstream, priority: *mut c_int) -> CUresult;

        pub fn cuStreamGetFlags(h_stream: CUstream, flags: *mut c_uint) -> CUresult;

        pub fn cuStreamGetId(h_stream: CUstream, stream_id: *mut c_ulonglong) -> CUresult;

        pub fn cuStreamGetCtx(h_stream: CUstream, p_ctx: *mut CUcontext) -> CUresult;

        pub fn cuStreamWaitEvent(h_stream: CUstream, h_event: CUevent, flags: c_uint) -> CUresult;

        pub fn cuStreamAddCallback(
            h_stream: CUstream,
            callback: CUstreamCallback,
            user_data: *mut c_void,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamBeginCapture_v2(h_stream: CUstream, mode: CUstreamCaptureMode) -> CUresult;

        pub fn cuStreamBeginCaptureToGraph(
            h_stream: CUstream,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            dependency_data: *const CUgraphEdgeData,
            num_dependencies: usize,
            mode: CUstreamCaptureMode,
        ) -> CUresult;

        pub fn cuThreadExchangeStreamCaptureMode(mode: *mut CUstreamCaptureMode) -> CUresult;

        pub fn cuStreamEndCapture(h_stream: CUstream, ph_graph: *mut CUgraph) -> CUresult;

        pub fn cuStreamIsCapturing(
            h_stream: CUstream,
            capture_status: *mut CUstreamCaptureStatus,
        ) -> CUresult;

        pub fn cuStreamGetCaptureInfo_v2(
            h_stream: CUstream,
            capture_status_out: *mut CUstreamCaptureStatus,
            id_out: *mut cuuint64_t,
            graph_out: *mut CUgraph,
            dependencies_out: *mut *const CUgraphNode,
            num_dependencies_out: *mut usize,
        ) -> CUresult;

        pub fn cuStreamGetCaptureInfo_v3(
            h_stream: CUstream,
            capture_status_out: *mut CUstreamCaptureStatus,
            id_out: *mut cuuint64_t,
            graph_out: *mut CUgraph,
            dependencies_out: *mut *const CUgraphNode,
            edge_data_out: *mut *const CUgraphEdgeData,
            num_dependencies_out: *mut usize,
        ) -> CUresult;

        pub fn cuStreamUpdateCaptureDependencies(
            h_stream: CUstream,
            dependencies: *mut CUgraphNode,
            num_dependencies: usize,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamUpdateCaptureDependencies_v2(
            h_stream: CUstream,
            dependencies: *mut CUgraphNode,
            dependency_data: *const CUgraphEdgeData,
            num_dependencies: usize,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamAttachMemAsync(
            h_stream: CUstream,
            dptr: CUdeviceptr,
            length: usize,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamQuery(h_stream: CUstream) -> CUresult;

        pub fn cuStreamSynchronize(h_stream: CUstream) -> CUresult;

        pub fn cuStreamDestroy_v2(h_stream: CUstream) -> CUresult;

        pub fn cuStreamCopyAttributes(dst: CUstream, src: CUstream) -> CUresult;

        pub fn cuStreamGetAttribute(
            h_stream: CUstream,
            attr: CUstreamAttrID,
            value_out: *mut CUstreamAttrValue,
        ) -> CUresult;

        pub fn cuStreamSetAttribute(
            h_stream: CUstream,
            attr: CUstreamAttrID,
            value: *const CUstreamAttrValue,
        ) -> CUresult;

        pub fn cuEventCreate(ph_event: *mut CUevent, flags: c_uint) -> CUresult;

        pub fn cuEventRecord(h_event: CUevent, h_stream: CUstream) -> CUresult;

        pub fn cuEventRecordWithFlags(
            h_event: CUevent,
            h_stream: CUstream,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuEventQuery(h_event: CUevent) -> CUresult;

        pub fn cuEventSynchronize(h_event: CUevent) -> CUresult;

        pub fn cuEventDestroy_v2(h_event: CUevent) -> CUresult;

        pub fn cuEventElapsedTime(
            p_milliseconds: *mut f32,
            h_start: CUevent,
            h_end: CUevent,
        ) -> CUresult;

        pub fn cuImportExternalMemory(
            ext_mem_out: *mut CUexternalMemory,
            mem_handle_desc: *const CUDA_EXTERNAL_MEMORY_HANDLE_DESC,
        ) -> CUresult;

        pub fn cuExternalMemoryGetMappedBuffer(
            dev_ptr: *mut CUdeviceptr,
            ext_mem: CUexternalMemory,
            buffer_desc: *const CUDA_EXTERNAL_MEMORY_BUFFER_DESC,
        ) -> CUresult;

        pub fn cuExternalMemoryGetMappedMipmappedArray(
            mipmap: *mut CUmipmappedArray,
            ext_mem: CUexternalMemory,
            mipmap_desc: *const CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC,
        ) -> CUresult;

        pub fn cuDestroyExternalMemory(ext_mem: CUexternalMemory) -> CUresult;

        pub fn cuImportExternalSemaphore(
            ext_sem_out: *mut CUexternalSemaphore,
            sem_handle_desc: *const CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC,
        ) -> CUresult;

        pub fn cuSignalExternalSemaphoresAsync(
            ext_sem_array: *const CUexternalSemaphore,
            params_array: *const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,
            num_ext_sems: c_uint,
            stream: CUstream,
        ) -> CUresult;

        pub fn cuWaitExternalSemaphoresAsync(
            ext_sem_array: *const CUexternalSemaphore,
            params_array: *const CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,
            num_ext_sems: c_uint,
            stream: CUstream,
        ) -> CUresult;

        pub fn cuDestroyExternalSemaphore(ext_sem: CUexternalSemaphore) -> CUresult;

        pub fn cuStreamWaitValue32_v2(
            stream: CUstream,
            addr: CUdeviceptr,
            value: cuuint32_t,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamWaitValue64_v2(
            stream: CUstream,
            addr: CUdeviceptr,
            value: cuuint64_t,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamWriteValue32_v2(
            stream: CUstream,
            addr: CUdeviceptr,
            value: cuuint32_t,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamWriteValue64_v2(
            stream: CUstream,
            addr: CUdeviceptr,
            value: cuuint64_t,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuStreamBatchMemOp_v2(
            stream: CUstream,
            count: c_uint,
            param_array: *mut CUstreamBatchMemOpParams,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuFuncGetAttribute(
            pi: *mut c_int,
            attrib: CUfunction_attribute,
            hfunc: CUfunction,
        ) -> CUresult;

        pub fn cuFuncSetAttribute(
            hfunc: CUfunction,
            attrib: CUfunction_attribute,
            value: c_int,
        ) -> CUresult;

        pub fn cuFuncSetCacheConfig(hfunc: CUfunction, config: CUfunc_cache) -> CUresult;

        pub fn cuFuncGetModule(hmod: *mut CUmodule, hfunc: CUfunction) -> CUresult;

        pub fn cuFuncGetName(name: *mut *const c_char, hfunc: CUfunction) -> CUresult;

        pub fn cuFuncGetParamInfo(
            func: CUfunction,
            param_index: usize,
            param_offset: *mut usize,
            param_size: *mut usize,
        ) -> CUresult;

        pub fn cuFuncIsLoaded(state: *mut CUfunctionLoadingState, function: CUfunction)
            -> CUresult;

        pub fn cuFuncLoad(function: CUfunction) -> CUresult;

        pub fn cuLaunchKernel(
            f: CUfunction,
            grid_dim_x: c_uint,
            grid_dim_y: c_uint,
            grid_dim_z: c_uint,
            block_dim_x: c_uint,
            block_dim_y: c_uint,
            block_dim_z: c_uint,
            shared_mem_bytes: c_uint,
            h_stream: CUstream,
            kernel_params: *mut *mut c_void,
            extra: *mut *mut c_void,
        ) -> CUresult;

        pub fn cuLaunchKernelEx(
            config: *const CUlaunchConfig,
            f: CUfunction,
            kernel_params: *mut *mut c_void,
            extra: *mut *mut c_void,
        ) -> CUresult;

        pub fn cuLaunchCooperativeKernel(
            f: CUfunction,
            grid_dim_x: c_uint,
            grid_dim_y: c_uint,
            grid_dim_z: c_uint,
            block_dim_x: c_uint,
            block_dim_y: c_uint,
            block_dim_z: c_uint,
            shared_mem_bytes: c_uint,
            h_stream: CUstream,
            kernel_params: *mut *mut c_void,
        ) -> CUresult;

        pub fn cuLaunchCooperativeKernelMultiDevice(
            launch_params_list: *mut CUDA_LAUNCH_PARAMS,
            num_devices: c_uint,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuLaunchHostFunc(
            h_stream: CUstream,
            fn_: CUhostFn,
            user_data: *mut c_void,
        ) -> CUresult;

        pub fn cuFuncSetBlockShape(hfunc: CUfunction, x: c_int, y: c_int, z: c_int) -> CUresult;

        pub fn cuFuncSetSharedSize(hfunc: CUfunction, bytes: c_uint) -> CUresult;

        pub fn cuParamSetSize(hfunc: CUfunction, numbytes: c_uint) -> CUresult;

        pub fn cuParamSeti(hfunc: CUfunction, offset: c_int, value: c_uint) -> CUresult;

        pub fn cuParamSetf(hfunc: CUfunction, offset: c_int, value: f32) -> CUresult;

        pub fn cuParamSetv(
            hfunc: CUfunction,
            offset: c_int,
            ptr: *mut c_void,
            numbytes: c_uint,
        ) -> CUresult;

        pub fn cuLaunch(f: CUfunction) -> CUresult;

        pub fn cuLaunchGrid(f: CUfunction, grid_width: c_int, grid_height: c_int) -> CUresult;

        pub fn cuLaunchGridAsync(
            f: CUfunction,
            grid_width: c_int,
            grid_height: c_int,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuParamSetTexRef(hfunc: CUfunction, texunit: c_int, h_tex_ref: CUtexref)
            -> CUresult;

        pub fn cuFuncSetSharedMemConfig(hfunc: CUfunction, config: CUsharedconfig) -> CUresult;

        pub fn cuGraphCreate(ph_graph: *mut CUgraph, flags: c_uint) -> CUresult;

        pub fn cuGraphAddKernelNode_v2(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *const CUDA_KERNEL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphKernelNodeGetParams_v2(
            h_node: CUgraphNode,
            node_params: *mut CUDA_KERNEL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphKernelNodeSetParams_v2(
            h_node: CUgraphNode,
            node_params: *const CUDA_KERNEL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddMemcpyNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            copy_params: *const CUDA_MEMCPY3D,
            ctx: CUcontext,
        ) -> CUresult;

        pub fn cuGraphMemcpyNodeGetParams(
            h_node: CUgraphNode,
            node_params: *mut CUDA_MEMCPY3D,
        ) -> CUresult;

        pub fn cuGraphMemcpyNodeSetParams(
            h_node: CUgraphNode,
            node_params: *const CUDA_MEMCPY3D,
        ) -> CUresult;

        pub fn cuGraphAddMemsetNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            memset_params: *const CUDA_MEMSET_NODE_PARAMS,
            ctx: CUcontext,
        ) -> CUresult;

        pub fn cuGraphMemsetNodeGetParams(
            h_node: CUgraphNode,
            node_params: *mut CUDA_MEMSET_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphMemsetNodeSetParams(
            h_node: CUgraphNode,
            node_params: *const CUDA_MEMSET_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddHostNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *const CUDA_HOST_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphHostNodeGetParams(
            h_node: CUgraphNode,
            node_params: *mut CUDA_HOST_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphHostNodeSetParams(
            h_node: CUgraphNode,
            node_params: *const CUDA_HOST_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddChildGraphNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            child_graph: CUgraph,
        ) -> CUresult;

        pub fn cuGraphChildGraphNodeGetGraph(
            h_node: CUgraphNode,
            ph_graph: *mut CUgraph,
        ) -> CUresult;

        pub fn cuGraphAddEmptyNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
        ) -> CUresult;

        pub fn cuGraphAddEventRecordNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            event: CUevent,
        ) -> CUresult;

        pub fn cuGraphEventRecordNodeGetEvent(
            h_node: CUgraphNode,
            event_out: *mut CUevent,
        ) -> CUresult;

        pub fn cuGraphEventRecordNodeSetEvent(h_node: CUgraphNode, event: CUevent) -> CUresult;

        pub fn cuGraphAddEventWaitNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            event: CUevent,
        ) -> CUresult;

        pub fn cuGraphEventWaitNodeGetEvent(
            h_node: CUgraphNode,
            event_out: *mut CUevent,
        ) -> CUresult;

        pub fn cuGraphEventWaitNodeSetEvent(h_node: CUgraphNode, event: CUevent) -> CUresult;

        pub fn cuGraphAddExternalSemaphoresSignalNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *const CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExternalSemaphoresSignalNodeGetParams(
            h_node: CUgraphNode,
            params_out: *mut CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExternalSemaphoresSignalNodeSetParams(
            h_node: CUgraphNode,
            node_params: *const CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddExternalSemaphoresWaitNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *const CUDA_EXT_SEM_WAIT_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExternalSemaphoresWaitNodeGetParams(
            h_node: CUgraphNode,
            params_out: *mut CUDA_EXT_SEM_WAIT_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExternalSemaphoresWaitNodeSetParams(
            h_node: CUgraphNode,
            node_params: *const CUDA_EXT_SEM_WAIT_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddBatchMemOpNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *const CUDA_BATCH_MEM_OP_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphBatchMemOpNodeGetParams(
            h_node: CUgraphNode,
            node_params_out: *mut CUDA_BATCH_MEM_OP_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphBatchMemOpNodeSetParams(
            h_node: CUgraphNode,
            node_params: *const CUDA_BATCH_MEM_OP_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExecBatchMemOpNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            node_params: *const CUDA_BATCH_MEM_OP_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddMemAllocNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *mut CUDA_MEM_ALLOC_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphMemAllocNodeGetParams(
            h_node: CUgraphNode,
            params_out: *mut CUDA_MEM_ALLOC_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphAddMemFreeNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            dptr: CUdeviceptr,
        ) -> CUresult;

        pub fn cuGraphMemFreeNodeGetParams(
            h_node: CUgraphNode,
            dptr_out: *mut CUdeviceptr,
        ) -> CUresult;

        pub fn cuDeviceGraphMemTrim(device: CUdevice) -> CUresult;

        pub fn cuDeviceGetGraphMemAttribute(
            device: CUdevice,
            attr: CUgraphMem_attribute,
            value: *mut c_void,
        ) -> CUresult;

        pub fn cuDeviceSetGraphMemAttribute(
            device: CUdevice,
            attr: CUgraphMem_attribute,
            value: *mut c_void,
        ) -> CUresult;

        pub fn cuGraphClone(ph_graph_clone: *mut CUgraph, original_graph: CUgraph) -> CUresult;

        pub fn cuGraphNodeFindInClone(
            ph_node: *mut CUgraphNode,
            h_original_node: CUgraphNode,
            h_cloned_graph: CUgraph,
        ) -> CUresult;

        pub fn cuGraphNodeGetType(h_node: CUgraphNode, type_: *mut CUgraphNodeType) -> CUresult;

        pub fn cuGraphGetNodes(
            h_graph: CUgraph,
            nodes: *mut CUgraphNode,
            num_nodes: *mut usize,
        ) -> CUresult;

        pub fn cuGraphGetRootNodes(
            h_graph: CUgraph,
            root_nodes: *mut CUgraphNode,
            num_root_nodes: *mut usize,
        ) -> CUresult;

        pub fn cuGraphGetEdges(
            h_graph: CUgraph,
            from: *mut CUgraphNode,
            to: *mut CUgraphNode,
            num_edges: *mut usize,
        ) -> CUresult;

        pub fn cuGraphGetEdges_v2(
            h_graph: CUgraph,
            from: *mut CUgraphNode,
            to: *mut CUgraphNode,
            edge_data: *mut CUgraphEdgeData,
            num_edges: *mut usize,
        ) -> CUresult;

        pub fn cuGraphNodeGetDependencies(
            h_node: CUgraphNode,
            dependencies: *mut CUgraphNode,
            num_dependencies: *mut usize,
        ) -> CUresult;

        pub fn cuGraphNodeGetDependencies_v2(
            h_node: CUgraphNode,
            dependencies: *mut CUgraphNode,
            edge_data: *mut CUgraphEdgeData,
            num_dependencies: *mut usize,
        ) -> CUresult;

        pub fn cuGraphNodeGetDependentNodes(
            h_node: CUgraphNode,
            dependent_nodes: *mut CUgraphNode,
            num_dependent_nodes: *mut usize,
        ) -> CUresult;

        pub fn cuGraphNodeGetDependentNodes_v2(
            h_node: CUgraphNode,
            dependent_nodes: *mut CUgraphNode,
            edge_data: *mut CUgraphEdgeData,
            num_dependent_nodes: *mut usize,
        ) -> CUresult;

        pub fn cuGraphAddDependencies(
            h_graph: CUgraph,
            from: *const CUgraphNode,
            to: *const CUgraphNode,
            num_dependencies: usize,
        ) -> CUresult;

        pub fn cuGraphAddDependencies_v2(
            h_graph: CUgraph,
            from: *const CUgraphNode,
            to: *const CUgraphNode,
            edge_data: *const CUgraphEdgeData,
            num_dependencies: usize,
        ) -> CUresult;

        pub fn cuGraphRemoveDependencies(
            h_graph: CUgraph,
            from: *const CUgraphNode,
            to: *const CUgraphNode,
            num_dependencies: usize,
        ) -> CUresult;

        pub fn cuGraphRemoveDependencies_v2(
            h_graph: CUgraph,
            from: *const CUgraphNode,
            to: *const CUgraphNode,
            edge_data: *const CUgraphEdgeData,
            num_dependencies: usize,
        ) -> CUresult;

        pub fn cuGraphDestroyNode(h_node: CUgraphNode) -> CUresult;

        pub fn cuGraphInstantiateWithFlags(
            ph_graph_exec: *mut CUgraphExec,
            h_graph: CUgraph,
            flags: c_ulonglong,
        ) -> CUresult;

        pub fn cuGraphInstantiateWithParams(
            ph_graph_exec: *mut CUgraphExec,
            h_graph: CUgraph,
            instantiate_params: *mut CUDA_GRAPH_INSTANTIATE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExecGetFlags(h_graph_exec: CUgraphExec, flags: *mut cuuint64_t) -> CUresult;

        pub fn cuGraphExecKernelNodeSetParams_v2(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            node_params: *const CUDA_KERNEL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExecMemcpyNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            copy_params: *const CUDA_MEMCPY3D,
            ctx: CUcontext,
        ) -> CUresult;

        pub fn cuGraphExecMemsetNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            memset_params: *const CUDA_MEMSET_NODE_PARAMS,
            ctx: CUcontext,
        ) -> CUresult;

        pub fn cuGraphExecHostNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            node_params: *const CUDA_HOST_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExecChildGraphNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            child_graph: CUgraph,
        ) -> CUresult;

        pub fn cuGraphExecEventRecordNodeSetEvent(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            event: CUevent,
        ) -> CUresult;

        pub fn cuGraphExecEventWaitNodeSetEvent(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            event: CUevent,
        ) -> CUresult;

        pub fn cuGraphExecExternalSemaphoresSignalNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            node_params: *const CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphExecExternalSemaphoresWaitNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            node_params: *const CUDA_EXT_SEM_WAIT_NODE_PARAMS,
        ) -> CUresult;

        pub fn cuGraphNodeSetEnabled(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            is_enabled: c_uint,
        ) -> CUresult;

        pub fn cuGraphNodeGetEnabled(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            is_enabled: *mut c_uint,
        ) -> CUresult;

        pub fn cuGraphUpload(h_graph_exec: CUgraphExec, h_stream: CUstream) -> CUresult;

        pub fn cuGraphLaunch(h_graph_exec: CUgraphExec, h_stream: CUstream) -> CUresult;

        pub fn cuGraphExecDestroy(h_graph_exec: CUgraphExec) -> CUresult;

        pub fn cuGraphDestroy(h_graph: CUgraph) -> CUresult;

        pub fn cuGraphExecUpdate_v2(
            h_graph_exec: CUgraphExec,
            h_graph: CUgraph,
            result_info: *mut CUgraphExecUpdateResultInfo,
        ) -> CUresult;

        pub fn cuGraphKernelNodeCopyAttributes(dst: CUgraphNode, src: CUgraphNode) -> CUresult;

        pub fn cuGraphKernelNodeGetAttribute(
            h_node: CUgraphNode,
            attr: CUkernelNodeAttrID,
            value_out: *mut CUkernelNodeAttrValue,
        ) -> CUresult;

        pub fn cuGraphKernelNodeSetAttribute(
            h_node: CUgraphNode,
            attr: CUkernelNodeAttrID,
            value: *const CUkernelNodeAttrValue,
        ) -> CUresult;

        pub fn cuGraphDebugDotPrint(
            h_graph: CUgraph,
            path: *const c_char,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuUserObjectCreate(
            object_out: *mut CUuserObject,
            ptr: *mut c_void,
            destroy: CUhostFn,
            initial_refcount: c_uint,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuUserObjectRetain(object: CUuserObject, count: c_uint) -> CUresult;

        pub fn cuUserObjectRelease(object: CUuserObject, count: c_uint) -> CUresult;

        pub fn cuGraphRetainUserObject(
            graph: CUgraph,
            object: CUuserObject,
            count: c_uint,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuGraphReleaseUserObject(
            graph: CUgraph,
            object: CUuserObject,
            count: c_uint,
        ) -> CUresult;

        pub fn cuGraphAddNode(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            num_dependencies: usize,
            node_params: *mut CUgraphNodeParams,
        ) -> CUresult;

        pub fn cuGraphAddNode_v2(
            ph_graph_node: *mut CUgraphNode,
            h_graph: CUgraph,
            dependencies: *const CUgraphNode,
            dependency_data: *const CUgraphEdgeData,
            num_dependencies: usize,
            node_params: *mut CUgraphNodeParams,
        ) -> CUresult;

        pub fn cuGraphNodeSetParams(
            h_node: CUgraphNode,
            node_params: *mut CUgraphNodeParams,
        ) -> CUresult;

        pub fn cuGraphExecNodeSetParams(
            h_graph_exec: CUgraphExec,
            h_node: CUgraphNode,
            node_params: *mut CUgraphNodeParams,
        ) -> CUresult;

        pub fn cuGraphConditionalHandleCreate(
            p_handle_out: *mut CUgraphConditionalHandle,
            h_graph: CUgraph,
            ctx: CUcontext,
            default_launch_value: c_uint,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuOccupancyMaxActiveBlocksPerMultiprocessor(
            num_blocks: *mut c_int,
            func: CUfunction,
            block_size: c_int,
            dynamic_smem_size: usize,
        ) -> CUresult;

        pub fn cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(
            num_blocks: *mut c_int,
            func: CUfunction,
            block_size: c_int,
            dynamic_smem_size: usize,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuOccupancyMaxPotentialBlockSize(
            min_grid_size: *mut c_int,
            block_size: *mut c_int,
            func: CUfunction,
            block_size_to_dynamic_smem_size: CUoccupancyB2DSize,
            dynamic_smem_size: usize,
            block_size_limit: c_int,
        ) -> CUresult;

        pub fn cuOccupancyMaxPotentialBlockSizeWithFlags(
            min_grid_size: *mut c_int,
            block_size: *mut c_int,
            func: CUfunction,
            block_size_to_dynamic_smem_size: CUoccupancyB2DSize,
            dynamic_smem_size: usize,
            block_size_limit: c_int,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuOccupancyAvailableDynamicSMemPerBlock(
            dynamic_smem_size: *mut usize,
            func: CUfunction,
            num_blocks: c_int,
            block_size: c_int,
        ) -> CUresult;

        pub fn cuOccupancyMaxPotentialClusterSize(
            cluster_size: *mut c_int,
            func: CUfunction,
            config: *const CUlaunchConfig,
        ) -> CUresult;

        pub fn cuOccupancyMaxActiveClusters(
            num_clusters: *mut c_int,
            func: CUfunction,
            config: *const CUlaunchConfig,
        ) -> CUresult;

        pub fn cuTexRefSetArray(h_tex_ref: CUtexref, h_array: CUarray, flags: c_uint) -> CUresult;

        pub fn cuTexRefSetMipmappedArray(
            h_tex_ref: CUtexref,
            h_mipmapped_array: CUmipmappedArray,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuTexRefSetAddress_v2(
            byte_offset: *mut usize,
            h_tex_ref: CUtexref,
            dptr: CUdeviceptr,
            bytes: usize,
        ) -> CUresult;

        pub fn cuTexRefSetAddress2D_v3(
            h_tex_ref: CUtexref,
            desc: *const CUDA_ARRAY_DESCRIPTOR,
            dptr: CUdeviceptr,
            pitch: usize,
        ) -> CUresult;

        pub fn cuTexRefSetFormat(
            h_tex_ref: CUtexref,
            fmt: CUarray_format,
            num_packed_components: c_int,
        ) -> CUresult;

        pub fn cuTexRefSetAddressMode(
            h_tex_ref: CUtexref,
            dim: c_int,
            am: CUaddress_mode,
        ) -> CUresult;

        pub fn cuTexRefSetFilterMode(h_tex_ref: CUtexref, fm: CUfilter_mode) -> CUresult;

        pub fn cuTexRefSetMipmapFilterMode(h_tex_ref: CUtexref, fm: CUfilter_mode) -> CUresult;

        pub fn cuTexRefSetMipmapLevelBias(h_tex_ref: CUtexref, bias: f32) -> CUresult;

        pub fn cuTexRefSetMipmapLevelClamp(
            h_tex_ref: CUtexref,
            min_mipmap_level_clamp: f32,
            max_mipmap_level_clamp: f32,
        ) -> CUresult;

        pub fn cuTexRefSetMaxAnisotropy(h_tex_ref: CUtexref, max_aniso: c_uint) -> CUresult;

        pub fn cuTexRefSetBorderColor(h_tex_ref: CUtexref, p_border_color: *mut f32) -> CUresult;

        pub fn cuTexRefSetFlags(h_tex_ref: CUtexref, flags: c_uint) -> CUresult;

        pub fn cuTexRefGetAddress_v2(pdptr: *mut CUdeviceptr, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefGetArray(ph_array: *mut CUarray, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefGetMipmappedArray(
            ph_mipmapped_array: *mut CUmipmappedArray,
            h_tex_ref: CUtexref,
        ) -> CUresult;

        pub fn cuTexRefGetAddressMode(
            pam: *mut CUaddress_mode,
            h_tex_ref: CUtexref,
            dim: c_int,
        ) -> CUresult;

        pub fn cuTexRefGetFilterMode(pfm: *mut CUfilter_mode, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefGetFormat(
            p_format: *mut CUarray_format,
            pnum_channels: *mut c_int,
            h_tex_ref: CUtexref,
        ) -> CUresult;

        pub fn cuTexRefGetMipmapFilterMode(
            pfm: *mut CUfilter_mode,
            h_tex_ref: CUtexref,
        ) -> CUresult;

        pub fn cuTexRefGetMipmapLevelBias(pbias: *mut f32, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefGetMipmapLevelClamp(
            p_min_mipmap_level_clamp: *mut f32,
            p_max_mipmap_level_clamp: *mut f32,
            h_tex_ref: CUtexref,
        ) -> CUresult;

        pub fn cuTexRefGetMaxAnisotropy(p_max_aniso: *mut c_int, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefGetBorderColor(p_border_color: *mut f32, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefGetFlags(pflags: *mut c_uint, h_tex_ref: CUtexref) -> CUresult;

        pub fn cuTexRefCreate(p_tex_ref: *mut CUtexref) -> CUresult;

        pub fn cuTexRefDestroy(h_tex_ref: CUtexref) -> CUresult;

        pub fn cuSurfRefSetArray(
            h_surf_ref: CUsurfref,
            h_array: CUarray,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuSurfRefGetArray(ph_array: *mut CUarray, h_surf_ref: CUsurfref) -> CUresult;

        pub fn cuTexObjectCreate(
            p_tex_object: *mut CUtexObject,
            p_res_desc: *const CUDA_RESOURCE_DESC,
            p_tex_desc: *const CUDA_TEXTURE_DESC,
            p_res_view_desc: *const CUDA_RESOURCE_VIEW_DESC,
        ) -> CUresult;

        pub fn cuTexObjectDestroy(tex_object: CUtexObject) -> CUresult;

        pub fn cuTexObjectGetResourceDesc(
            p_res_desc: *mut CUDA_RESOURCE_DESC,
            tex_object: CUtexObject,
        ) -> CUresult;

        pub fn cuTexObjectGetTextureDesc(
            p_tex_desc: *mut CUDA_TEXTURE_DESC,
            tex_object: CUtexObject,
        ) -> CUresult;

        pub fn cuTexObjectGetResourceViewDesc(
            p_res_view_desc: *mut CUDA_RESOURCE_VIEW_DESC,
            tex_object: CUtexObject,
        ) -> CUresult;

        pub fn cuSurfObjectCreate(
            p_surf_object: *mut CUsurfObject,
            p_res_desc: *const CUDA_RESOURCE_DESC,
        ) -> CUresult;

        pub fn cuSurfObjectDestroy(surf_object: CUsurfObject) -> CUresult;

        pub fn cuSurfObjectGetResourceDesc(
            p_res_desc: *mut CUDA_RESOURCE_DESC,
            surf_object: CUsurfObject,
        ) -> CUresult;

        pub fn cuTensorMapEncodeTiled(
            tensor_map: *mut CUtensorMap,
            tensor_data_type: CUtensorMapDataType,
            tensor_rank: cuuint32_t,
            global_address: *mut c_void,
            global_dim: *const cuuint64_t,
            global_strides: *const cuuint64_t,
            box_dim: *const cuuint32_t,
            element_strides: *const cuuint32_t,
            interleave: CUtensorMapInterleave,
            swizzle: CUtensorMapSwizzle,
            l2_promotion: CUtensorMapL2promotion,
            oob_fill: CUtensorMapFloatOOBfill,
        ) -> CUresult;

        pub fn cuTensorMapEncodeIm2col(
            tensor_map: *mut CUtensorMap,
            tensor_data_type: CUtensorMapDataType,
            tensor_rank: cuuint32_t,
            global_address: *mut c_void,
            global_dim: *const cuuint64_t,
            global_strides: *const cuuint64_t,
            pixel_box_lower_corner: *const c_int,
            pixel_box_upper_corner: *const c_int,
            channels_per_pixel: cuuint32_t,
            pixels_per_column: cuuint32_t,
            element_strides: *const cuuint32_t,
            interleave: CUtensorMapInterleave,
            swizzle: CUtensorMapSwizzle,
            l2_promotion: CUtensorMapL2promotion,
            oob_fill: CUtensorMapFloatOOBfill,
        ) -> CUresult;

        pub fn cuTensorMapReplaceAddress(
            tensor_map: *mut CUtensorMap,
            global_address: *mut c_void,
        ) -> CUresult;

        pub fn cuDeviceCanAccessPeer(
            can_access_peer: *mut c_int,
            dev: CUdevice,
            peer_dev: CUdevice,
        ) -> CUresult;

        pub fn cuCtxEnablePeerAccess(peer_context: CUcontext, flags: c_uint) -> CUresult;

        pub fn cuCtxDisablePeerAccess(peer_context: CUcontext) -> CUresult;

        pub fn cuDeviceGetP2PAttribute(
            value: *mut c_int,
            attrib: CUdevice_P2PAttribute,
            src_device: CUdevice,
            dst_device: CUdevice,
        ) -> CUresult;

        pub fn cuGraphicsUnregisterResource(resource: CUgraphicsResource) -> CUresult;

        pub fn cuGraphicsSubResourceGetMappedArray(
            p_array: *mut CUarray,
            resource: CUgraphicsResource,
            array_index: c_uint,
            mip_level: c_uint,
        ) -> CUresult;

        pub fn cuGraphicsResourceGetMappedMipmappedArray(
            p_mipmapped_array: *mut CUmipmappedArray,
            resource: CUgraphicsResource,
        ) -> CUresult;

        pub fn cuGraphicsResourceGetMappedPointer_v2(
            p_dev_ptr: *mut CUdeviceptr,
            p_size: *mut usize,
            resource: CUgraphicsResource,
        ) -> CUresult;

        pub fn cuGraphicsResourceSetMapFlags_v2(
            resource: CUgraphicsResource,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuGraphicsMapResources(
            count: c_uint,
            resources: *mut CUgraphicsResource,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuGraphicsUnmapResources(
            count: c_uint,
            resources: *mut CUgraphicsResource,
            h_stream: CUstream,
        ) -> CUresult;

        pub fn cuGetProcAddress_v2(
            symbol: *const c_char,
            pfn: *mut *mut c_void,
            cuda_version: c_int,
            flags: cuuint64_t,
            symbol_status: *mut CUdriverProcAddressQueryResult,
        ) -> CUresult;

        pub fn cuCoredumpGetAttribute(
            attrib: CUcoredumpSettings,
            value: *mut c_void,
            size: *mut usize,
        ) -> CUresult;

        pub fn cuCoredumpGetAttributeGlobal(
            attrib: CUcoredumpSettings,
            value: *mut c_void,
            size: *mut usize,
        ) -> CUresult;

        pub fn cuCoredumpSetAttribute(
            attrib: CUcoredumpSettings,
            value: *mut c_void,
            size: *mut usize,
        ) -> CUresult;

        pub fn cuCoredumpSetAttributeGlobal(
            attrib: CUcoredumpSettings,
            value: *mut c_void,
            size: *mut usize,
        ) -> CUresult;

        pub fn cuGetExportTable(
            pp_export_table: *mut *const c_void,
            p_export_table_id: *const CUuuid,
        ) -> CUresult;

        pub fn cuGreenCtxCreate(
            ph_ctx: *mut CUgreenCtx,
            desc: CUdevResourceDesc,
            dev: CUdevice,
            flags: c_uint,
        ) -> CUresult;

        pub fn cuGreenCtxDestroy(h_ctx: CUgreenCtx) -> CUresult;

        pub fn cuCtxFromGreenCtx(p_context: *mut CUcontext, h_ctx: CUgreenCtx) -> CUresult;

        pub fn cuDeviceGetDevResource(
            device: CUdevice,
            resource: *mut CUdevResource,
            type_: CUdevResourceType,
        ) -> CUresult;

        pub fn cuCtxGetDevResource(
            h_ctx: CUcontext,
            resource: *mut CUdevResource,
            type_: CUdevResourceType,
        ) -> CUresult;

        pub fn cuGreenCtxGetDevResource(
            h_ctx: CUgreenCtx,
            resource: *mut CUdevResource,
            type_: CUdevResourceType,
        ) -> CUresult;

        pub fn cuDevSmResourceSplitByCount(
            result: *mut CUdevResource,
            nb_groups: *mut c_uint,
            input: *const CUdevResource,
            remaining: *mut CUdevResource,
            useflags: c_uint,
            min_count: c_uint,
        ) -> CUresult;

        pub fn cuDevResourceGenerateDesc(
            ph_desc: *mut CUdevResourceDesc,
            resources: *mut CUdevResource,
            nb_resources: c_uint,
        ) -> CUresult;

        pub fn cuGreenCtxRecordEvent(h_ctx: CUgreenCtx, h_event: CUevent) -> CUresult;

        pub fn cuGreenCtxWaitEvent(h_ctx: CUgreenCtx, h_event: CUevent) -> CUresult;

        pub fn cuStreamGetGreenCtx(h_stream: CUstream, ph_ctx: *mut CUgreenCtx) -> CUresult;

    }
}

pub use api::DriverApi;