Skip to content

v4.1.0

Choose a tag to compare

@jcfr jcfr released this 01 Apr 20:57
77d6387

Release Artifacts

See supported platforms for compatibility.

Release Notes

New Features and Improvements

Core
  • GPU-resident operators now support multiple input and output ports per connection.
  • Renamed the existing flow-oriented graph API to use the canonical FlowGraph / FlowGraphImpl C++ names and the Python holoscan.flow_graphs module, while reserving the Graph name and core/graphs path for future use.
  • The EventBasedScheduler now exposes advanced performance-tuning parameters from the underlying GXF scheduler that can reduce lock contention and improve scaling with higher worker thread counts. New optimizations include work stealing between worker queues, a worker-side post-check fast path that bypasses the dispatcher for READY/WAIT_TIME transitions, and sharding of internal notification and wait-state queues. In this release the work stealing (enable_queue_stealing) and post-check fast path optimizations (enable_worker_postcheck_fastpath) are not enabled by default to better preserve v4.0 scheduling behavior and get more real-world experience using these options. See the EventBasedScheduler documentation for details on each parameter.
  • The underlying GXF runtime now automatically uses an entity pool to reuse message entities, eliminating repeated entity creation/destruction overhead in high-throughput pipelines. This is transparent and requires no application changes. To disable pooling (e.g., for debugging), set the environment variable GXF_ENTITY_POOL_SIZE=0 before launching the application.
  • Fragment::add_subgraph now takes ownership of the subgraph, enabling a factory pattern where subgraphs of runtime-determined type can be created externally and added to a fragment or parent subgraph.
  • Added Fragment::subgraphs() and Subgraph::nested_subgraphs() accessors for inspecting the subgraph hierarchy (e.g. for graph visualization).
Operators/Resources/Conditions
  • HolovizOp now supports 16-bit signed and unsigned integer RGB, 32-bit floating point RGB, and 16-bit floating point R, RGB and RGBA image formats.
Examples
Holoviz module
  • Added support for R16G16B16_UNORM, R16G16B16_SNORM, R16G16B16_SFLOAT and R32G32B32_SFLOAT image formats.
Holoinfer module
Utils
HoloHub
Source build & Release Artifacts
Documentation

Breaking Changes

  • Removed the holoscan.cli Python module stub that was deprecated in v2.9. Users who need CLI
    functionality should install the standalone holoscan-cli
    package via pip install holoscan-cli.

Bug fixes

Issue Description
5606400, 5929120 Resolved Python GIL crash (Fatal Python error: take_gil: PyMUTEX_LOCK(gil->mutex) failed or SIGSEGV) that occurred when running the V4L2 camera Python example on AGX Orin iGPU and AGX Thor iGPU. The issue was caused by libv4l2 plugin loading, which corrupted glibc TLS destructor pointers through dlopen/dlclose of NVIDIA V4L2 codec plugins, as well as a stale PyThreadState left in CPython's GILState TSS, leading to a poisoned PyGILState_Ensure() on GXF worker threads. The immediate solution was to avoid using libv4l2 wrappers in V4L2VideoCaptureOp. A permanent fix is being developed on the NVIDIA V4L2 plugin side.
5933258 Fixed SIGSEGV in __nptl_deallocate_tsd during thread teardown when running the V4L2 camera C++ example on AGX Orin iGPU and AGX Thor iGPU. Root cause: v4l2_open() loaded all NVIDIA V4L2 plugins indiscriminately, including the Thor/OpenRM CUVID plugin (libv4l2_nvcuvidvideocodec.so) whose libEGL/libGLdispatch dependency chain registered a pthread_key_create TLS destructor that became a dangling pointer after dlclose. Fix: replace v4l2_open()/v4l2_close() with raw POSIX open()/close() in V4L2VideoCaptureOp. A permanent fix is being developed on the NVIDIA V4L2 plugin side.
5946872 Fixed CuPy failing with Permission denied when the container runs as a non-root user other than the default Ubuntu user (UID 1000), e.g. docker run -u 1001:1001. CuPy was writing its kernel cache under $HOME/.cupy/kernel_cache, which may not exist or be writable for arbitrary UIDs. Official Holoscan Docker images now set CUPY_CACHE_DIR=/tmp/.cupy/kernel_cache (world-writable), and the run script exports a writable cache path for dev-container workflows. Custom images that omit that ENV should set CUPY_CACHE_DIR to a writable directory before running Python.

Known Issues

Issue Description
5211869 On IGX Orin dGPU, error "Failed to start server on 0.0.0.0:10002" is reported when debugging the Distributed Endoscopy Tool Tracking application in VS Code.
5928213 On IGX Thor dGPU (Blackwell), holoviz_conditions C++ example application launches with no frame detected and reports the error VK_KHR_present_wait is not available.