66#include " cuda_loader.h"
77
88
9- const char * get_cuda_error (const DriverApi* driver, CUresult res) {
9+ const char * get_cuda_error (CUresult res) {
1010 const char * str = nullptr ;
11- driver-> cuGetErrorString (res, &str);
11+ g_cuGetErrorString (res, &str);
1212 return str ? str : " Unknown error" ;
1313}
1414
15- Status check_driver_version ( const DriverApi* driver, int minimum_version ) {
16- int version ;
17- CUresult res = driver-> cuDriverGetVersion (&version );
15+ void try_init_cuda ( ) {
16+ ErrorGuard guard ;
17+ CUresult res = g_cuInit ( 0 );
1818 if (res != CUDA_SUCCESS) {
19- PyErr_Format (PyExc_RuntimeError, " cuDriverGetVersion: %s" , get_cuda_error (driver, res));
20- return ErrorRaised;
21- }
22- if (version < minimum_version) {
23- int major = version / 1000 ;
24- int minor = (version % 1000 ) / 10 ;
25- int required_major = minimum_version / 1000 ;
26- PyErr_Format (PyExc_RuntimeError,
27- " Minimum driver version required is %d.0, got %d.%d" ,
28- required_major, major, minor);
29- return ErrorRaised;
19+ raise (PyExc_RuntimeError, " cuInit: %s" , get_cuda_error (res));
20+ SavedException exc = save_raised_exception ();
21+ LOG_PYTHON_ERROR (" warning" , exc, " Failed to initialized CUDA" );
3022 }
31- return OK;
3223}
3324
3425PyObject* get_max_grid_size (PyObject *self, PyObject *args) {
3526 int device_id;
3627 if (!PyArg_ParseTuple (args, " i" , &device_id))
3728 return NULL ;
3829
39- Result<const DriverApi*> driver = get_driver_api ();
40- if (!driver.is_ok ()) return NULL ;
41-
4230 CUdevice dev;
43- CUresult res = (*driver)-> cuDeviceGet (&dev, device_id);
31+ CUresult res = g_cuDeviceGet (&dev, device_id);
4432 if (res != CUDA_SUCCESS)
45- return PyErr_Format (PyExc_RuntimeError, " cuDeviceGet: %s" , get_cuda_error (*driver, res));
33+ return PyErr_Format (PyExc_RuntimeError, " cuDeviceGet: %s" , get_cuda_error (res));
4634
4735 int max_grid_size[3 ];
4836 for (int i = 0 ; i < 3 ; ++i) {
49- res = (*driver)-> cuDeviceGetAttribute (&max_grid_size[i],
37+ res = g_cuDeviceGetAttribute (&max_grid_size[i],
5038 static_cast <CUdevice_attribute>(CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X + i),
5139 dev);
5240 if (res != CUDA_SUCCESS) {
5341 return PyErr_Format (PyExc_RuntimeError,
54- " cuDeviceGetAttribute: %s" , get_cuda_error (*driver, res));
42+ " cuDeviceGetAttribute: %s" , get_cuda_error (res));
5543 }
5644 }
5745 return Py_BuildValue (" (iii)" , max_grid_size[0 ], max_grid_size[1 ], max_grid_size[2 ]);
@@ -60,36 +48,26 @@ PyObject* get_max_grid_size(PyObject *self, PyObject *args) {
6048PyObject* get_compute_capability (PyObject *self, PyObject *Py_UNUSED (ignored)) {
6149 int major, minor;
6250 CUdevice dev;
63-
64- Result<const DriverApi*> driver_result = get_driver_api ();
65- if (!driver_result.is_ok ()) return NULL ;
66- const DriverApi* d = *driver_result;
67-
68- CUresult res = d->cuDeviceGet (&dev, 0 );
51+ CUresult res = g_cuDeviceGet (&dev, 0 );
6952 if (res != CUDA_SUCCESS) {
70- return PyErr_Format (PyExc_RuntimeError, " cuDeviceGet: %s" , get_cuda_error (d, res));
53+ return PyErr_Format (PyExc_RuntimeError, " cuDeviceGet: %s" , get_cuda_error (res));
7154 }
72- res = d-> cuDeviceGetAttribute (&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
55+ res = g_cuDeviceGetAttribute (&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
7356 if (res != CUDA_SUCCESS) {
74- return PyErr_Format (PyExc_RuntimeError, " cuDeviceGetAttribute: %s" , get_cuda_error (d, res));
57+ return PyErr_Format (PyExc_RuntimeError, " cuDeviceGetAttribute: %s" , get_cuda_error (res));
7558 }
76- res = d-> cuDeviceGetAttribute (&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
59+ res = g_cuDeviceGetAttribute (&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
7760 if (res != CUDA_SUCCESS) {
78- return PyErr_Format (PyExc_RuntimeError, " cuDeviceGetAttribute: %s" , get_cuda_error (d, res));
61+ return PyErr_Format (PyExc_RuntimeError, " cuDeviceGetAttribute: %s" , get_cuda_error (res));
7962 }
8063 return Py_BuildValue (" (ii)" , major, minor);
8164}
8265
8366PyObject* get_driver_version (PyObject *self, PyObject *Py_UNUSED (ignored)) {
8467 int major, minor;
85-
86- Result<const DriverApi*> driver_result = get_driver_api ();
87- if (!driver_result.is_ok ()) return NULL ;
88- const DriverApi* d = *driver_result;
89-
90- CUresult res = d->cuDriverGetVersion (&major);
68+ CUresult res = g_cuDriverGetVersion (&major);
9169 if (res != CUDA_SUCCESS) {
92- return PyErr_Format (PyExc_RuntimeError, " cuDriverGetVersion: %s" , get_cuda_error (d, res));
70+ return PyErr_Format (PyExc_RuntimeError, " cuDriverGetVersion: %s" , get_cuda_error (res));
9371 }
9472 minor = (major % 1000 ) / 10 ;
9573 major = major / 1000 ;
0 commit comments