kernel-tuner 1.3.0__tar.gz → 1.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/PKG-INFO +4 -3
  2. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/accuracy.py +33 -12
  3. kernel_tuner-1.3.1/kernel_tuner/backends/hip/__init__.py +1 -0
  4. {kernel_tuner-1.3.0/kernel_tuner/backends → kernel_tuner-1.3.1/kernel_tuner/backends/hip}/hip.py +1 -14
  5. kernel_tuner-1.3.1/kernel_tuner/backends/hip/util.py +18 -0
  6. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/nvcuda.py +45 -52
  7. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/hip.py +2 -1
  8. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/nvcuda.py +8 -4
  9. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/runners/simulation.py +6 -0
  10. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/searchspace.py +121 -36
  11. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/bayes_opt.py +10 -8
  12. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/diff_evo.py +3 -3
  13. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/hillclimbers.py +1 -1
  14. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/pyatf_strategies.py +1 -3
  15. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/simulated_annealing.py +10 -6
  16. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/util.py +0 -28
  17. kernel_tuner-1.3.1/kernel_tuner/utils/nvcuda.py +63 -0
  18. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/pyproject.toml +1 -1
  19. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_cuda_functions.py +3 -3
  20. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_searchspace.py +53 -0
  21. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_util_functions.py +0 -10
  22. kernel_tuner-1.3.1/test/utils/nvcuda.py +11 -0
  23. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/LICENSE +0 -0
  24. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/README.md +0 -0
  25. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/__init__.py +0 -0
  26. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/__init__.py +0 -0
  27. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/backend.py +0 -0
  28. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/compiler.py +0 -0
  29. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/cupy.py +0 -0
  30. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/hypertuner.py +0 -0
  31. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/opencl.py +0 -0
  32. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/backends/pycuda.py +0 -0
  33. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/core.py +0 -0
  34. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/energy/__init__.py +0 -0
  35. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/energy/energy.py +0 -0
  36. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/file_utils.py +0 -0
  37. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/hyper.py +0 -0
  38. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/integration.py +0 -0
  39. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/interface.py +0 -0
  40. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/kernelbuilder.py +0 -0
  41. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/__init__.py +0 -0
  42. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/compiler.py +0 -0
  43. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/cupy.py +0 -0
  44. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/ncu.py +0 -0
  45. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/nvml.py +0 -0
  46. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/observer.py +0 -0
  47. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/opencl.py +0 -0
  48. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/pmt.py +0 -0
  49. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/powersensor.py +0 -0
  50. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/pycuda.py +0 -0
  51. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/register.py +0 -0
  52. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/observers/tegra.py +0 -0
  53. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/runners/__init__.py +0 -0
  54. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/runners/runner.py +0 -0
  55. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/runners/sequential.py +0 -0
  56. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/schema/T1/1.0.0/input-schema.json +0 -0
  57. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/schema/T4/1.0.0/metadata-schema.json +0 -0
  58. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/schema/T4/1.0.0/results-schema.json +0 -0
  59. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/__init__.py +0 -0
  60. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/basinhopping.py +0 -0
  61. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/brute_force.py +0 -0
  62. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/common.py +0 -0
  63. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/dual_annealing.py +0 -0
  64. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/firefly_algorithm.py +0 -0
  65. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/genetic_algorithm.py +0 -0
  66. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/greedy_ils.py +0 -0
  67. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/greedy_mls.py +0 -0
  68. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/minimize.py +0 -0
  69. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/mls.py +0 -0
  70. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/ordered_greedy_mls.py +0 -0
  71. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/pso.py +0 -0
  72. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/random_sample.py +0 -0
  73. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/strategies/wrapper.py +0 -0
  74. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/utils/__init__.py +0 -0
  75. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/kernel_tuner/utils/directives.py +0 -0
  76. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/__init__.py +0 -0
  77. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/conftest.py +0 -0
  78. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/context.py +0 -0
  79. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/convolution.cu +0 -0
  80. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/__init__.py +0 -0
  81. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/test_bayesian_optimization.py +0 -0
  82. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/test_cache_file.json +0 -0
  83. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/test_common.py +0 -0
  84. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/test_diff_evo.py +0 -0
  85. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/test_genetic_algorithm.py +0 -0
  86. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/strategies/test_strategies.py +0 -0
  87. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/synthetic_fp32_cache_NVIDIA_RTX_A4000.json +0 -0
  88. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_T1_input.json +0 -0
  89. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_accuracy.py +0 -0
  90. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_backend.py +0 -0
  91. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_cache_file.json +0 -0
  92. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_cache_file_T1_input.json +0 -0
  93. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_common.py +0 -0
  94. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_compiler_functions.py +0 -0
  95. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_core.py +0 -0
  96. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_cupy_functions.py +0 -0
  97. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_custom_optimizer.py +0 -0
  98. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_energy.py +0 -0
  99. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_file_utils.py +0 -0
  100. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_hip_functions.py +0 -0
  101. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_hyper.py +0 -0
  102. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_integration.py +0 -0
  103. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_kernelbuilder.py +0 -0
  104. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_nvml_mocked.py +0 -0
  105. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_observers.py +0 -0
  106. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_opencl_functions.py +0 -0
  107. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_pycuda_functions.py +0 -0
  108. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_pycuda_mocked.py +0 -0
  109. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_runners.py +0 -0
  110. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_time_budgets.py +0 -0
  111. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/test_toml_file.py +0 -0
  112. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/utils/__init__.py +0 -0
  113. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/utils/test_directives.py +0 -0
  114. {kernel_tuner-1.3.0 → kernel_tuner-1.3.1}/test/vector_add.cu +0 -0
