7 September 2026
Does the exported window matter?
ExecuTorch, 2k to 32k
ExecuTorch fixes a model's context window when the model is exported. This page asks whether that choice changes anything but memory.
- Purpose
- Decide whether a full sweep of five windows, five models and four chips (about 50 device hours) was worth running, by measuring the same weights exported at 2k, 4k, 8k, 16k and 32k on the same prompts. Five windows of LFM2.5-1.2B ran on the Dimensity 9400; the other model and phone pairs ran the smallest and largest window.
- How it was graded
- 90 prompts per cell: 30 GSM8K (the last number in the reply must equal the reference), 30 IFEval (every instruction in the prompt must be satisfied, checked by the benchmark's own code), 30 BFCL (exactly one call to the right function with the right arguments). Greedy decoding, thinking off, replies capped at 640 tokens (384 for BFCL). The 2.6B was also rerun at a 2048 cap.
- How long it ran
Model Dimensity 8 Elite Tensor G5 Exynos LFM2.5-1.2B 63 12 43 35 LFM2.5-2.6B, 640 cap 129 75 128 117 LFM2.5-2.6B, 2048 cap 146 130 213 195 Qwen3-1.7B 33 19 57 25 Minutes the model spent generating, summed over every run in that cell; 23.7 hours in all. Loading, cooling and Test Lab queueing came on top. Run on 2026-09-07.
Findings
- Answers and tool calls
- No consistent directional effect found
- Two windows agree on 12 to 19 of 90 replies; the same file run twice agrees on 7 to 15. Grades move both ways between windows by about as much as between repeats.
- Speed
- Paired medians close; Qwen3 32k slower
- Same prompt, same turn, Dimensity 9400: LFM2.5 windows within 2.4% of each other. Qwen3 32k was 5.9% slower on prefill and 4.7% on decode than 2k.
- Memory
- The one thing the window buys, at load
- LFM2.5 pays 25 to 33 KB per token of window; Qwen3-1.7B pays 224 KB, so its 32k export needs over 6 GB before the first prompt and 12 GB phones kill it.
- Where the window did matter
- At 2k, 14 of 60 long replies hit the window
- The 2.6B reasons before it answers. At 2k, prompt plus reply reached the window and was cut; at 4k and above only the reply cap cut them. Grades barely moved.
- The full sweep
- Screen the endpoints before any full sweep
- Compute the KV cost, run the smallest and largest window per model and chip, and add middle windows only where those two diverge or fail.
Every chart, one condition at a time
Pick a model or condition; every chart follows.
Memory after load
Resident memory of the test process right after each export loaded, Dimensity 9400, from the fixed-prompt probe. The picked model is drawn solid.
Speed, paired probe
Each window's throughput as a ratio of the model's smallest window, same 929-token prompt, same turn against same turn, six pairs per file. Dot is the median, bar the range. Dimensity 9400 only.
PrefillDecode1.00 means no difference
Grades by window
Prompts passed out of 30 on each set, per chip. Points are joined only where neighbouring windows were both measured; the cloud phones have endpoint measurements only and cannot exclude an effect at 8k or 16k. Hollow markers are one same-file repeat on the same phone, an observed run-to-run reference rather than a noise bound.
Dimensity 9400Snapdragon 8 EliteTensor G5Exynos 2400Second run, same file
Identical replies
How many prompts came back byte-identical to the largest window's reply: the raw token stream, the parsed tool calls (BFCL prompts only) and the shown text. Dashed lines are same-file repeats on the phone of that colour, a reference for observed run-to-run agreement.
Dimensity 9400Snapdragon 8 EliteTensor G5Exynos 2400Same file run twice× fewer prompts than the full set
Notes
- Two things the matrix found that it was not looking for. Every compiled model this app had ever run was fed no start-of-text token: the ExecuTorch 1.4.0 runtime adds one only when asked and the app never asked. LFM2.5-1.2B shrugs it off; LFM2.5-2.6B scored 0 of 30 on GSM8K on every chip until the engine wrote the token itself, and every 2.6B cell here is from the fixed build. The 1.2B cells remain BOS-less as measured: comparable among themselves, and a description of that deployed configuration. And a phone that has dozed throttles instrumentation two to five times with wild variance, so the local runner now wakes the phone and holds it awake.
- Two 2.6B conditions. Its own template makes it reason before answering, so under the suite's 640-token cap 16 of 30 GSM8K and 26 of 30 IFEval replies never reached an answer: those rows are cap-censored and kept for their BFCL calls, memory and speed. The rerun at a 2048 cap, GSM8K and IFEval only, is the model's real score: 23 to 28 of 30 and 18 to 21 of 30 on every phone and window, with its same-file repeat moving grades by 2 and its BFCL calls unchanged.
- Qwen3 32k on 12 GB phones. Samsung's Heimdall memory guard killed the test process on the Galaxy S25 Ultra and S24+ after 7 to 12 prompts ("Trigger Global kill before GC, Usage 8.67 GB, Threshold 6 GB" in the logcats). A rerun on the Poco with logcat attached died the same way after 7: MIUI's ActivityManager force-stopped it for "used too many pss resource, pss used 8.65 GB, threshold 6 GB". Only the 16 GB Pixel 10 Pro XL finished. Those cells are marked incomplete and carry no grade or timing.
- Not matched conditions. The Dimensity 9400 ran in hand, cooled below 42 C before each probe load. The 8 Elite, Tensor G5 and Exynos 2400 ran racked on Firebase Test Lab, where phones throttle within about 40 seconds, and had no paired probe: their suite timings are per-cell medians over different replies and do not support a speed claim either way.
Every number
The full matrix, as rendered from the graded reports by window_report.py. Prefill ms is the runtime's prefill of the whole prompt, the engine-side part of time to first token. ms/token is decode time over generated tokens; replies differ per cell, so it is not a paired comparison. Capped counts replies that ran to the token cap (640, or 384 for BFCL). RSS is resident memory right after load and at the end of the run.
LFM2.5 1.2B 14 cells, LFM2.5-1.2B-Instruct-8da4wShowHide
Scrolls sideways; the phone and window column stays put.
| Phone and window | File | GSM8K | IFEval | BFCL | Capped | Prefill ms | ms/token | Prefill tok/s | Decode tok/s | Ran at | RSS after load MB | RSS at end MB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D9400, 2k | 796 MB | 17/30 | 15/30 | 26/30 | 10/90 | 360 | 25.9 | 254 | 38.7 | 2048 | not logged | 1186 |
| D9400, 4k | 798 MB | 16/30 | 17/30 | 26/30 | 12/90 | 363 | 26.7 | 253 | 37.5 | 4096 | 1099 | 1218 |
| 8 Elite, 4k | 798 MB | 13/30 | 18/30 | 28/30 | 11/90 | 374 | 17.7 | 227 | 56.4 | 4096 | 1104 | 1207 |
| Tensor G5, 4k | 798 MB | 13/30 | 18/30 | 27/30 | 14/90 | 817 | 64.2 | 129 | 15.6 | 4096 | 1113 | 1225 |
| Exynos 2400, 4k | 798 MB | 13/30 | 17/30 | 26/30 | 11/90 | 460 | 34.0 | 195 | 29.4 | 4096 | 1126 | 1213 |
| Exynos 2400 repeat, 4k | 798 MB | 15/30 | 21/30 | 27/30 | 10/90 | 516 | 37.5 | 180 | 26.7 | 4096 | 1126 | 1217 |
| D9400, 8k | 802 MB | 17/30 | 18/30 | 26/30 | 11/90 | 353 | 26.1 | 259 | 38.3 | 8192 | 1226 | 1333 |
| D9400, 16k | 810 MB | 13/30 | 20/30 | 27/30 | 12/90 | 354 | 25.9 | 262 | 38.6 | 16384 | not logged | 993 |
| D9400 repeat, 16k | 810 MB | 14/30 | 16/30 | 28/30 | 12/90 | 368 | 26.2 | 259 | 38.2 | 16384 | 1416 | 1528 |
| D9400, 32k | 827 MB | 12/30 | 18/30 | 27/30 | 16/90 | 366 | 26.3 | 257 | 38.0 | 32768 | not logged | 1903 |
| D9400 repeat, 32k | 827 MB | 12/30 | 15/30 | 27/30 | 12/90 | 392 | 28.8 | 237 | 34.8 | 32768 | 1798 | 1901 |
| 8 Elite, 32k | 827 MB | 16/30 | 13/30 | 26/30 | 11/90 | 324 | 16.3 | 261 | 61.2 | 32768 | not logged | 1880 |
| Tensor G5, 32k | 827 MB | 16/30 | 18/30 | 27/30 | 13/90 | 862 | 79.5 | 98 | 12.6 | 32768 | not logged | 1896 |
| Exynos 2400, 32k | 827 MB | 14/30 | 20/30 | 25/30 | 11/90 | 462 | 37.1 | 184 | 27.0 | 32768 | not logged | 1883 |
Run-to-run control: the same file run twice on the same phone, replies byte-identical.
| Window | Phone | Identical replies |
|---|---|---|
| 4k | Exynos 2400 | raw 7/90, calls 23/30, content 11/90 |
| 16k | D9400 | raw 13/90, calls 23/30, content 20/90 |
| 32k | D9400 | raw 15/90, calls 25/30, content 18/90 |
Replies identical to the 32k export, per window: raw stream and shown content over the prompts both runs completed, parsed tool calls over the BFCL prompts among them.
| Phone | 2k | 4k | 8k | 16k |
|---|---|---|---|---|
| D9400 | raw 12/90, calls 25/30, content 17/90 | raw 17/90, calls 26/30, content 18/90 | raw 18/90, calls 28/30, content 19/90 | raw 12/90, calls 24/30, content 16/90 |
| D9400 repeat | - | - | - | raw 14/90, calls 25/30, content 17/90 |
| 8 Elite | - | raw 13/90, calls 26/30, content 15/90 | - | - |
| Tensor G5 | - | raw 10/90, calls 24/30, content 14/90 | - | - |
| Exynos 2400 | - | raw 16/90, calls 28/30, content 16/90 | - | - |
LFM2.5 2.6B, 640 cap 9 cells, LFM2.5-2.6B-8da4wShowHide
Scrolls sideways; the phone and window column stays put.
| Phone and window | File | GSM8K | IFEval | BFCL | Capped | Prefill ms | ms/token | Prefill tok/s | Decode tok/s | Ran at | RSS after load MB | RSS at end MB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D9400, 2k | 1783 MB | 15/30 | 4/30 | 24/30 | 42/90 | 882 | 60.3 | 108 | 16.6 | 2048 | 1979 | 1958 |
| D9400 repeat, 2k | 1783 MB | 13/30 | 6/30 | 24/30 | 43/90 | 872 | 59.6 | 110 | 16.8 | 2048 | 1984 | 1871 |
| 8 Elite, 4k | 1786 MB | 13/30 | 5/30 | 22/30 | 44/90 | 1197 | 55.4 | 72 | 18.0 | 4096 | 2058 | 2194 |
| Tensor G5, 4k | 1786 MB | 17/30 | 6/30 | 24/30 | 38/90 | 1066 | 92.2 | 88 | 10.8 | 4096 | 2054 | 2221 |
| Exynos 2400, 4k | 1786 MB | 10/30 | 5/30 | 23/30 | 46/90 | 1142 | 83.5 | 81 | 12.0 | 4096 | 2136 | 2189 |
| D9400, 32k | 1815 MB | 13/30 | 5/30 | 24/30 | 45/90 | 882 | 59.7 | 109 | 16.8 | 32768 | 2937 | 2185 |
| 8 Elite, 32k | 1815 MB | 13/30 | 5/30 | 25/30 | 42/90 | 1096 | 49.7 | 81 | 20.1 | 32768 | 2950 | 3082 |
| Tensor G5, 32k | 1815 MB | 19/30 | 4/30 | 25/30 | 37/90 | 968 | 81.1 | 101 | 12.3 | 32768 | 2962 | 3120 |
| Exynos 2400, 32k | 1815 MB | 18/30 | 3/30 | 25/30 | 39/90 | 1085 | 84.5 | 80 | 11.8 | 32768 | 3032 | 3084 |
Run-to-run control: the same file run twice on the same phone, replies byte-identical.
| Window | Phone | Identical replies |
|---|---|---|
| 2k | D9400 | raw 0/90, calls 24/30, content 29/90 |
Replies identical to the 32k export, per window: raw stream and shown content over the prompts both runs completed, parsed tool calls over the BFCL prompts among them.
| Phone | 2k | 4k |
|---|---|---|
| D9400 | raw 0/90, calls 24/30, content 29/90 | - |
| 8 Elite | - | raw 0/90, calls 25/30, content 29/90 |
| Tensor G5 | - | raw 0/90, calls 27/30, content 30/90 |
| Exynos 2400 | - | raw 0/90, calls 25/30, content 30/90 |
LFM2.5 2.6B, 2048 cap 8 cells, LFM2.5-2.6B-8da4w (cap 2048)ShowHide
Scrolls sideways; the phone and window column stays put.
| Phone and window | File | GSM8K | IFEval | BFCL | Capped | Prefill ms | ms/token | Prefill tok/s | Decode tok/s | Ran at | RSS after load MB | RSS at end MB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D9400, 2k | 1783 MB | 24/30 | 21/30 | - | 14/60 | 693 | 62.8 | 105 | 15.9 | 2048 | 1959 | 1783 |
| 8 Elite, 4k | 1786 MB | 25/30 | 19/30 | - | 11/60 | 866 | 51.1 | 82 | 19.6 | 4096 | 2055 | 2139 |
| Tensor G5, 4k | 1786 MB | 23/30 | 21/30 | - | 13/60 | 776 | 81.9 | 106 | 12.2 | 4096 | 2055 | 2188 |
| Exynos 2400, 4k | 1786 MB | 25/30 | 21/30 | - | 13/60 | 893 | 87.1 | 84 | 11.5 | 4096 | 2136 | 2187 |
| D9400, 32k | 1815 MB | 26/30 | 21/30 | - | 10/60 | 621 | 59.5 | 113 | 16.8 | 32768 | 2922 | 2262 |
| 8 Elite, 32k | 1815 MB | 24/30 | 21/30 | - | 15/60 | 982 | 54.5 | 80 | 18.4 | 32768 | 2950 | 2626 |
| Tensor G5, 32k | 1815 MB | 28/30 | 18/30 | - | 12/60 | 842 | 102.4 | 80 | 9.8 | 32768 | 2962 | 3123 |
| Exynos 2400, 32k | 1815 MB | 27/30 | 19/30 | - | 10/60 | 924 | 87.8 | 82 | 11.4 | 32768 | 3028 | 3080 |
Replies identical to the 32k export, per window: raw stream and shown content over the prompts both runs completed, parsed tool calls over the BFCL prompts among them.
| Phone | 2k | 4k |
|---|---|---|
| D9400 | raw 0/60, calls 0/0, content 0/60 | - |
| 8 Elite | - | raw 0/60, calls 0/0, content 0/60 |
| Tensor G5 | - | raw 0/60, calls 0/0, content 0/60 |
| Exynos 2400 | - | raw 0/60, calls 0/0, content 0/60 |
Qwen3 1.7B 9 cells, Qwen3-1.7B-8da4wShowHide
Scrolls sideways; the phone and window column stays put.
| Phone and window | File | GSM8K | IFEval | BFCL | Capped | Prefill ms | ms/token | Prefill tok/s | Decode tok/s | Ran at | RSS after load MB | RSS at end MB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D9400, 2k | 1285 MB | 20/30 | 15/30 | 24/30 | 8/90 | 532 | 45.1 | 174 | 22.2 | 2048 | 1758 | 1833 |
| D9400 repeat, 2k | 1285 MB | 17/30 | 18/30 | 24/30 | 7/90 | 532 | 45.7 | 174 | 21.9 | 2048 | 1766 | 1900 |
| 8 Elite, 2k | 1285 MB | 18/30 | 13/30 | 25/30 | 12/90 | 673 | 41.9 | 141 | 23.9 | 2048 | 1771 | 1887 |
| Tensor G5, 2k | 1285 MB | 23/30 | 13/30 | 24/30 | 8/90 | 814 | 89.3 | 121 | 11.2 | 2048 | 1772 | 1892 |
| Exynos 2400, 2k | 1285 MB | 17/30 | 12/30 | 23/30 | 10/90 | 734 | 65.9 | 125 | 15.2 | 2048 | 1838 | 1886 |
| D9400, 32k | 1348 MB | INCOMPLETE: process ended after 6/90 prompts | 32768 | 6188 | 5426 (last observed) | |||||||
| 8 Elite, 32k | 1348 MB | INCOMPLETE: process ended after 12/90 prompts | 32768 | 6127 | 4836 (last observed) | |||||||
| Tensor G5, 32k | 1348 MB | 16/30 | 14/30 | 25/30 | 8/90 | 844 | 94.0 | 139 | 10.6 | 32768 | 8499 | 8602 |
| Exynos 2400, 32k | 1348 MB | INCOMPLETE: process ended after 7/90 prompts | 32768 | 6396 | 6380 (last observed) | |||||||
Run-to-run control: the same file run twice on the same phone, replies byte-identical.
| Window | Phone | Identical replies |
|---|---|---|
| 2k | D9400 | raw 31/90, calls 30/30, content 31/90 |
Replies identical to the 32k export, per window: raw stream and shown content over the prompts both runs completed, parsed tool calls over the BFCL prompts among them.
| Phone | 2k |
|---|---|
| D9400 | raw 0/6, calls 0/0, content 0/6 |
| 8 Elite | raw 0/12, calls 0/0, content 0/12 |
| Tensor G5 | raw 29/90, calls 27/30, content 31/90 |
| Exynos 2400 | raw 0/7, calls 0/0, content 0/7 |
Fixed-prompt speed probe Dimensity 9400, 12 files, 929-token prompt, 160-token cap, three turns per load, two interleaved passesShowHide
Phone cooled below 42 C and awake before each load. The second table pairs each turn with the same turn of the model's smallest window in the same pass.
| File | Turns | Prefill tok/s (median, min to max) | Decode tok/s (median, min to max) | Prefill ms, 929 tokens | Resident after load MB |
|---|---|---|---|---|---|
| LFM2.5-1.2B-Instruct-8da4w-2k | 6 | 332 (288 to 344) | 40.2 (33.7 to 41.0) | 2804 | 1050 |
| LFM2.5-1.2B-Instruct-8da4w-4k | 6 | 340 (330 to 344) | 40.4 (36.9 to 41.0) | 2738 | 1098 |
| LFM2.5-1.2B-Instruct-8da4w-8k | 6 | 343 (327 to 345) | 40.8 (40.0 to 41.2) | 2712 | 1194 |
| LFM2.5-1.2B-Instruct-8da4w-16k | 6 | 342 (326 to 345) | 40.5 (39.8 to 41.2) | 2718 | 1386 |
| LFM2.5-1.2B-Instruct-8da4w-32k | 6 | 343 (329 to 346) | 40.5 (39.9 to 40.9) | 2712 | 1768 |
| LFM2.5-2.6B-8da4w-2k | 6 | 149 (142 to 153) | 19.0 (16.7 to 19.5) | 6254 | 1984 |
| LFM2.5-2.6B-8da4w-4k | 6 | 148 (135 to 153) | 18.1 (16.5 to 19.5) | 6264 | 2046 |
| LFM2.5-2.6B-8da4w-8k | 6 | 149 (140 to 153) | 18.2 (16.7 to 19.5) | 6234 | 2172 |
| LFM2.5-2.6B-8da4w-16k | 6 | 149 (138 to 153) | 18.4 (16.6 to 19.5) | 6226 | 2427 |
| LFM2.5-2.6B-8da4w-32k | 6 | 149 (139 to 152) | 18.1 (16.2 to 19.5) | 6240 | 2936 |
| Qwen3-1.7B-8da4w-2k | 6 | 200 (193 to 206) | 18.0 (16.1 to 18.2) | 4680 | 1758 |
| Qwen3-1.7B-8da4w-32k | 6 | 184 (162 to 203) | 16.6 (15.1 to 17.6) | 5064 | 6153 |
| File | Prefill vs smallest window (median ratio, min to max) | Decode vs smallest window | Paired turns |
|---|---|---|---|
| LFM2.5-1.2B-Instruct-8da4w-2k | 1.000 (1.000 to 1.000) | 1.000 (1.000 to 1.000) | 6 |
| LFM2.5-1.2B-Instruct-8da4w-4k | 1.007 (0.987 to 1.181) | 0.999 (0.927 to 1.190) | 6 |
| LFM2.5-1.2B-Instruct-8da4w-8k | 1.003 (0.995 to 1.198) | 1.011 (0.995 to 1.187) | 6 |
| LFM2.5-1.2B-Instruct-8da4w-16k | 1.008 (0.992 to 1.190) | 1.009 (0.988 to 1.187) | 6 |
| LFM2.5-1.2B-Instruct-8da4w-32k | 1.013 (0.999 to 1.202) | 1.006 (0.993 to 1.184) | 6 |
| LFM2.5-2.6B-8da4w-2k | 1.000 (1.000 to 1.000) | 1.000 (1.000 to 1.000) | 6 |
| LFM2.5-2.6B-8da4w-4k | 0.995 (0.947 to 1.002) | 0.985 (0.946 to 1.005) | 6 |
| LFM2.5-2.6B-8da4w-8k | 0.997 (0.983 to 1.005) | 0.991 (0.943 to 1.000) | 6 |
| LFM2.5-2.6B-8da4w-16k | 1.003 (0.971 to 1.005) | 0.997 (0.938 to 1.005) | 6 |
| LFM2.5-2.6B-8da4w-32k | 0.997 (0.975 to 1.003) | 0.976 (0.943 to 1.005) | 6 |
| Qwen3-1.7B-8da4w-2k | 1.000 (1.000 to 1.000) | 1.000 (1.000 to 1.000) | 6 |
| Qwen3-1.7B-8da4w-32k | 0.941 (0.793 to 0.982) | 0.953 (0.835 to 1.012) | 6 |
How it was run
- What was run. LFM2.5-1.2B: five windows on the Dimensity 9400, 16k and 32k twice; 4k and 32k on the cloud chips, 4k twice on the Exynos. LFM2.5-2.6B: 2k and 32k on the Dimensity, 2k twice; 4k and 32k on the cloud chips; then GSM8K and IFEval again at a 2048 cap on every one of those cells. Qwen3-1.7B: 2k and 32k everywhere, 2k twice on the Dimensity, 32k twice on the Dimensity to catch the kill. Every file loaded at its own exported window. Exports use ExecuTorch 1.4.0's recipes: 8-bit dynamic activations, 4-bit weights in groups of 32, 8-bit embeddings, fp32 KV cache, prefill chunk 2048.
- Review. Codex reviewed the method twice, before and after the data: same-file repeats, a paired speed probe separate from the task eval, a three-way identity metric counted over BFCL only, memory after load, a second architecture, incomplete cells shown as such, and conclusions bounded by the observed run variation. All are in what you see here.
- Where things are. The note: executorch-window-matrix.md. The tables: window-matrix.md. Raw and graded reports: tools/eval/results. The exports, each window a file: LFM2.5-1.2B, LFM2.5-2.6B, Qwen3-1.7B on Hugging Face.
OpenWeightsFive chips, two runtimesWhat the reruns changedSource on GitHub