nvml-wrapper-sys
Generated bindings to the NVIDIA Management Library.
0.9.1
5.5M downloads/mo
#4335 most downloaded on crates.io
Cldfire/nvml-wrapper
What this package is like to depend on
Last release 4 months ago
30 Mar 2026
Ships fairly regularly
a new release about every 9 months
Nearly every release is documented
notes for 13 of 13 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
13 releases · first in 2017
1 release in the last 12 months
see the full history below
Release timeline
13 releases · May 2017 to Mar 2026Releases
latest 13-
0.9.130 Mar 2026Release notes
Open source →Fixed
- Corrected
NVML_FI_*field IDs 251-273 to match v12 numbering (#137)
- Corrected
-
0.9.028 May 2025Release notes
Open source →-
Release 0.9.0
And 0.7.0 ofnvml-wrapper-sys -
Downgrade
indexmap
In order to downgradehashbrownto avoid requiring Rust 2021 edition
Release notes
Open source →Release Summary
Bug fixes, improvements, and updates for NVML 11.8.
Added
- 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-functionscrate featurerunning_compute_processes_v2running_graphics_processes_v2
Changed
enum_wrappers::deviceBrand- Added new variants (#35 - @nemosupremo)
Fixed
Devicerunning_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)
Internal
- SPDX expressions in
Cargo.tomlfiles have been updated to avoid using the now-deprecated slash syntax (#32 - @KisaragiEffective)
Rust Version Support
The MSRV of this release continues to be 1.51.0.
Release notes
Open source →Bindings have been regenerated using the NVML 12.8.90 header and bindgen 0.68.1.
-
-
0.8.010 Feb 2024Release notes
Open source →Release Summary
Updates for the latest version of NVML (11.6 update 2). More wrapped methods!
Added
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:
Changed
- The
NVMLstruct has been renamed toNvml(#22 - @TheJltres) - The
basic_usageexample now prints your device's architecture and number of CUDA cores - Some methods on
Nvmlhave been renamed:Nvml::blacklist_device_count()->Nvml::excluded_device_count()Nvml::blacklist_device_info()->Nvml::excluded_device_info()
- Some struct wrappers have been modified:
BlacklistDeviceInforenamed toExcludedDeviceInfoProcessInfogained new fields:gpu_instance_idcompute_instance_id
Device:Device::name()now creates a buffer sized to the newNVML_DEVICE_NAME_V2_BUFFER_SIZEconstantDevice::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 inGpuLockedClocksSettingallowing for both numeric ranges and symbolic boundaries
Rust Version Support
The MSRV of this release is 1.51.0. This is needed for const generics and the ability to implement
Debugfor arrays of any size.Dependencies
libloading:0.6.6->0.7.0
Internal
- Re-organized repo using a workspace
- Tests that can't be run on my machine are now ignored with the
#[ignore]attribute. Thetest-localfeature has been removed as a result - The
Cargo.lockfile is now committed to the repo
Release notes
Open source →Bindings have been regenerated using the NVML 12.2 header and bindgen 0.68.1.
Internal
- Bumped crate edition to
2021
Rust Version Support
The MSRV of this release is 1.60.0 (to match the wrapper crate).
-
0.7.021 Jan 2023Release notes
Open source →Release Summary
Dynamically loading the NVML library at runtime is here! Thanks to a new bindgen feature that landed recently,
nvml-wrapper-sysnow has regenerated bindings that make use of thelibloadingcrate 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.
Rust Version Support
The MSRV of this release is 1.42.0.
Added
NVMLstruct:- Added methods:
builder
- Added methods:
NvmlBuilderstruct- A builder struct that provides further flexibility in how NVML is initialized
bitmasks- Added events:
POWER_SOURCE_CHANGEMIG_CONFIG_CHANGE
- Added init flags:
NO_ATTACH
- Added events:
Devicestruct:- Added methods:
new(replaces theFrom<nvmlDevice_t>impl)nvml
- Added methods:
EventSetstruct:- Added methods:
new(replaces theFrom<nvmlEventSet_t>impl)
- Added methods:
EventDatastruct:- Added methods:
new(replaces theFrom<nvmlEventData_t>impl)
- Added methods:
Unitstruct:- Added methods:
new(replaces theFrom<nvmlUnit_t>impl)nvml
- Added methods:
NvmlError- Added variants:
LibloadingErrorFailedToLoadSymbol
- Added variants:
Changed
InitFlagsnow implementsDefaultNvmlErrorandNvmlErrorWithSourceno longer implementClone,Eq, orPartialEq- They can no longer implement these traits because
libloading::Errordoesn't implement them - As a result of this change,
FieldValueSampleno longer implementsCloneorPartialEq
- They can no longer implement these traits because
NvmlError::UnexpectedVariantnow contains au32instead of ani32due to a change in the types of the generated bindings
Dependencies
libloading: new dependency on0.6.6static_assertions: new dependency on1.1.x
Release notes
Open source →Bindings have been regenerated using the NVML 11.8 header and bindgen 0.63.0.
Added
- The
legacy-functionsfeature can now be enabled to access older function versions in the bindings.
Rust Version Support
The MSRV of this release continues to be 1.51.0.
-
0.6.027 May 2022Release notes
Open source →Release Summary
This release was focused on cleanup and migrating a crate originally written in 2016 to modern Rust conventions. Notably,
error-chainhas been ripped out of the crate entirely and replaced with an error enum that implementsstd::error::Error.Additionally, the
wrapcenum-derivedependency (a derive macro used to simplify API generation internally) has been completely re-written and now depends on the1.0releases ofsynandquote. There are no user-facing changes as a result of this rewrite, but your crate's dependency tree will likely be very pleased.Rust Version Support
The MSRV of this release is 1.42.0.
Changes
nvml-wrapperupdated to Rust 2018 editionnvml-wrapper-sysupdated to Rust 2018 editionwrapcenum-derivehas been re-written and now depends on modern versions ofsynandquote- 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-chainout of crate entirely- Replaced with
NvmlErrorenum 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
Dependencies
bitflags:1.0.x -> 1.2.xthiserror: new dependency on1.0.xerror-chain: no longer a dependency
Release notes
Open source →Release Summary
Bindings have been regenerated using the NVML 11.6 update 2 header and bindgen 0.59.2.
Internal
- The generated layout tests have been removed from the bindings (see https://github.com/rust-lang/rust-bindgen/issues/1651 for rationale)
-
0.5.007 Dec 2020Release notes
Open source →Release Summary
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.
Additions
- An import library (
nvml.lib) has been added that enables compilation using the MSVC toolchain on Windows. - The
basic_usageexample now prints the system's CUDA driver version. bitmasks- Added throttle reasons:
SW_THERMAL_SLOWDOWNHW_THERMAL_SLOWDOWNHW_POWER_BRAKE_SLOWDOWNDISPLAY_CLOCK_SETTING
- Added
device::FbcFlags - Added
InitFlags
- Added throttle reasons:
enums::deviceSampleValue- Added variant
I64(i64) - The
from_tag_and_unionconstructor has been updated to supporti64values
- Added variant
enum_wrappers::deviceMemoryLocation- Added variants:
CbuSRAM
- Added variants:
TemperatureThreshold- Added variants:
MemoryMaxGpuMax
- Added variants:
PerformancePolicy- Added variants:
BoardLimitLowUtilizationReliabilityTotalAppClocksTotalBaseClocks
- Added variants:
SampleValueType- Added variant
SignedLongLong
- Added variant
Brand- Added variant
Titan
- Added variant
- Added the
EncoderTypeenum - Added the
DetachGpuStateenum - Added the
PcieLinkStateenum - Added the
FbcSessionTypeenum
Devicestruct:- Added methods:
cuda_compute_capabilityencoder_capacityencoder_statsencoder_sessionsencoder_sessions_countfbc_statsfbc_sessions_infofbc_session_countprocess_utilization_statstotal_energy_consumptionfield_values_forset_gpu_locked_clocksreset_gpu_locked_clocks
- Added methods:
error- Added errors:
InsufficientMemoryVgpuEccNotSupported
- Added errors:
NVMLstruct:- Added methods:
init_with_flagssys_cuda_driver_versionblacklist_device_countblacklist_device_info
- Added methods:
structs::device- Added structs:
EncoderStatsCudaComputeCapabilityFieldIdRetiredPage
- Added structs:
struct_wrappers- Added struct:
BlacklistDeviceInfo
- Added struct:
struct_wrappers::device- Added structs:
EncoderSessionInfoProcessUtilizationSampleFieldValueSampleFbcStatsFbcSessionInfo
- Added structs:
lib.rs- Added functions:
cuda_driver_version_majorcuda_driver_version_minor
- Added functions:
Removals
bitmasksThrottleReasons::Unknownwas removed since its counterpart in the NVML library was removed
Changes
enum_wrappers::deviceTopologyLevel- The
Cpuvariant was replaced by theNodevariant
- The
- The
UnexpectedVarianterror 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
Fixes
- Methods that allocate
i8vectors 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
Dropimpls, 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
Dependencies
error-chain:0.11.x -> 0.12.x
Release notes
Open source →Release Summary
The NVML bindings have been regenerated using the new dynamic loading bindgen feature and for NVML 11. This means that this crate no longer needs to link to the NVML library at buildtime.
These bindings form a thin wrapper over the
libloadingcrate.Removed
- The
nvml.libimport library has been removed from the crate as it is no longer needed now that NVML is loaded dynamically at runtime on Windows
Dependencies
libloading: new dependency on0.6.6
- An import library (
-
0.4.216 Jun 2020 -
0.4.112 Sep 2019Release notes
Open source →Release Summary
The version was bumped in order to update the readme with the new information on Linux compilation. See the
syscrates' changelog for details.Fixes
- Attempting to compile the library on macOS will now result in an informative error
Release notes
Open source →Release Summary
The Windows import library has been regenerated for NVML 10.1.
-
0.4.011 Sep 2019Release notes
Open source →Release Summary
This is a small release that updates dependencies and makes a handful of changes for forward-compatibility purposes.
Rust Version Support
This release requires and supports Rust 1.20.0 or higher.
Additions
- CI has been set up
- All it can do is build the crate (no testing of any kind), but at least it's something.
Changes
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
bitflagsupdate, flags are now associated constants- This means that, for instance,
nvml_wrapper::bitmasks::event::CLOCK_CHANGEis nownvml_wrapper::bitmasks::event::EventTypes::CLOCK_CHANGE
- This means that, for instance,
- Imports were deglobbed in a number of places
- The
basic_usageexample now usespretty-bytesinstead ofnumber_prefixto pretty-print bytes
Dependencies
bitflags:0.9.x -> 1.0.xerror-chain:0.10.x -> 0.11.x
Release notes
Open source →Release Summary
Bindings have been regenerated using the NVML 10.1 header and bindgen 0.50.0.
- CI has been set up
-
0.3.109 Apr 2019Release notes
Open source →Release Summary
Improvements were made to the build script:
- An attempt will be made to locate the directory containing
libnvidia-ml.soand it will be automatically added to the locations that the library is being searched for in. Thanks @SunDoge! - The script will now display a helpful error message if compilation is attempted on macOS.
- An attempt will be made to locate the directory containing
-
0.3.020 Jul 2017Release notes
Open source →Release Summary
The major highlight of this release is the
high_level::event_loopmodule, 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 theevent_loopexample 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
nightlyfeature flag) and the addition of a couple examples demonstrating use of the crate.Rust Version Support
This release requires and supports Rust 1.19.0 or higher.
Additions
-
Examples:
basic_usageevent_loop
-
enums::event:- New file with the following:
XidError
- New file with the following:
-
high_levelmodule- This module will be the home of any high-level abstractions over the NVML API.
high_level::event_loop:- New file with the following:
EventEventLoopEventLoopStateEventLoopProvider, implemented for:NVML
- New file with the following:
Removals
- The
nightlyfeature flag has been removed as nightly features are no longer required (unionhas been stabilized).
Changes
-
The
EventData.event_datafield is now anOption<XidError>instead of au64- This was done to more strongly represent the field's presence via the type system (it is
Nonefor most events) and also to statically type theUnknownvalue.
- This was done to more strongly represent the field's presence via the type system (it is
-
The
UnexpectedVarianterror 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.
Release notes
Open source →Release Summary
The
nightlyfeature flag has been removed as unions are now available on stable Rust.Rust Version Support
This release requires and supports Rust 1.19.0 or higher.
-
-
0.2.008 Jun 2017Release notes
Open source →Release Summary
The major highlight of this release is the
NvLinkstruct, an interface to NVML's various NvLink-related functions. This release additionally corrects some issues / oversights in the wrapper and replaces Rustenums with numerical constants for FFI use (see rust-lang/rust#36927).Rust Version Support
This release requires and supports Rust 1.18.0 or higher.
Additions
-
NvLinkstruct added and fleshed out, wrapping all NvLink-related functions.The
NvLinkstruct can be obtained from aDeviceviaDevice.link_wrapper_for(). It provides a convenient interface to access the various NvLink-related functions with a commonlinkvalue.- Functions wrapped:
nvmlDeviceGetNvLinkStatenvmlDeviceGetNvLinkVersionnvmlDeviceGetNvLinkCapabilitynvmlDeviceGetNvLinkRemotePciInfonvmlDeviceGetNvLinkErrorCounternvmlDeviceResetNvLinkErrorCountersnvmlDeviceSetNvLinkUtilizationControlnvmlDeviceGetNvLinkUtilizationControlnvmlDeviceGetNvLinkUtilizationCounternvmlDeviceFreezeNvLinkUtilizationCounternvmlDeviceResetNvLinkUtilizationCounter
- 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:
-
Devicestruct: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.
Changes
InsufficientSizeerror now contains anOption<usize>instead of ausize.- This allows for
Noneto be returned rather than0in the default case, andSome(size)to be specified explicitly if possible.
- This allows for
PciInfo'spci_sub_system_idfield 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_idfield should beSome()orNone.
- This change was made in order to accommodate
Fixes
-
Methods that should have taken
&mut selfnow 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
&selfnow does:NVML.are_devices_on_same_board()
-
Numerical constants are now used in place of Rust
enums for safety reasons- For more info see rust-lang/rust#36927
- Many methods now return an
UnexpectedVarianterror where they did not previously
Dependencies
bitflags:0.8.x -> 0.9.x
Release notes
Open source →Release Summary
Rust
enums were removed in favor of numerical constants for C enums. This was done for safety reasons; see rust-lang/rust#36927 for more information.Changes
- Rust
enums replaced with numerical constants - Replaced
::std::os::raw::xpaths withraw::xpaths for readability - Removed
CopyandClonefrom structs where they did not make sense- Forgot about this before
-
-
0.1.017 May 2017Release notes
Open source →Release Summary
Initial release wrapping the majority of the NVML API surface.
Rust Version Support
This release requires and supports Rust 1.17.0 or higher.
Release notes
Open source →Release Summary
Initial release providing bindings for the entirety of the NVML API as well as nightly-only feature usage behind a feature flag.