@@ -1,8 +1,9 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: kernel_tuner
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: An easy to use CUDA/OpenCL kernel tuner in Python
5
- License: Apache-2.0
5
+ License-Expression: Apache-2.0
6
+ License-File: LICENSE
6
7
  Keywords: auto-tuning,gpu,computing,pycuda,cuda,pyopencl,opencl
7
8
  Author: Ben van Werkhoven
8
9
  Author-email: b.vanwerkhoven@esciencecenter.nl
@@ -58,22 +58,43 @@ class Tunable(UserDict):
58
58
 
59
59
  def _find_bfloat16_if_available():
60
60
  # Try to get bfloat16 if available.
61
- try:
62
- from bfloat16 import bfloat16
63
- return bfloat16
64
- except ImportError:
65
- pass
61
+ dtype = None
66
62
 
63
+ # get it via numpy if available
67
64
  try:
68
- from tensorflow import bfloat16
69
- return bfloat16.as_numpy_dtype
70
- except ImportError:
65
+ dtype = np.dtype("bfloat16")
66
+ except TypeError:
71
67
  pass
72
68
 
73
- logging.warning(
74
- "could not find `bfloat16` data type for numpy, "
75
- + "please install either the package `bfloat16` or `tensorflow`"
76
- )
69
+ # otherwise, try ml_dtypes
70
+ if dtype is None:
71
+ try:
72
+ from ml_dtypes import bfloat16
73
+ dtype = bfloat16
74
+ except ImportError:
75
+ pass
76
+
77
+ # otherwise, try jax
78
+ if dtype is None:
79
+ try:
80
+ from jax.numpy import bfloat16
81
+ dtype = bfloat16
82
+ except ImportError:
83
+ pass
84
+
85
+ # otherwise, try tensorflow
86
+ if dtype is None:
87
+ try:
88
+ from tensorflow import bfloat16
89
+ dtype = bfloat16.as_numpy_dtype
90
+ except ImportError:
91
+ pass
92
+
93
+ if dtype is None:
94
+ logging.warning(
95
+ "could not find `bfloat16` data type for numpy, "
96
+ + "please install either the package `ml_dtypes`, `jax`, or `tensorflow`"
97
+ )
77
98
 
78
99
  return None
79
100
 
@@ -0,0 +1 @@
1
+ from .hip import *
@@ -8,6 +8,7 @@ import numpy as np
8
8
 
9
9
  from kernel_tuner.backends.backend import GPUBackend
10
10
  from kernel_tuner.observers.hip import HipRuntimeObserver
11
+ from kernel_tuner.backends.hip.util import hip_check
11
12
 
12
13
  try:
13
14
  from hip import hip, hiprtc
