Repository navigation
Releases: nvpro-samples/vk_oidn
Release list
vk_oidn 0.2.0
Full Changelog: v0.1.3...v0.2.0
vk_oidn 0.1.3
vk_oidn 0.1.3 is 1.2–1.34x faster than 0.1.2. The results are bit-identical and the API is unchanged.
Performance
GPU time on an NVIDIA RTX PRO 4500 Blackwell, HDR color with albedo and normal:
| Resolution | Quality | 0.1.2 | 0.1.3 | Speedup | OIDN 2.5.1 CUDA |
|---|---|---|---|---|---|
| 1920x1080 | high | 6.72 ms | 5.01 ms | 1.34x | 8.10 ms |
| 1920x1080 | fast | 3.65 ms | 2.89 ms | 1.26x | 5.55 ms |
| 3840x2160 | high | 27.83 ms | 22.77 ms | 1.22x | 34.65 ms |
| 3840x2160 | fast | 14.63 ms | 12.55 ms | 1.17x | 23.41 ms |
vk_oidn is now 1.5–1.9x faster than Open Image Denoise's CUDA backend on this GPU.
Changes
- Convolution weights staged in shared memory. In the main and the sub-pixel (upsampling) convolution kernels, each workgroup loads the weights of a chunk once into shared memory with coalesced loads. Before, each subgroup loaded them from global memory, and diagnostic builds showed that these loads were the main cost of the kernels.
- The outputs are bit-identical to 0.1.2: all 11 validation configurations, with buffers and with image views, compare byte for byte.
- Simpler tile selection: 32x8-pixel tiles for every layer. The 48-pixel tiles no longer fit in shared memory with the staged weights, and they were slower.
- New environment variables for tuning and kernel development:
VK_OIDN_CONV_VARIANT=mx2_nf1forces the number of output blocks per workgroup.VK_OIDN_KERNEL_DIR=<dir>loads<dir>/<kernel>.spvinstead of the embedded kernel.
- New tools:
tools/update_weights.pyupdates the packed weights from a commit of RenderKit/oidn-weights.tests/microbenchmeasures the tensor core peak (FP16 ~200 TFLOPS, FP8 ~395 on this GPU) and contains an experiment with cooperative vectors. That experiment was not faster for the convolutions.
- Documentation: the analysis, the attempts that did not help, and the per-layer times are in docs/validation_and_performance.md.
Packages
| Package | Contents |
|---|---|
vk_oidn-0.1.3-windows-x64.zip |
vk_oidn.lib (Release) and vk_oidnd.lib (Debug, with embedded debug information). Built with Visual Studio 2022 and the /MD runtime; usable with Visual Studio 2022 and newer. |
vk_oidn-0.1.3-linux-x64.tar.gz |
libvk_oidn.a (Release, position-independent code). Built with GCC 13 on Ubuntu 24.04. |
The SHA-256 checksums are in SHA256SUMS.txt. To upgrade, change the version and the checksum in your FetchContent_Declare (see the 0.1.1 notes).
vk_oidn 0.1.2
Maintenance release of the SDK packages. The library and API are unchanged since 0.1.0; 0.1.1 describes the packages and how to use them.
Changes
- Windows Debug library is self-contained:
vk_oidnd.libnow embeds its debug information (/Z7) instead of referring to avk_oidnd.pdbthat was not in the package.- Applications built in Debug no longer get
LNK4099warnings. - The debugger can step into vk_oidn. Point Visual Studio to the sources of this tag when it asks for them.
- Applications built in Debug no longer get
- Documentation: performance results on an NVIDIA RTX 3500 Ada laptop GPU, in
docs/validation_and_performance.md.
Packages
| Package | Contents |
|---|---|
vk_oidn-0.1.2-windows-x64.zip |
vk_oidn.lib (Release) and vk_oidnd.lib (Debug, embedded debug information). Built with Visual Studio 2022 and the /MD runtime; usable with Visual Studio 2022 and newer. |
vk_oidn-0.1.2-linux-x64.tar.gz |
libvk_oidn.a (Release, position-independent code). Built with GCC 13 on Ubuntu 24.04. |
The SHA-256 checksums are in SHA256SUMS.txt. To use these packages instead of 0.1.1, change the version (and the checksums) in your FetchContent_Declare.
vk_oidn 0.1.1
This is the first vk_oidn release with prebuilt SDK packages, so you can use vk_oidn without building it. The library and API are unchanged since 0.1.0, and the 0.1.0 notes describe the denoiser, its performance and its validation.
SDK packages
Each package contains:
- the header
- static libraries with the compiled Slang kernels and the network weights
- the CMake package files, so
find_package(vk_oidn CONFIG)provides thevk_oidn::vk_oidntarget
Building against a package needs only the Vulkan headers: no Python, no slangc, and nothing to compile from vk_oidn.
| Package | Contents |
|---|---|
vk_oidn-0.1.1-windows-x64.zip |
vk_oidn.lib (Release) and vk_oidnd.lib (Debug). Built with Visual Studio 2022 and the /MD runtime; usable with Visual Studio 2022 and newer. |
vk_oidn-0.1.1-linux-x64.tar.gz |
libvk_oidn.a (Release, position-independent code). Built with GCC 13 on Ubuntu 24.04. |
Applications built as RelWithDebInfo or MinSizeRel link the Release library. The SHA-256 checksums of both packages are in SHA256SUMS.txt.
include(FetchContent)
if(WIN32)
set(VK_OIDN_PACKAGE vk_oidn-0.1.1-windows-x64.zip)
else()
set(VK_OIDN_PACKAGE vk_oidn-0.1.1-linux-x64.tar.gz)
endif()
FetchContent_Declare(vk_oidn_sdk
URL https://github.com/mklefrancois/vk_oidn/releases/download/v0.1.1/${VK_OIDN_PACKAGE}
URL_HASH SHA256=<from SHA256SUMS.txt>)
FetchContent_MakeAvailable(vk_oidn_sdk)
find_package(vk_oidn 0.1.1 EXACT CONFIG REQUIRED PATHS ${vk_oidn_sdk_SOURCE_DIR} NO_DEFAULT_PATH)
target_link_libraries(my_app PRIVATE vk_oidn::vk_oidn)You can still build from the sources: FetchContent with GIT_TAG v0.1.1 provides the same target. The oidn_denoiser sample of vk_mini_samples supports both ways through its VK_OIDN_FROM_SOURCE option.
Changes
- CMake install rules and a package configuration.
cmake --installnow creates the SDK package. VK_OIDN_VERSION_MAJOR,VK_OIDN_VERSION_MINORandVK_OIDN_VERSION_PATCHmacros invk_oidn.h. CMake checks that they match the project version.- CI builds the packages on every push and links a small test application against them (
tests/package). For version tags, CI attaches the packages to the release. - README: how to add vk_oidn to a project, using the packages or the sources.
vk_oidn 0.1.0
First release of vk_oidn: the Intel Open Image Denoise RT filter running on Vulkan. Your application records cmdDenoise() into its own command buffers, in the same style as DLSS. The library never submits work or waits on the host.
Highlights
- Kernels written in Slang. They use the tensor cores through
VK_KHR_cooperative_matrix, with a fallback kernel for other GPUs. - Each U-Net layer runs as a single fused kernel: convolution, bias, ReLU, pooling, upsampling and concatenation. Upsampling layers use a sub-pixel decomposition.
- Inputs and outputs can be buffers (device addresses) or storage image views.
- Supports HDR, LDR and sRGB input, with albedo and normal guides (noisy or clean), Fast, Balanced and High quality, and automatic exposure on the GPU. Large images are processed in tiles.
- 11 networks from Open Image Denoise 2.5 are embedded in the library.
Performance
GPU time on an NVIDIA RTX PRO 4500 Blackwell, HDR color with albedo and normal:
| Resolution | Quality | vk_oidn | OIDN 2.5.1 CUDA |
|---|---|---|---|
| 1920x1080 | high | 6.72 ms | 8.10 ms |
| 1920x1080 | fast | 3.65 ms | 5.55 ms |
| 3840x2160 | high | 27.83 ms | 34.65 ms |
| 3840x2160 | fast | 14.63 ms | 23.41 ms |
Validation
- In every configuration, the output matches the Open Image Denoise CPU device about as closely as OIDN's CUDA backend does. The configurations cover:
- HDR, LDR and sRGB color
- albedo and normal guides, noisy and clean
- all three quality levels
- half-precision images
- fixed input scale
- tiling
- buffers and image views
- The Khronos validation layer reports no errors.
- CI builds every push on Windows and Linux. On Linux, it also checks the results against the official Open Image Denoise release, using lavapipe (Mesa's CPU Vulkan driver).
The measurements and how they were made are in docs/validation_and_performance.md. How the library works is in docs/architecture.md.
Using it
include(FetchContent)
FetchContent_Declare(vk_oidn
GIT_REPOSITORY https://github.com/mklefrancois/vk_oidn.git
GIT_TAG v0.1.0
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(vk_oidn)
target_link_libraries(my_app PRIVATE vk_oidn::vk_oidn)A complete example is the oidn_denoiser sample of vk_mini_samples: a path-traced Cornell box with its color, albedo and normal images, a denoiser toggle and image thumbnails.
Requirements and known limitations
- Building requires CMake 3.21+, a C++17 compiler, Python 3 and the Vulkan SDK, which provides
slangc. It is tested with SDK 1.4.363.0 and Slang 2026.17. Theslangcfrom some Linux distribution packages is too old; CMake detects this and says so. - The library is optimized and measured on NVIDIA GPUs. On other GPUs, tensor cores are not used by default and the fallback kernel runs instead.
- On Linux, the denoising has been validated on lavapipe only; no Linux GPU driver has been tested yet.
- The API may still change in 0.x versions.
- The README status checklist in this tag is outdated: all its steps are done.
License
Apache License 2.0. The network weights come from RenderKit/oidn-weights (Apache 2.0, Copyright Intel Corporation); see NOTICE.