-
Notifications
You must be signed in to change notification settings - Fork 83
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #256 from ksimpson-work/add_system
Add the cuda.core.experimental.system singleton
- Loading branch information
Showing
8 changed files
with
151 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. | ||
# | ||
# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE | ||
|
||
from typing import Tuple | ||
|
||
from cuda import cuda, cudart | ||
from cuda.core.experimental._device import Device | ||
from cuda.core.experimental._utils import handle_return | ||
|
||
|
||
class System: | ||
"""Provide information about the cuda system. | ||
This class is a singleton and should not be instantiated directly. | ||
""" | ||
|
||
_instance = None | ||
|
||
def __new__(cls): | ||
if cls._instance is None: | ||
cls._instance = super().__new__(cls) | ||
return cls._instance | ||
|
||
def __init__(self): | ||
if hasattr(self, "_initialized") and self._initialized: | ||
return | ||
self._initialized = True | ||
|
||
@property | ||
def driver_version(self) -> Tuple[int, int]: | ||
""" | ||
Query the CUDA driver version. | ||
Returns | ||
------- | ||
tuple of int | ||
A 2-tuple of (major, minor) version numbers. | ||
""" | ||
version = handle_return(cuda.cuDriverGetVersion()) | ||
major = version // 1000 | ||
minor = (version % 1000) // 10 | ||
return (major, minor) | ||
|
||
@property | ||
def num_devices(self) -> int: | ||
""" | ||
Query the number of available GPUs. | ||
Returns | ||
------- | ||
int | ||
The number of available GPU devices. | ||
""" | ||
return handle_return(cudart.cudaGetDeviceCount()) | ||
|
||
@property | ||
def devices(self) -> tuple: | ||
""" | ||
Query the available device instances. | ||
Returns | ||
------- | ||
tuple of Device | ||
A tuple containing instances of available devices. | ||
""" | ||
total = self.num_devices | ||
return tuple(Device(device_id) for device_id in range(total)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,4 +7,5 @@ maxdepth: 3 | |
0.1.1 <release/0.1.1-notes> | ||
0.1.0 <release/0.1.0-notes> | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
try: | ||
from cuda.bindings import driver, runtime | ||
except ImportError: | ||
from cuda import cuda as driver | ||
from cuda import cudart as runtime | ||
|
||
from cuda.core.experimental import Device, system | ||
from cuda.core.experimental._utils import handle_return | ||
|
||
|
||
def test_system_singleton(): | ||
system1 = system | ||
system2 = system | ||
assert id(system1) == id(system2), "system is not a singleton" | ||
|
||
|
||
def test_driver_version(): | ||
driver_version = system.driver_version | ||
print(driver_version) | ||
version = handle_return(driver.cuDriverGetVersion()) | ||
expected_driver_version = (version // 1000, (version % 1000) // 10) | ||
assert driver_version == expected_driver_version, "Driver version does not match expected value" | ||
|
||
|
||
def test_num_devices(): | ||
num_devices = system.num_devices | ||
expected_num_devices = handle_return(runtime.cudaGetDeviceCount()) | ||
assert num_devices == expected_num_devices, "Number of devices does not match expected value" | ||
|
||
|
||
def test_devices(): | ||
devices = system.devices | ||
expected_num_devices = handle_return(runtime.cudaGetDeviceCount()) | ||
expected_devices = tuple(Device(device_id) for device_id in range(expected_num_devices)) | ||
assert len(devices) == len(expected_devices), "Number of devices does not match expected value" | ||
for device, expected_device in zip(devices, expected_devices): | ||
assert device.device_id == expected_device.device_id, "Device ID does not match expected value" |