@@ -31,20 +32,6 @@ dtype_map = {
31
32
 
32
33
  hipSuccess = 0
33
34
 
34
-
35
- def hip_check(call_result):
36
- """helper function to check return values of hip calls"""
37
- err = call_result[0]
38
- result = call_result[1:]
39
- if len(result) == 1:
40
- result = result[0]
41
- if isinstance(err, hip.hipError_t) and err != hip.hipError_t.hipSuccess:
42
- _, error_name = hip.hipGetErrorName(err)
43
- _, error_str = hip.hipGetErrorString(err)
44
- raise RuntimeError(f"{error_name}: {error_str}")
45
- return result
46
-
47
-
48
35
  class HipFunctions(GPUBackend):
49
36
  """Class that groups the HIP functions on maintains state about the device."""
50
37
 
@@ -0,0 +1,18 @@
1
+ try:
2
+ from hip import hip, hiprtc
3
+ except (ImportError, RuntimeError):
4
+ hip = None
5
+
6
+
7
+ def hip_check(call_result):
8
+ """helper function to check return values of hip calls"""
9
+ err = call_result[0]
10
+ result = call_result[1:]
11
+ if len(result) == 1:
12
+ result = result[0]
13
+ if isinstance(err, hip.hipError_t) and err != hip.hipError_t.hipSuccess:
14
+ _, error_name = hip.hipGetErrorName(err)
15
+ _, error_str = hip.hipGetErrorString(err)
16
+ raise RuntimeError(f"{error_name}: {error_str}")
17
+ return result
18
+
@@ -5,18 +5,23 @@ import numpy as np
5
5
 
6
6
  from kernel_tuner.backends.backend import GPUBackend
7
7
  from kernel_tuner.observers.nvcuda import CudaRuntimeObserver
8
- from kernel_tuner.util import SkippableFailure, cuda_error_check, to_valid_nvrtc_gpu_arch_cc
8
+ from kernel_tuner.util import SkippableFailure
9
+ from kernel_tuner.utils.nvcuda import cuda_error_check, to_valid_nvrtc_gpu_arch_cc
9
10
 
10
11
  # embedded in try block to be able to generate documentation
11
12
  # and run tests without cuda-python installed
12
13
  try:
13
- from cuda import cuda, cudart, nvrtc
14
+ from cuda.bindings import driver, runtime, nvrtc
14
15
  except ImportError:
15
- cuda = None
16
+ try:
17
+ # backward compatibility hack for older cuda-python versions
18
+ from cuda import cuda as driver, cudart as runtime, nvrtc as nvrtc
19
+ except ImportError:
20
+ driver = None
16
21
 
17
22
 
18
23
  class CudaFunctions(GPUBackend):
19
- """Class that groups the Cuda functions on maintains state about the device."""
24
+ """Class that groups the Cuda functions and it maintains state about the device."""
20
25
 
21
26
  def __init__(self, device=0, iterations=7, compiler_options=None, observers=None):
22
27
  """Instantiate CudaFunctions object used for interacting with the CUDA device.
@@ -38,34 +43,30 @@ class CudaFunctions(GPUBackend):
38
43
  """
39
44
  self.allocations = []
40
45
  self.texrefs = []
41
- if not cuda:
46
+ if not driver:
42
47
  raise ImportError(
43
48
  "cuda-python not installed, install using 'pip install cuda-python', or check https://kerneltuner.github.io/kernel_tuner/stable/install.html#cuda-and-pycuda."
44
49
  )
45
50
 
46
51
  # initialize and select device
47
- err = cuda.cuInit(0)
52
+ err = driver.cuInit(0)
48
53
  cuda_error_check(err)
49
- err, self.device = cuda.cuDeviceGet(device)
54
+ err, self.device = driver.cuDeviceGet(device)
50
55
  cuda_error_check(err)
51
- err, self.context = cuda.cuDevicePrimaryCtxRetain(device)
56
+ err, self.context = driver.cuDevicePrimaryCtxRetain(device)
52
57
  cuda_error_check(err)
53
58
  if CudaFunctions.last_selected_device != device:
54
- err = cuda.cuCtxSetCurrent(self.context)
59
+ err = driver.cuCtxSetCurrent(self.context)
55
60
  cuda_error_check(err)
56
61
  CudaFunctions.last_selected_device = device
57
62
 
58
63
  # compute capabilities and device properties
59
- err, major = cudart.cudaDeviceGetAttribute(
60
- cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, device
61
- )
64
+ err, major = runtime.cudaDeviceGetAttribute(runtime.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, device)
62
65
  cuda_error_check(err)
63
- err, minor = cudart.cudaDeviceGetAttribute(
64
- cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, device
65
- )
66
+ err, minor = runtime.cudaDeviceGetAttribute(runtime.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, device)
66
67
  cuda_error_check(err)
67
- err, self.max_threads = cudart.cudaDeviceGetAttribute(
68
- cudart.cudaDeviceAttr.cudaDevAttrMaxThreadsPerBlock, device
68
+ err, self.max_threads = runtime.cudaDeviceGetAttribute(
69
+ runtime.cudaDeviceAttr.cudaDevAttrMaxThreadsPerBlock, device
69
70
  )
70
71
  cuda_error_check(err)
71
72
  self.cc = f"{major}{minor}"
@@ -78,11 +79,11 @@ class CudaFunctions(GPUBackend):
78
79
  self.compiler_options_bytes.append(str(option).encode("UTF-8"))
79
80
 
80
81
  # create a stream and events
81
- err, self.stream = cuda.cuStreamCreate(0)
82
+ err, self.stream = driver.cuStreamCreate(0)
82
83
  cuda_error_check(err)
83
- err, self.start = cuda.cuEventCreate(0)
84
+ err, self.start = driver.cuEventCreate(0)
84
85
  cuda_error_check(err)
85
- err, self.end = cuda.cuEventCreate(0)
86
+ err, self.end = driver.cuEventCreate(0)
86
87
  cuda_error_check(err)
87
88
 
88
89
  # default dynamically allocated shared memory size, can be overwritten using smem_args
@@ -95,11 +96,11 @@ class CudaFunctions(GPUBackend):
95
96
  observer.register_device(self)
96
97
 
97
98
  # collect environment information
98
- err, device_properties = cudart.cudaGetDeviceProperties(device)
99
+ err, device_properties = runtime.cudaGetDeviceProperties(device)
99
100
  cuda_error_check(err)
100
101
  env = dict()
101
102
  env["device_name"] = device_properties.name.decode()
102
- env["cuda_version"] = cuda.CUDA_VERSION
103
+ env["cuda_version"] = driver.CUDA_VERSION
103
104
  env["compute_capability"] = self.cc
104
105
  env["iterations"] = self.iterations
105
106
  env["compiler_options"] = self.compiler_options
@@ -109,8 +110,8 @@ class CudaFunctions(GPUBackend):
109
110
 
110
111
  def __del__(self):
111
112
  for device_memory in self.allocations:
112
- if isinstance(device_memory, cuda.CUdeviceptr):
113
- err = cuda.cuMemFree(device_memory)
113
+ if isinstance(device_memory, driver.CUdeviceptr):
114
+ err = driver.cuMemFree(device_memory)
114
115
  cuda_error_check(err)
115
116
 
116
117
  def ready_argument_list(self, arguments):
@@ -128,7 +129,7 @@ class CudaFunctions(GPUBackend):
128
129
  for arg in arguments:
129
130
  # if arg is a numpy array copy it to device
130
131
  if isinstance(arg, np.ndarray):
131
- err, device_memory = cuda.cuMemAlloc(arg.nbytes)
132
+ err, device_memory = driver.cuMemAlloc(arg.nbytes)
132
133
  cuda_error_check(err)
133
134
  self.allocations.append(device_memory)
134
135
  gpu_args.append(device_memory)
@@ -164,38 +165,30 @@ class CudaFunctions(GPUBackend):
164
165
  if not any(["--std=" in opt for opt in self.compiler_options]):
165
166
  self.compiler_options.append("--std=c++11")
166
167
  if not any([b"--gpu-architecture=" in opt or b"-arch" in opt for opt in compiler_options]):
167
- compiler_options.append(
168
- f"--gpu-architecture=compute_{to_valid_nvrtc_gpu_arch_cc(self.cc)}".encode("UTF-8")
169
- )
168
+ compiler_options.append(f"--gpu-architecture=compute_{to_valid_nvrtc_gpu_arch_cc(self.cc)}".encode("UTF-8"))
170
169
  if not any(["--gpu-architecture=" in opt or "-arch" in opt for opt in self.compiler_options]):
171
170
  self.compiler_options.append(f"--gpu-architecture=compute_{to_valid_nvrtc_gpu_arch_cc(self.cc)}")
172
171
 
173
- err, program = nvrtc.nvrtcCreateProgram(
174
- str.encode(kernel_string), b"CUDAProgram", 0, [], []
175
- )
172
+ err, program = nvrtc.nvrtcCreateProgram(str.encode(kernel_string), b"CUDAProgram", 0, [], [])
176
173
  try:
177
174
  cuda_error_check(err)
178
- err = nvrtc.nvrtcCompileProgram(
179
- program, len(compiler_options), compiler_options
180
- )
175
+ err = nvrtc.nvrtcCompileProgram(program, len(compiler_options), compiler_options)
181
176
  cuda_error_check(err)
182
177
  err, size = nvrtc.nvrtcGetPTXSize(program)
183
178
  cuda_error_check(err)
184
179
  buff = b" " * size
185
180
  err = nvrtc.nvrtcGetPTX(program, buff)
186
181
  cuda_error_check(err)
187
- err, self.current_module = cuda.cuModuleLoadData(np.char.array(buff))
188
- if err == cuda.CUresult.CUDA_ERROR_INVALID_PTX:
182
+ err, self.current_module = driver.cuModuleLoadData(np.char.array(buff))
183
+ if err == driver.CUresult.CUDA_ERROR_INVALID_PTX:
189
184
  raise SkippableFailure("uses too much shared data")
190
185
  else:
191
186
  cuda_error_check(err)
192
- err, self.func = cuda.cuModuleGetFunction(
193
- self.current_module, str.encode(kernel_name)
194
- )
187
+ err, self.func = driver.cuModuleGetFunction(self.current_module, str.encode(kernel_name))
195
188
  cuda_error_check(err)
196
189
 
197
190
  # get the number of registers per thread used in this kernel
198
- num_regs = cuda.cuFuncGetAttribute(cuda.CUfunction_attribute.CU_FUNC_ATTRIBUTE_NUM_REGS, self.func)
191
+ num_regs = driver.cuFuncGetAttribute(driver.CUfunction_attribute.CU_FUNC_ATTRIBUTE_NUM_REGS, self.func)
199
192
  assert num_regs[0] == 0, f"Retrieving number of registers per thread unsuccesful: code {num_regs[0]}"
200
193
  self.num_regs = num_regs[1]
201
194
 
@@ -210,18 +203,18 @@ class CudaFunctions(GPUBackend):
210
203
 
211
204
  def start_event(self):
212
205
  """Records the event that marks the start of a measurement."""
213
- err = cudart.cudaEventRecord(self.start, self.stream)
206
+ err = runtime.cudaEventRecord(self.start, self.stream)
214
207
  cuda_error_check(err)
215
208
 
216
209
  def stop_event(self):
217
210
  """Records the event that marks the end of a measurement."""
218
- err = cudart.cudaEventRecord(self.end, self.stream)
211
+ err = runtime.cudaEventRecord(self.end, self.stream)
219
212
  cuda_error_check(err)
220
213
 
221
214
  def kernel_finished(self):
222
215
  """Returns True if the kernel has finished, False otherwise."""
223
- err = cudart.cudaEventQuery(self.end)
224
- if err[0] == cudart.cudaError_t.cudaSuccess:
216
+ err = runtime.cudaEventQuery(self.end)
217
+ if err[0] == runtime.cudaError_t.cudaSuccess:
225
218
  return True
226
219
  else:
227
220
  return False
@@ -229,7 +222,7 @@ class CudaFunctions(GPUBackend):
229
222
  @staticmethod
230
223
  def synchronize():
231
224
  """Halts execution until device has finished its tasks."""
232
- err = cudart.cudaDeviceSynchronize()
225
+ err = runtime.cudaDeviceSynchronize()
233
226
  cuda_error_check(err)
234
227
 
235
228
  def copy_constant_memory_args(self, cmem_args):
@@ -243,9 +236,9 @@ class CudaFunctions(GPUBackend):
243
236
  :type cmem_args: dict( string: numpy.ndarray, ... )
244
237
  """
245
238
  for k, v in cmem_args.items():
246
- err, symbol, _ = cuda.cuModuleGetGlobal(self.current_module, str.encode(k))
239
+ err, symbol, _ = driver.cuModuleGetGlobal(self.current_module, str.encode(k))
247
240
  cuda_error_check(err)
248
- err = cuda.cuMemcpyHtoD(symbol, v, v.nbytes)
241
+ err = driver.cuMemcpyHtoD(symbol, v, v.nbytes)
249
242
  cuda_error_check(err)
250
243
 
251
244
  def copy_shared_memory_args(self, smem_args):
@@ -284,12 +277,12 @@ class CudaFunctions(GPUBackend):
284
277
  stream = self.stream
285
278
  arg_types = list()
286
279
  for arg in gpu_args:
287
- if isinstance(arg, cuda.CUdeviceptr):
280
+ if isinstance(arg, driver.CUdeviceptr):
288
281
  arg_types.append(None)
289
282
  else:
290
283
  arg_types.append(np.ctypeslib.as_ctypes_type(arg.dtype))
291
284
  kernel_args = (tuple(gpu_args), tuple(arg_types))
292
- err = cuda.cuLaunchKernel(
285
+ err = driver.cuLaunchKernel(
293
286
  func,
294
287
  grid[0],
295
288
  grid[1],
@@ -318,7 +311,7 @@ class CudaFunctions(GPUBackend):
318
311
  :type size: int
319
312
 
320
313
  """
321
- err = cudart.cudaMemset(allocation, value, size)
314
+ err = runtime.cudaMemset(allocation, value, size)
322
315
  cuda_error_check(err)
323
316
 
324
317
  @staticmethod
@@ -331,7 +324,7 @@ class CudaFunctions(GPUBackend):
331
324
  :param src: A GPU memory allocation unit
332
325
  :type src: cuda.CUdeviceptr
333
326
  """
334
- err = cuda.cuMemcpyDtoH(dest, src, dest.nbytes)
327
+ err = driver.cuMemcpyDtoH(dest, src, dest.nbytes)
335
328
  cuda_error_check(err)
336
329
 
337
330
  @staticmethod
@@ -344,7 +337,7 @@ class CudaFunctions(GPUBackend):
344
337
  :param src: A numpy array in host memory to store the data
345
338
  :type src: numpy.ndarray
346
339
  """
347
- err = cuda.cuMemcpyHtoD(dest, src, src.nbytes)
340
+ err = driver.cuMemcpyHtoD(dest, src, src.nbytes)
348
341
  cuda_error_check(err)
349
342
 
350
343
  units = {"time": "ms"}
@@ -1,6 +1,7 @@
1
1
  import numpy as np
2
2
 
3
3
  from kernel_tuner.observers.observer import BenchmarkObserver
4
+ from kernel_tuner.backends.hip.util import hip_check
4
5
 
5
6
  try:
6
7
  from hip import hip, hiprtc
@@ -24,7 +25,7 @@ class HipRuntimeObserver(BenchmarkObserver):
24
25
 
25
26
  def after_finish(self):
26
27
  # Time is measured in milliseconds
27
- EventElapsedTime = hip.hipEventElapsedTime(self.start, self.end)
28
+ EventElapsedTime = hip_check(hip.hipEventElapsedTime(self.start, self.end))
28
29
  self.times.append(EventElapsedTime)
29
30
 
30
31
  def get_results(self):
@@ -1,12 +1,16 @@
1
1
  import numpy as np
2
2
 
3
3
  try:
4
- from cuda import cudart
4
+ from cuda.bindings import runtime
5
5
  except ImportError:
6
- cuda = None
6
+ try:
7
+ # backward compatibility hack for older cuda-python versions
8
+ from cuda import cudart as runtime
9
+ except ImportError:
10
+ cuda = None
7
11
 
8
12
  from kernel_tuner.observers.observer import BenchmarkObserver
9
- from kernel_tuner.util import cuda_error_check
13
+ from kernel_tuner.utils.nvcuda import cuda_error_check
10
14
 
11
15
 
12
16
  class CudaRuntimeObserver(BenchmarkObserver):
@@ -21,7 +25,7 @@ class CudaRuntimeObserver(BenchmarkObserver):
21
25
 
22
26
  def after_finish(self):
23
27
  # Time is measured in milliseconds
24
- err, time = cudart.cudaEventElapsedTime(self.start, self.end)
28
+ err, time = runtime.cudaEventElapsedTime(self.start, self.end)
25
29
  cuda_error_check(err)
26
30
  self.times.append(time)
27
31
 
@@ -7,6 +7,7 @@ from warnings import warn
7
7
  from kernel_tuner import util
8
8
  from kernel_tuner.runners.runner import Runner
9
9
 
10
+
10
11
  _SimulationDevice = namedtuple("_SimulationDevice", ["max_threads", "env", "quiet"])
11
12
 
12
13
 
@@ -91,6 +92,11 @@ class SimulationRunner(Runner):
91
92
  if tuning_options.cache and x_int in tuning_options.cache:
92
93
  result = tuning_options.cache[x_int].copy()
93
94
 
95
+ # only compute metrics on configs that have not errored
96
+ if tuning_options.metrics and not isinstance(result.get(tuning_options.objective), util.ErrorConfig):
97
+ result = util.process_metrics(result, tuning_options.metrics)
98
+
99
+
94
100
  # Simulate behavior of sequential runner that when a configuration is
95
101
  # served from the cache by the sequential runner, the compile_time,
96
102
  # verification_time, and benchmark_time are set to 0.