1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
// RLX — versatile ML compiler + runtime.
// Copyright (C) 2026 Eugene Hauptmann, Nataliya Kosmyna.
// SPDX-License-Identifier: MIT OR Apache-2.0
// `objc` crate's `class!` / `msg_send!` macros expand to
// `cfg(feature = "cargo-clippy")` checks that aren't recognized by
// modern rustc. The warnings are third-party noise (~78 across this
// crate); they say nothing about our code. Silence at the crate root.
//! RLX Metal backend — Apple Silicon GPU execution.
//!
//! Compiles RLX IR graphs to Metal compute pipelines + MPS matrix kernels.
//!
//! Architecture mirrors rlx-cpu:
//! - `device` — Metal device discovery and properties
//! - `arena` — GPU buffer allocation from memory plan
//! - `blas` — MPS matrix multiplication (analog of cblas_sgemm)
//! - `kernels`— custom MSL compute shaders (analog of NEON kernels)
//! - `thunk` — pre-compiled command buffer with arena offsets
//! - `backend`— ExecutableGraph implementation
//!
//! Apple Silicon advantages:
//! - Unified memory: zero-copy CPU↔GPU
//! - 16-core GPU on M4 Pro: ~1.4 TFLOP/s peak
//! - 273 GB/s memory bandwidth (vs 120 on CPU)
//! - MPSMatrixMultiplication uses dedicated matmul hardware
/// Hand-rolled Metal bindings, replacing the `metal` crate. Public so downstream
/// `MetalGpuKernel` authors can name the encoder/buffer types they are handed:
/// `use rlx_metal::mtl as metal;` keeps existing custom kernels source-compatible.
/// Gated on `rlx_metal_host` because it reads `crate::kernels::RLX_KERNELS_MSL`
/// to scan the shipping MSL for `simdgroup_load` strides — and `kernels` is
/// host-gated. Leaving this ungated compiled on macOS and broke the *Linux*
/// build of this crate, which is the `linux_workspace_test_gate` trap: a
/// workspace `cargo test` builds every crate, Apple-only ones included, so one
/// ungated Apple module stops **every** test on the ROCm rig from running.
/// The Apple kernel knobs, in one place — builder, config and CLI, one parser.
///
/// Five parameters, each targeting a limiter measured on Apple silicon, and a
/// single `RLX_METAL_PARAMS` variable rather than one per knob.
/// Does more threadgroup memory pay for itself on this Apple GPU?
///
/// Apple hides memory latency with occupancy, not with software pipelining, so
/// the CAKE-shaped question "how deep should the pipeline be" has an
/// Apple-shaped answer that is usually "shallower". Calibrated from measured
/// runs; refuses to predict on chips it has not seen.
/// Generate the tiled sgemm entry point *from* a typed schedule rather than
/// from the hand-written MSL in [`kernels`].
///
/// Feature-gated because it is a second implementation of a shipping kernel:
/// until it is measured at least as fast on Apple hardware, `kernels.rs` stays
/// the default and this is opt-in.
/// CPU host-fallback for the core Riemannian / SPD-manifold ops (BiMap /
/// ReEig / LogEig / SpdBatchNorm / SpdKarcherMean + backwards). No MSL
/// eigen kernel; they run `rlx_cpu::spd` (F64) against the unified-memory
/// arena between GPU segments, like `Op::Fft`. See `crate::spd`.
pub use ;
/// Device-side span of the last run, from the command buffer's own
/// `GPUStartTime`/`GPUEndTime` — the part a kernel change can actually move.
/// Double-single (2× f32 ≈ f64) reductions — near-f64 precision on Metal, which
/// has no native f64. Compiled with precise math (fast-math breaks EFT).
/// Legalization op claim — always available (no Metal device required).
/// Dispatch-table persistence + the arch key.
///
/// Gated on `rlx_metal_host` like `cost` and `calibrate`, because it reads
/// `cost::hw_model()` to name the GPU family. Leaving it ungated compiled fine on
/// macOS and broke the *Linux* build of this crate — which then failed the whole
/// workspace `cargo test` on the ROCm rig, so **zero** tests ran there. That is
/// the `linux_workspace_test_gate` trap: a workspace test run builds every crate,
/// Apple-only ones included, and a green macOS check says nothing about it.
pub use SUPPORTED_OPS;
/// PLAN: Schedule splitting for the Metal MPSGraph path. Splits the
/// schedule at attention boundaries so the broken slice-of-computed
/// MPSGraph attention pattern is replaced by the parity-correct
/// thunk path; everything else still gets the MPSGraph dispatch-
/// overhead reduction. Scaffolding only today (data model +
/// segmenter + 3 unit tests); executor wiring + per-segment plan
/// compilation is the next chunk.
/// Typed kernel planning, precision legality, token bucketing, and two-stage
/// build/launch configuration for Metal kernel families.
/// Whether a usable Metal device is present. `rlx-metal` is a Metal-only
/// dependency (its consumers gate it to `cfg(all(target_vendor = "apple",
/// not(target_os = "watchos")))` — every Apple platform with Metal: macOS,
/// iOS, tvOS, visionOS), so this is never a non-Apple `false` stub — callers
/// on other platforms (and watchOS) report Metal availability via the
/// runtime's own device-feature check, not this crate.