Add Halidoscope for interactive trace and profiling visualization. - #9356
Draft
parkerziegler wants to merge 62 commits into
Draft
Add Halidoscope for interactive trace and profiling visualization.#9356parkerziegler wants to merge 62 commits into
parkerziegler wants to merge 62 commits into
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #9356 +/- ##
==========================================
- Coverage 69.97% 69.84% -0.14%
==========================================
Files 259 259
Lines 79158 79323 +165
Branches 19293 19329 +36
==========================================
+ Hits 55394 55404 +10
- Misses 17898 18079 +181
+ Partials 5866 5840 -26 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Member
|
@parkerziegler — some quick-to-fix clang-tidy diagnostics: |
parkerziegler
force-pushed
the
parkerziegler/halidoscope
branch
from
August 18, 2026 17:06
f3ae8ba to
e6799ee
Compare
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
… Funcs on playback. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…th mode-specific renderers. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…formation by Func.
…the notion of producer-consumer in the original Halide paper. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
… there are no intervening loads. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…ng Halidoscope locally.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…ation into 2 (instead of 5) passes over store and load indices. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…pecify a path to the halidoscope binary on disk.
…ctory for persisting generated Halide trace and profile.
…GUI controls into RenderModeParameters component.
… from HalideRuntime.h. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…cope's JIT profiling runs. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…s UI. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthorpic.com>
…efore exit of DeferProfilerFlush. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
parkerziegler
force-pushed
the
parkerziegler/halidoscope
branch
from
August 19, 2026 16:50
e6799ee to
c0703b4
Compare
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR introduces Halidoscope, a new tool for interactively visualizing Halide traces and performance information captured by the Halide profiler.
Motivation
Understanding the performance characteristics of a Halide program (and, specifically, its schedule) can be tricky for experts and downright daunting for newer Halide developers. Today, the primary developer tooling we have to aid folks in understanding their Halide programs is
HalideTraceViz. WhileHalideTraceVizprovides good visual intuition for how a schedule executes, it doesn't provide much insight into how effectively a given schedule balances trade-offs in cache locality, redundant recomputation, and parallelism. Halidoscope attempts to fill this gap by:FuncStore / Load Frequency, Redundant Stores, Reuse Distance, and Thread CoverageNaNs /Infs, and real-time liveness information (e.g.,Funcbuffer liveness, active producer-consumer relationships)High-Level API
Halidoscope ships as both a GUI and CLI that can be invoked through a new
Pipeline::halidoscopemember function or directly from the command line.Calling Halidoscope via
Pipeline::halidoscopeHalide developers can launch Halidoscope via a call to
Pipeline::halidoscope(either in C++ or via the Python bindings) like so:Under the hood, the
Pipeline::halidoscopemember function will:Users can specify a
HalidoscopeOptionsstruct to control how Halidoscope executes with the following fields.halidoscope_pathstd::string$PATHand error if not found.halidoscope_output_dirstd::optional<std::string>.hltraceand profile JSON files to a temporary directory that is destroyed on process exit.halidoscope_profile_runsintCalling Halidoscope from the command line
Users can also call launch Halidoscope directly from the command line, pointing it at a pre-recorded Halide trace binary and (optionally) a profile JSON file.
The Halidoscope CLI also comes with several commands (documented in the README.md and printable via
halidoscope --help) that can provide useful, high-level information on a trace (for both humans and agents).halidoscope list— List theFuncs in a trace, along with their dimensionality.halidoscope stats— Print statistics (minimum/maximum coordinates, minimum/maximum value, maximum store/load counts, and thread count) for one or allFuncs in a trace.halidoscope dot— Generate a Graphviz DOT representation of the pipeline's dataflow graph.halidoscope snapshot— Snapshot aFunc's values at a given packet index for a given render mode, writing the underlying data to a JSON file.Stack and High-Level Architecture
Halidoscope is a completely standalone Tauri application in
tools/halidoscope— it has no dependency on the Halide runtime.Warning
The only slight exception to this is our use of
bindgento derive Rust bindings forhalide_trace_packet_t, which ensures that our Rust packet parser always reads the correct offsets for Halide's packet format.bindgenis run at build-time against a user's local version of the Halide source. However, note that there is no actual runtime FFI between Halidoscope's Rust parser and the Halide runtime or C ABI.Backend
The Halidoscope backend is implemented in Rust and contains the following main modules:
trace.rs— Responsible for parsing a.hltracefile and accumulating trace-level statistics and metadata.render.rs— Computation supporting Halidoscope's render modes, where trace data is converted to RGBAVec<u8>buffers (for display) and binary payloads for histogram data andNaN/Infoverlayscommands.rs— Sets up the Tauri IPC API for communication with the frontend.cli.rs— Handles calls to the Halidoscope CLI.Communication is done entirely over IPC using Tauri commands.
Frontend
The frontend is implemented in TypeScript and React, using Jotai for state management and Tailwind for styling and CSS management. We use Vite as our frontend build system. This is about as standard a frontend stack as you'll find in modern web dev.
By default, Tauri uses a system's native WebView for rendering, which allows us to avoid bundling a full browser engine with the Halidoscope binary. Today, the Halidoscope binary weighs in at 10.5 MB uncompressed and 3.7 MB gzipped.
Breaking changes
No changes here are breaking; all changes are purely additive. Still, it is likely worth reviewing the additions to the
PipelineAPI a bit more carefully to confirm.Checklist