Coverage for cuda / bindings / _example_helpers / common.py: 0.00%
57 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2021-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE
5import os
6import sys
8import numpy as np
10from cuda import pathfinder
11from cuda.bindings import driver as cuda
12from cuda.bindings import nvrtc
13from cuda.bindings import runtime as cudart
15from .helper_cuda import check_cuda_errors
18def requirement_not_met(message):
19 print(message, file=sys.stderr) # noqa: T201
20 exitcode = os.environ.get("CUDA_BINDINGS_SKIP_EXAMPLE", "1")
21 return sys.exit(int(exitcode))
24def check_compute_capability_too_low(dev_id, required_cc_major_minor):
25 cc_major = check_cuda_errors(
26 cudart.cudaDeviceGetAttribute(cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, dev_id)
27 )
28 cc_minor = check_cuda_errors(
29 cudart.cudaDeviceGetAttribute(cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, dev_id)
30 )
31 have_cc_major_minor = (cc_major, cc_minor)
32 if have_cc_major_minor < required_cc_major_minor:
33 requirement_not_met(
34 f"CUDA device compute capability too low: {have_cc_major_minor=!r}, {required_cc_major_minor=!r}"
35 )
38class KernelHelper:
39 def __init__(self, code, dev_id):
40 include_dirs = []
41 for libname in ("cudart", "cccl"):
42 hdr_dir = pathfinder.find_nvidia_header_directory(libname)
43 if hdr_dir is None:
44 requirement_not_met(f'pathfinder.find_nvidia_header_directory("{libname}") returned None')
45 include_dirs.append(hdr_dir)
47 prog = check_cuda_errors(nvrtc.nvrtcCreateProgram(str.encode(code), b"sourceCode.cu", 0, None, None))
49 # Initialize CUDA
50 check_cuda_errors(cudart.cudaFree(0))
52 major = check_cuda_errors(
53 cudart.cudaDeviceGetAttribute(cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, dev_id)
54 )
55 minor = check_cuda_errors(
56 cudart.cudaDeviceGetAttribute(cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, dev_id)
57 )
58 _, nvrtc_minor = check_cuda_errors(nvrtc.nvrtcVersion())
59 use_cubin = nvrtc_minor >= 1
60 prefix = "sm" if use_cubin else "compute"
61 arch_arg = bytes(f"--gpu-architecture={prefix}_{major}{minor}", "ascii")
63 opts = [
64 b"--fmad=true",
65 arch_arg,
66 b"--std=c++17",
67 b"-default-device",
68 ]
69 for inc_dir in include_dirs:
70 opts.append(f"--include-path={inc_dir}".encode())
72 try:
73 check_cuda_errors(nvrtc.nvrtcCompileProgram(prog, len(opts), opts))
74 except RuntimeError as err:
75 log_size = check_cuda_errors(nvrtc.nvrtcGetProgramLogSize(prog))
76 log = b" " * log_size
77 check_cuda_errors(nvrtc.nvrtcGetProgramLog(prog, log))
78 import sys
80 print(log.decode(), file=sys.stderr) # noqa: T201
81 print(err, file=sys.stderr) # noqa: T201
82 sys.exit(1)
84 if use_cubin:
85 data_size = check_cuda_errors(nvrtc.nvrtcGetCUBINSize(prog))
86 data = b" " * data_size
87 check_cuda_errors(nvrtc.nvrtcGetCUBIN(prog, data))
88 else:
89 data_size = check_cuda_errors(nvrtc.nvrtcGetPTXSize(prog))
90 data = b" " * data_size
91 check_cuda_errors(nvrtc.nvrtcGetPTX(prog, data))
93 self.module = check_cuda_errors(cuda.cuModuleLoadData(np.char.array(data)))
95 def get_function(self, name):
96 return check_cuda_errors(cuda.cuModuleGetFunction(self.module, name))