This file describes the changes / additions / fixes between wrapper releases, tracked in a loose version of the keep a changelog format.
0.10.0 (released 2024-02-10)
Updates for NVML 12.2.
Device
- Methods
pcie_link_speed()
- Methods
DeviceArchitecture
- Variants
Ada
Hopper
- Variants
enums::device
PcieLinkMaxSpeed
- Renamed variants to reflect the fact that they appear to represent per-lane transfers/second, not multi-lane throughput
- Bumped MSRV to 1.60.0 for usage of namespaced features
- Bumped crate edition to
2021
- Removed
rust-hook
from development workflow - Started building crate in CI on
macos-latest
- Added a script to find unwrapped function names
- Vendored header files are now excluded from repo stats
The MSRV of this release is 1.60.0. This is for usage of namespaced features.
bitflags
:1.3
->2.4.0
libloading
:0.7.0
->0.8.1
wrapcenum-derive
:0.4.0
->0.4.1
0.9.0 (released 2023-01-20)
Bug fixes, improvements, and updates for NVML 11.8.
- Wrapper methods are now annotated with the
#[doc(alias = "...")]
attribute to make them searchable by C function name in rustdoc (#31 - @arpankapoor) - Some older function versions are now wrapped and available for use behind the
legacy-functions
crate featurerunning_compute_processes_v2
running_graphics_processes_v2
enum_wrappers::device
Brand
- Added new variants (#35 - @nemosupremo)
Device
running_compute_processes()
- Fixed count handling (#36 - @jjyyxx)
- This bug would have caused five blank process information structs to be returned in addition to actual process information if there were any running compute processes.
- Fixed count handling (#36 - @jjyyxx)
- SPDX expressions in
Cargo.toml
files have been updated to avoid using the now-deprecated slash syntax (#32 - @KisaragiEffective)
The MSRV of this release continues to be 1.51.0.
0.8.0 (released 2022-05-26)
Updates for the latest version of NVML (11.6 update 2). More wrapped methods!
Device
:- Methods:
set_mem_locked_clocks()
(#27 - @benrod3k)reset_mem_locked_clocks()
num_cores()
num_fans()
bus_type()
power_source()
architecture()
pcie_link_max_speed()
memory_bus_width()
irq_num
- Methods:
- The
NVML
struct has been renamed toNvml
(#22 - @TheJltres) - The
basic_usage
example now prints your device's architecture and number of CUDA cores - Some methods on
Nvml
have been renamed:Nvml::blacklist_device_count()
->Nvml::excluded_device_count()
Nvml::blacklist_device_info()
->Nvml::excluded_device_info()
- Some struct wrappers have been modified:
BlacklistDeviceInfo
renamed toExcludedDeviceInfo
ProcessInfo
gained new fields:gpu_instance_id
compute_instance_id
Device
:Device::name()
now creates a buffer sized to the newNVML_DEVICE_NAME_V2_BUFFER_SIZE
constantDevice::running_compute_processes()
andDevice::running_graphics_processes()
now allocate a bit of headroom in case the process count increases between when they make a call to figure out how much to allocate and when they make a call to get dataDevice::set_gpu_locked_clocks()
now takes inGpuLockedClocksSetting
allowing for both numeric ranges and symbolic boundaries
The MSRV of this release is 1.51.0. This is needed for const generics and the ability to implement Debug
for arrays of any size.
libloading
:0.6.6
->0.7.0
- Re-organized repo using a workspace
- Tests that can't be run on my machine are now ignored with the
#[ignore]
attribute. Thetest-local
feature has been removed as a result - The
Cargo.lock
file is now committed to the repo
0.7.0 (released 2020-12-06)
Dynamically loading the NVML library at runtime is here! Thanks to a new bindgen feature that landed recently, nvml-wrapper-sys
now has regenerated bindings that make use of the libloading
crate and don't require linking to NVML at compile-time.
This means it's now possible to drop NVIDIA-related features in your code at runtime on systems that don't have relevant hardware.
The MSRV of this release is 1.42.0.
NVML
struct:- Added methods:
builder
- Added methods:
NvmlBuilder
struct- A builder struct that provides further flexibility in how NVML is initialized
bitmasks
- Added events:
POWER_SOURCE_CHANGE
MIG_CONFIG_CHANGE
- Added init flags:
NO_ATTACH
- Added events:
Device
struct:- Added methods:
new
(replaces theFrom<nvmlDevice_t>
impl)nvml
- Added methods:
EventSet
struct:- Added methods:
new
(replaces theFrom<nvmlEventSet_t>
impl)
- Added methods:
EventData
struct:- Added methods:
new
(replaces theFrom<nvmlEventData_t>
impl)
- Added methods:
Unit
struct:- Added methods:
new
(replaces theFrom<nvmlUnit_t>
impl)nvml
- Added methods:
NvmlError
- Added variants:
LibloadingError
FailedToLoadSymbol
- Added variants:
InitFlags
now implementsDefault
NvmlError
andNvmlErrorWithSource
no longer implementClone
,Eq
, orPartialEq
- They can no longer implement these traits because
libloading::Error
doesn't implement them - As a result of this change,
FieldValueSample
no longer implementsClone
orPartialEq
- They can no longer implement these traits because
NvmlError::UnexpectedVariant
now contains au32
instead of ani32
due to a change in the types of the generated bindings
libloading
: new dependency on0.6.6
static_assertions
: new dependency on1.1.x
0.6.0 (released 2020-06-15)
This release was focused on cleanup and migrating a crate originally written in 2016 to modern Rust conventions. Notably, error-chain
has been ripped out of the crate entirely and replaced with an error enum that implements std::error::Error
.
Additionally, the wrapcenum-derive
dependency (a derive macro used to simplify API generation internally) has been completely re-written and now depends on the 1.0
releases of syn
and quote
. There are no user-facing changes as a result of this rewrite, but your crate's dependency tree will likely be very pleased.
The MSRV of this release is 1.42.0.
nvml-wrapper
updated to Rust 2018 editionnvml-wrapper-sys
updated to Rust 2018 editionwrapcenum-derive
has been re-written and now depends on modern versions ofsyn
andquote
- Removed
#[inline]
attribute from all functions - Merged methods to get raw handles from structs into a single method
Device.handle()
,EventSet.handle()
,Unit.handle()
- Ripped
error-chain
out of crate entirely- Replaced with
NvmlError
enum that implementsstd::error::Error
- Replaced with
- Migrated most
try_from()
methods to implementations ofstd::convert::TryFrom
- Migrated all
try_into_c()
methods to implementations ofstd::convert::TryInto
- Modernized some of the example code
bitflags
:1.0.x -> 1.2.x
thiserror
: new dependency on1.0.x
error-chain
: no longer a dependency
0.5.0 (released 2019-09-10)
A long time in the works, 0.5.0 contains the last two years of my extremely sporadic work wrapping some of the new functionality provided in NVML since version 8 alongside a handful of small fixes and improvements.
- An import library (
nvml.lib
) has been added that enables compilation using the MSVC toolchain on Windows. - The
basic_usage
example now prints the system's CUDA driver version. bitmasks
- Added throttle reasons:
SW_THERMAL_SLOWDOWN
HW_THERMAL_SLOWDOWN
HW_POWER_BRAKE_SLOWDOWN
DISPLAY_CLOCK_SETTING
- Added
device::FbcFlags
- Added
InitFlags
- Added throttle reasons:
enums::device
SampleValue
- Added variant
I64(i64)
- The
from_tag_and_union
constructor has been updated to supporti64
values
- Added variant
enum_wrappers::device
MemoryLocation
- Added variants:
Cbu
SRAM
- Added variants:
TemperatureThreshold
- Added variants:
MemoryMax
GpuMax
- Added variants:
PerformancePolicy
- Added variants:
BoardLimit
LowUtilization
Reliability
TotalAppClocks
TotalBaseClocks
- Added variants:
SampleValueType
- Added variant
SignedLongLong
- Added variant
Brand
- Added variant
Titan
- Added variant
- Added the
EncoderType
enum - Added the
DetachGpuState
enum - Added the
PcieLinkState
enum - Added the
FbcSessionType
enum
Device
struct:- Added methods:
cuda_compute_capability
encoder_capacity
encoder_stats
encoder_sessions
encoder_sessions_count
fbc_stats
fbc_sessions_info
fbc_session_count
process_utilization_stats
total_energy_consumption
field_values_for
set_gpu_locked_clocks
reset_gpu_locked_clocks
- Added methods:
error
- Added errors:
InsufficientMemory
VgpuEccNotSupported
- Added errors:
NVML
struct:- Added methods:
init_with_flags
sys_cuda_driver_version
blacklist_device_count
blacklist_device_info
- Added methods:
structs::device
- Added structs:
EncoderStats
CudaComputeCapability
FieldId
RetiredPage
- Added structs:
struct_wrappers
- Added struct:
BlacklistDeviceInfo
- Added struct:
struct_wrappers::device
- Added structs:
EncoderSessionInfo
ProcessUtilizationSample
FieldValueSample
FbcStats
FbcSessionInfo
- Added structs:
lib.rs
- Added functions:
cuda_driver_version_major
cuda_driver_version_minor
- Added functions:
bitmasks
ThrottleReasons::Unknown
was removed since its counterpart in the NVML library was removed
enum_wrappers::device
TopologyLevel
- The
Cpu
variant was replaced by theNode
variant
- The
- The
UnexpectedVariant
error value is now ani32
(previouslyu32
) - The
Device.remove()
method now takes additional parameters for more removal options - The
Device.fan_speed()
method now takes a fan index to allow reading the speed of different fans - The
Device.retired_pages()
method now returns the timestamps for each page's retirment along with their addresses - The
NVML.sys_cuda_driver_version()
method now errors if the CUDA shared library cannot be found
- Methods that allocate
i8
vectors to be passed as cstrings now do so via thevec!
macro rather than simply usingwith_capacity
, meaning the length of the vector gets set appropriately- This did not cause a memory leak because we were just working with primitive types that don't have
Drop
impls, but it's nice to have fixed regardless
- This did not cause a memory leak because we were just working with primitive types that don't have
error-chain
:0.11.x -> 0.12.x
0.4.1 (released 2019-04-08)
The version was bumped in order to update the readme with the new information on Linux compilation. See the sys
crates' changelog for details.
- Attempting to compile the library on macOS will now result in an informative error
0.4.0 (released 2017-09-28)
This is a small release that updates dependencies and makes a handful of changes for forward-compatibility purposes.
This release requires and supports Rust 1.20.0 or higher.
- CI has been set up
- All it can do is build the crate (no testing of any kind), but at least it's something.
EventData::try_from()
is replaced by aFrom<nvmlEventData_t>
impl as it can no longer error- This is because of the
from_bits_truncate()
usage described next
- This is because of the
- Methods that deal with bitmasks now use the
from_bits_truncate()
constructor instead offrom_bits()
- This allows the wrapper, which is using bindings for NVML 8, to still accept bitmasks from future versions of NVML (such as NVML 9) that may have additional flags
*_strict()
method counterparts are available for most such methods if you need them
- As a result of the
bitflags
update, flags are now associated constants- This means that, for instance,
nvml_wrapper::bitmasks::event::CLOCK_CHANGE
is nownvml_wrapper::bitmasks::event::EventTypes::CLOCK_CHANGE
- This means that, for instance,
- Imports were deglobbed in a number of places
- The
basic_usage
example now usespretty-bytes
instead ofnumber_prefix
to pretty-print bytes
bitflags
:0.9.x -> 1.0.x
error-chain
:0.10.x -> 0.11.x
0.3.0 (released 2017-07-20)
The major highlight of this release is the high_level::event_loop
module, an interface to NVML's event capabilities. Only available on Linux platforms, this module provides you with the boilerplate necessary to quickly and easily watch for events on any number of devices, handling both errors and the events themselves. See the event_loop
example in the examples folder at the root of the repository for more.
This release also marks the point at which no nightly features are required for any reason (meaning the removal of the nightly
feature flag) and the addition of a couple examples demonstrating use of the crate.
This release requires and supports Rust 1.19.0 or higher.
-
Examples:
basic_usage
event_loop
-
enums::event
:- New file with the following:
XidError
- New file with the following:
-
high_level
module- This module will be the home of any high-level abstractions over the NVML API.
high_level::event_loop
:- New file with the following:
Event
EventLoop
EventLoopState
EventLoopProvider
, implemented for:NVML
- New file with the following:
- The
nightly
feature flag has been removed as nightly features are no longer required (union
has been stabilized).
-
The
EventData.event_data
field is now anOption<XidError>
instead of au64
- This was done to more strongly represent the field's presence via the type system (it is
None
for most events) and also to statically type theUnknown
value.
- This was done to more strongly represent the field's presence via the type system (it is
-
The
UnexpectedVariant
error now contains the enum value that could not be mapped to an enum variant defined in the wrapper. -
The project is now formatted via rustfmt as much as possible.
-
Markdown headers now have two newlines after them, which is (to my knowledge) how they are supposed to be formatted.
0.2.0 (released 2017-06-08)
The major highlight of this release is the NvLink
struct, an interface to NVML's various NvLink-related functions. This release additionally corrects some issues / oversights in the wrapper and replaces Rust enum
s with numerical constants for FFI use (see rust-lang/rust#36927).
This release requires and supports Rust 1.18.0 or higher.
-
NvLink
struct added and fleshed out, wrapping all NvLink-related functions.The
NvLink
struct can be obtained from aDevice
viaDevice.link_wrapper_for()
. It provides a convenient interface to access the various NvLink-related functions with a commonlink
value.- Functions wrapped:
nvmlDeviceGetNvLinkState
nvmlDeviceGetNvLinkVersion
nvmlDeviceGetNvLinkCapability
nvmlDeviceGetNvLinkRemotePciInfo
nvmlDeviceGetNvLinkErrorCounter
nvmlDeviceResetNvLinkErrorCounters
nvmlDeviceSetNvLinkUtilizationControl
nvmlDeviceGetNvLinkUtilizationControl
nvmlDeviceGetNvLinkUtilizationCounter
nvmlDeviceFreezeNvLinkUtilizationCounter
nvmlDeviceResetNvLinkUtilizationCounter
- Tests written for all new functionality
- While I cannot personally run these, they are useful both for static analysis and for those who are able to run the tests.
- Functions wrapped:
-
Device
struct:Device.link_wrapper_for()
-
enums::nv_link
:- New file with the following:
Counter
- New file with the following:
-
struct_wrappers::nv_link
:- New file with the following:
UtilizationControl
- New file with the following:
-
structs::nv_link
:- New file with the following:
UtilizationCounter
- New file with the following:
-
No-run tests were added for all methods that modify state. They are useful to statically verify whatever is statically verifiable.
InsufficientSize
error now contains anOption<usize>
instead of ausize
.- This allows for
None
to be returned rather than0
in the default case, andSome(size)
to be specified explicitly if possible.
- This allows for
PciInfo
'spci_sub_system_id
field is nowOption<u32>
instead ofu32
.- This change was made in order to accommodate
NvLink.remote_pci_info()
. NVIDIA says that the sub system ID is not set in that function call, and we represent that withNone
. - As a direct result of this change,
PciInfo::try_from()
now takes a boolean arg,sub_sys_id_present
, which is used to specify whether thepci_sub_system_id
field should beSome()
orNone
.
- This change was made in order to accommodate
-
Methods that should have taken
&mut self
now do so, including:Device.clear_cpu_affinity()
Device.reset_applications_clocks()
Device.clear_accounting_pids()
Device.clear_ecc_error_counts()
-
A method that should have taken
&self
now does:NVML.are_devices_on_same_board()
-
Numerical constants are now used in place of Rust
enum
s for safety reasons- For more info see rust-lang/rust#36927
- Many methods now return an
UnexpectedVariant
error where they did not previously
bitflags
:0.8.x -> 0.9.x
0.1.0 (released 2017-05-17)
Initial release wrapping the majority of the NVML API surface.
This release requires and supports Rust 1.17.0 or higher.