TileLang Daily Intelligence Report (2026-10-27)
Research window: 2026-10-26 07:00 ~ 2026-10-27 07:00 (Beijing time, 24 hours).
Sources: Repository-by-repository review of the GitHub tile-ai organization (tilelang / TileOPs / TileFoundry / tilelang-ascend / tilelang-hygon / tilelang-metax / tilelang-musa / tilelang-mlir-ascend / TileRT / tilescale / DeepStack / docs site / language services repo / nightly benchmark repo) + ground-truth search of merged and in-review items (30 merged, 49 in-review updates) + full verification of new issues (11) + commit-level diff and release page review + PyPI artifact status review + adopter repository review (TileKernels / FlashQLA) + community new-repo search + Google News multi-query searches in Chinese and English (via proxy) + Hacker News + arXiv + industry media coverage.
This Issue’s Index
- Today’s Highlights: 30 merges in 24 hours, 49 updates under review, 11 new issues; the main thread centers on three silent errors in “stream and barrier semantics”; the TileOPs first release is still stuck on the last PyPI step; two major Hygon merges
- I. Core Project Progress
- 1.1 Main repo: out_idx outputs now allocated on the caller’s stream; the five-runs-three-corruptions issue reproduced on H100 drops to zero (#3649) (10-26)
- 1.2 Main repo: NVRTC device-side compilation wired into the TVM-FFI execution path, with a new compilation key entry (#3285) (10-26)
- 1.3 Main repo: the cache hint for batched TMA loads is missing a template parameter, so DeepSelect’s TMA path fails to compile (#3683) (10-26)
- 1.4 Main repo: FP8/FP4 non-finite constants in reductions emit invalid literals; sub-byte accumulators now rejected early (#3189) (10-26)
- 1.5 Main repo: SM120 block-scaled GEMM explicitly unrolls K atoms; FullCol configuration improves 51% (#3286) (10-26)
- 1.6 Main repo: scalar parameters in JIT output shapes are resolved before allocation (#3602) (10-26)
- 1.7 Main repo: operand dtype for sm8x sparse metadata no longer falls through without a fallback (#3335) (10-26)
- 1.8 Main repo: DeepSelect Top-K example merged; up to 8.00x over torch.topk across 129 configurations (#3304) (10-26)
- 1.9 Under review: TIRx refactor scope expands again to 1194 files, anchored to an unpatched upstream version (#3666) (10-26)
- 1.10 New defect: three classes of misplaced fences in ThreadSync, with three fixes under review (#3680 / #3682 / #3681) (10-26)
- 1.11 New defect: reduction batch and layout conflict on sm_100 and above; one fix already under review (#3667 / #3684) (10-26)
- 1.12 Under review: transpose target shape validation, region-based kill reordering (#3677 / #3670) (10-26)
- 1.13 Closed: six compile-time crashes in the fuzzing series (10-26)
- II. Multi-Backend Adaptation (Ascend / Hygon / MetaX)
- 2.1 Ascend main repo: precise addressing interface for versioned on-chip buffers (#3607) (10-26)
- 2.2 Ascend under review: manually scheduled FlashMLA, BF16 prefill and FP8 decode (#3678) (10-26)
- 2.3 Ascend under review: early rejection of on-chip memory overflow, E4M3 UB-to-L1 copy, view layout and pointer units (#3655 / #3639 / #3623) (10-24~26)
- 2.4 Ascend under review: optional batched scheduling, cross-core sync requiring batch mode, L0C dual-copy direct transfer (#3675 / #3614 / #3468) (10-26)
- 2.5 Ascend repo: double fix for the installer’s SHMEM section; empty-shell wheels no longer falsely succeed (#1943 / #1946) (10-26)
- 2.6 Ascend repo: W4A4 int4 matmul produces wrong results; root cause is nibble packing treated as 1 byte (#1731) (10-26)
- 2.7 Ascend repo: GM-to-UB copies above two dimensions fold leading dimensions by DMA row count (#1805) (10-26)
- 2.8 Ascend new defect: the Cython wrapper creates a profiler on every call, about 0.28 ms (#1945) (10-26)
- 2.9 Hygon: register pipeline and warp divergence merged, 28 files (#18) (10-26)
- 2.10 Hygon: native B16 storage and dynamic WASP GEMM merged; dual-bank scale buffer under review (#28 / #29) (10-26)
- 2.11 MetaX: org view has push records; none of the six branches has new commits in the window (10-26)
- III. Ecosystem and Adopters (TileOPs / TileFoundry)
- 3.1 TileOPs: first release still on the last step; artifact is still the 2025-10-09 dev build (#2738) (10-26)
- 3.2 TileOPs: D128 dense forward splits keys; prefill-rope drops from 31.04 µs to 17.09 (#2777) (10-26)
- 3.3 TileOPs: D128 persistent forward rewritten per thread and now writes LSE (#2774) (10-26)
- 3.4 TileOPs: fused-add LayerNorm rows split across CTAs; precision defect filed separately (#2768 / #2773) (10-26)
- 3.5 TileOPs: four elementwise and reduction items; clamp’s bf16 row speeds up 5.9% (#2766 / #2767 / #2769 / #2770) (10-26)
- 3.6 TileOPs: alignment checks for called tensors moved up to the operator layer, three items wrapped up (#2772 / #2778 / #2780) (10-26)
- 3.7 TileOPs: three fixes for offset storage, SM90 grouped GEMM and output ABI (#2761 / #2765 / #2762) (10-26)
- 3.8 TileOPs under review: paged prefill for FP8 queries now multiplies value as e4m3 (#2775) (10-26)
- 3.9 TileOPs under review: split scan for GDN prefill on sparse long sequences (#2779) (10-26)
- 3.10 TileFoundry: dynamic shared memory sized by the kernel’s actual view (#271) (10-26)
- 3.11 TileFoundry: whole window emitted by the operand itself; sm_89 GEMM compiles again (#273) (10-26)
- 3.12 TileFoundry new defect: analysis side double-counts shared memory peak and does not propagate it to TIR (#272) (10-26)
- IV. Community, Tutorials and Events
- 4.1 Language service: experimental CUDA debugging goes live, integrating cuda-gdb and Nsight (10-26)
- 4.2 Docs site: eight updates in a single day (10-26)
- 4.3 Four contribution-process governance items: PR description standards, skipping backend tests for docs-only changes, Agent title confirmation, review-bot noise reduction (#3671 / #3672 / #3673 / #3674) (10-26)
- 4.4 New community repos: RISC-V community hub repo, CANN operator repo, Hexagon backend repo, debugging tools repo (10-26)
- 4.5 Industry: report on the narrowing ecosystem gap between Ascend and DeepSeek (10-26)
- V. Trend Observations
- Appendix: Sources and Verification Notes
Today’s Highlights
In 24 hours, the tile-ai org merged 30 PRs (tilelang 14, TileOPs 14, tilelang-hygon 2), updated 49 under review, opened 11 new issues and closed 12. Yesterday’s 78 in a 72-hour window fell back to 30 in a single day — a normal pace — but the focus has clearly shifted from “performance sweep” to “stream and barrier semantics”: the merged output-allocation fix in the main repo (#3649) brings the H100 issue of corrupted output in three of five runs down to zero. The cause: three adapters accept the caller’s stream but allocate out_idx outputs on the current stream, and the caching allocator reuses memory ordered by allocation stream, so work queued on another stream overwrote kernel results. Three ThreadSync defects surfaced the same day (#3680): fences placed inside divergent branches, fences inside branches incorrectly clearing outer pending dependencies, and fence placement in per-thread counted loops — accompanied by two fixes under review, #3682 and #3681. Separately, one PR in the tvm fork repo translates boolean bitwise operations into logical operations, so the prover no longer gives up within its 10000-step budget (#88). No progress on the release side: the TileOPs first-release tracking issue (#2738) is down to just a TestPyPI dry run and the first tag; the latest on PyPI is still 0.0.1.dev2 from 2025-10-09, and the repo has no tags and no releases. On the backend side, Hygon merged two large PRs in one day: register pipeline plus warp divergence (#18, 28 files +5312/-64) and native B16 storage plus dynamic WASP GEMM (#28); the Ascend mainline merged the precise addressing interface for versioned on-chip buffers (#3607, 14 files +982/-26). The heaviest item under review is still #3666, whose scope has grown from just over a thousand files yesterday to 1194 files +106648/-104497.
I. Core Project Progress
1.1 Main repo: out_idx outputs now allocated on the caller’s stream; five-of-five corruption on H100 reproduction drops to zero (#3649)
Merged 10-26 22:36, 5 files +183/-31, fixes #3648. The cython, nvrtc, and cutedsl adapters all accept stream= and launch on that stream, but out_idx outputs were allocated with torch.empty on the current torch stream; the caching allocator reuses blocks ordered only by “allocation stream,” so a block of memory that still had queued work was returned as free, and that work then overwrote the kernel results. The fix adds output_allocation_stream(stream, device): it returns the caller’s stream when it differs from the current stream, otherwise null; a zero handle maps to the default stream, because older PyTorch’s ExternalStream(0) yields a pooled stream rather than the default stream. On an H100 80GB the reproduction went from 4/5, 5/5, 5/5 corrupted to 0/5 for each of the three adapters, and the new test file passes 10 items. The author explicitly rejected adding wait_stream: that would make every call order the launch stream behind all work on the current stream.
Source: https://github.com/tile-ai/tilelang/pull/3649
1.2 Main repo: NVRTC device-side compilation wired into the TVM-FFI execution path, new compile key entries (#3285)
Merged 10-27 00:02, 12 files +133/-133. Adds tl.cuda_compiler="nvrtc", working with the existing TVM-FFI host runtime: NVRTC compiles device-side CUDA source into a cubin, the shared CUDA runtime module imports those bytes, and host-side binding, scalar conversion, conditionals, loops, and launch preparation are still generated by TVM-FFI; the default remains nvcc, and the old execution_backend="nvrtc" adapter keeps its original implementation. The binary cache key now includes the compiler name and NVCC/NVRTC versions, hashed together with target details and effective compile options; architecture tokens such as 90a and 100f are preserved as-is, and incompatible targets report a diagnostic before compilation; every successfully created NVRTC program is destroyed in a finally block. The PR’s CI on H20 ran 5506 passed, 491 skipped, 76 examples passed, 3220 passed on the ROCm 7.2 channel, and 1797 passed on the Ascend channel.
Source: https://github.com/tile-ai/tilelang/pull/3285
1.3 Main repo: batched TMA load cache hint missing a template argument; DeepSelect’s TMA path fails to compile (#3683)
Merged 10-27 00:11, 2 files +20/-11. Batched TMA loads with eviction_policy="evict_first" or "evict_last" failed to compile on main: codegen emitted one CacheHintSm90 template argument, while the raw-pointer overload of tl::tma_load accepts only the barrier type. This defect directly blocked DeepSelect’s TMA path, reproduced on GB200 with CUDA 13.1 using that example’s ring and replay cases. The fix extracts the cache-hint portion from #3296, supplies the missing template argument, and passes the selected policy to the PTX instruction; the shared-memory alignment portion stays in #3296. After the fix, on the same machine the full DeepSelect file passes 144 items and the TMA copy tests pass 22 items, and a CUDA 12.9 SM90 compile check confirms the PTX for all three policies carries the expected operands (the rest of #3296 is not yet merged).
Source: https://github.com/tile-ai/tilelang/pull/3683
1.4 Main repo: reduction FP8/FP4 non-finite constants emitted illegal literals; sub-byte accumulators now rejected early (#3189)
Merged 10-26 15:44, 7 files +204/-4, fixes #2998. T.reduce_max and T.reduce_min emitted illegal inff literals when the output was FP8 E4M3; non-finite E4M3, E8M0, and FP4 constants now go through the existing conversion constructors with valid CUDART_INF_F and CUDART_NAN_F expressions, and saturation and NaN behavior are unchanged. The same change makes regular and deferred reductions reject sub-byte numeric accumulators (FP4, int4, and the like) early with a clear diagnostic; FP4 inputs with FP16 or FP32 accumulation remain supported, boolean reductions are exempt, and E8M0 reduction support remains out of scope. On B300 with CUDA 13.1, 28 focused tests all pass and the full reduction test file passes 150 items; three batched validation failures are pre-existing on main.
Source: https://github.com/tile-ai/tilelang/pull/3189
1.5 Main repo: SM120 block-scaled GEMM explicitly unrolls the K atom; FullCol config gains 51% (#3286)
Merged 10-26 16:36, 4 files +308/-2. This is the follow-up to #3257’s introduction of T.gemm_blockscaled and T.mma_gemm_blockscaled: when the A operand comes from register fragments, the K-atom loop previously used T.serial, making every fragment access a runtime index, and nvcc in pipelined and warp-specialized kernels that it does not unroll itself would keep the fragment in local memory, i.e. spill the MMA path; switching to T.unroll(..., explicit=True) makes every access a compile-time constant. The second change: when both SFA and SFB are in shared memory, each MMA pair previously read shared memory three times; now each lane loads a compact selection pack once per K atom, covering both row-major and block-K-major layouts. On RTX PRO 6000 Blackwell, 143 pass and 4 skip, with output bit-identical to the float32 reference; in the register-A benchmark FullRow gains 2.7%, Square 11.1%, and FullCol 51% (348.5 to 526.7 TFLOPS), and ptxas-reported spills drop from 664 and 484 bytes to 320 and 160. The author also notes that the block_K = 128 with row-major shared scale path already fails validation on main, unrelated to this change, and is left for separate investigation.
Source: https://github.com/tile-ai/tilelang/pull/3286
1.6 Main repo: scalar parameters in JIT output shapes resolved before allocation (#3602)
Merged 10-26 10:06, 7 files +242/-3, fixes #3406. The Cython and PTO wrappers previously could not resolve output dimensions expressed via explicit scalar PrimFunc parameters when allocating outputs; the adapters now pass an “output dimension to scalar parameter position” mapping, the wrappers use the actual argument values directly, and no duplicate launch arguments are appended. Regression coverage spans both backends, zero- and non-zero-dimensional, scalar and multi-dimensional outputs, output ordering, device placement, and launch argument count. Two follow-ups in the same defect family are still under review: #3636 handles composite dimension expressions like (n, 2*n), and #3638 handles same-named but independent dynamic symbols being merged by name.
Source: https://github.com/tile-ai/tilelang/pull/3602
1.7 Main repo: sm8x sparse metadata operand dtype no longer falls through without a fallback (#3335)
Merged 10-26 16:54, 1 file +12/-5. The sparse metadata layout constructor dispatches by architecture, pairing the MMA operand dtype with the metadata buffer width; the sm90 branch rejects unsupported dtypes, but the sm8x branch was written as two whitelist checks with no fallback, so any other spelling fell through to the placement logic below, which infers group and interweave from buffer width alone. The consequence: float8_e4m3fn (torch’s canonical spelling) was accepted as 16-bit metadata and given the fp16 group 32 and interweave 4 convention; any unrecognized spelling, including typos, was also accepted at any width. Unsupported dtypes now raise an error.
Source: https://github.com/tile-ai/tilelang/pull/3335
1.8 Main repo: DeepSelect Top-K example merged, up to 8.00x over torch.topk across 129 configurations (#3304)
Merged 10-26 16:53, 4 files +1265/-0. The example rewrites DeepSeek’s DeepSelect in TileLang with no inline PTX; the author benchmarked 129 configurations, 10 unusable, on an RTX 5090 (170 SMs) with CUDA 12.9 and PyTorch 2.7, using both repeated-input and cache-cleared methods. Under the repeated-input method, a BF16 case with batch 6, N of 16384, and K of 512 runs in 5.059 microseconds versus 40.448 for torch.topk, an 8.00x speedup; an N of 1048576 case runs 15.503 versus 100.254, 6.47x. FP32 combined with K of 4096 is unusable in this wrapper, and the native K=1 path has an aligned-address error; the author marks these “unusable” with a dash rather than zero in the table. The cache-hint fix this example depends on is #3683, merged the same day.
Source: https://github.com/tile-ai/tilelang/pull/3304
1.9 Under review: TIRx refactor grows to 1194 files, pinned to unpatched upstream (#3666)
Opened 10-25, updated three times on 10-26, currently 1194 files +106648/-104497. The plan migrates TileLang from the bundled TVM to a separately released TIRx, with zero patches against a fixed upstream baseline: 3rdparty/tvm and its submodule entries are removed, leaving only CUTLASS, HIP headers, and ignore files under 3rdparty/; unmodified apache/tvm-tirx source is pinned at 9af5544d, depending on apache-tvm-tirx==0.1.0a2 and apache-tvm-ffi==0.1.15.post0, and the integration patches previously carrying a +tilelang.1 suffix are no longer needed. This is the largest item in the current queue, and it determines how subsequent TVM-side fixes (such as the same-day Z3 boolean bitwise operations in the tvm fork repo) reach the mainline.
Source: https://github.com/tile-ai/tilelang/pull/3666
1.10 New defect: three misplaced-barrier cases in ThreadSync, with three fixes under review (#3680 / #3682 / #3681)
#3680, opened 10-26 19:56, reports that tl.ThreadSync places barriers incorrectly in three places: a guard on a per-thread value is treated as block-uniform, so the barrier stays inside the branch and waits for threads that skipped it; a barrier in one branch of an if clears the outer sequence’s pending dependencies, so when the block skips that branch, writes before the if conflict with reads after it; and when a loop’s trip count is per-thread (e.g. modulo thread ID), the barrier stays inside the loop body, and the partially synchronized lowering fails outright with “cannot prove thread rectangle.” #3682 (3 files, roughly +39/-7, 12 new tests) uses a forward analysis pass to collect buffers that may hold per-thread values and shrinks the synchronization summary by branch and loop reachability; the author states the change only reports races, does not eliminate them, and does not split branches. #3681 fixes another crash from the same root: since sm_100, float32 loops are vectorized to 256 bits, and broadcasting to 8 lanes generated an expression taking the address of a temporary, which NVRTC rejected with “must be an lvalue”; the fix assembles the bits directly with __float_as_uint plus shifts. A companion tvm fork PR #88 translates boolean bitwise operations into logical operations, letting the prover reach the same conclusion within a 10000-step budget.
Source: https://github.com/tile-ai/tilelang/pull/3682
1.11 New defect: reduction batch and layout conflict on sm_100 and above, one fix under review (#3667 / #3684)
#3667, opened 10-26 08:31: T.reduce_* on sm_100 and sm_120 fails to lower when the specified batch equals N, because fragment copies use 256-bit loads on sm_100 and above, each thread holds fewer outputs, and a batch legal on sm_90 trips a hard validation. #3684, opened 10-27 05:44 with a fix: ReduceOp now takes the largest proper divisor of N not exceeding batch and warns, while finalize_reducer stays strict because its tests pin the behavior; the new sm_100a and sm_120a lowering tests fail on main and pass on this branch, tested on an RTX 5070 Ti. Another item in the same reduction family, #3341 (thread extent resolution for batched all-reduce), is still under review.
Source: https://github.com/tile-ai/tilelang/pull/3684
1.12 Under review: transpose target shape validation, region-scoped kill reordering (#3677 / #3670)
#3677 moves tl.transpose target shape validation into the TransposeNode constructor, running after NormalizeToAccessRegion, so it also covers direct construction that bypasses the Python wrapper; equality is decided with arith::Analyzer::CanProveEqual rather than comparing Python dimension lists, so (3, n+1) and an independently constructed (n+1, 3) are still accepted, and constant mismatches report the axis number and both lengths. Previously a mismatched target lowered to out-of-bounds indices, producing wrong results or out-of-bounds writes. 13 tests pass on the CPU target. #3670 replaces the leftover scope_level mechanism in shared-memory liveness analysis: that value only increments inside For bodies containing SeqStmt and never increments for While, so it errs in both directions—in the While case the kill point does not cross the back edge, the packer overlaps mutually exclusive regions, and on sm90 measured results double each round; in the sibling-loop case it lets the kill cross the whole region boundary. The new rule computes from the real outer For and While chains and each loop’s contiguous interval, clamping both the out-of-bounds and early-stop directions.
Source: https://github.com/tile-ai/tilelang/pull/3677
1.13 Closed: six compile-time crashes from the fuzzing series (10-26)
On 10-26, six compile-time crash or wrong-code defects from fuzzing were closed in one batch: T.atomic_add on int16 and uint16 targets aborted outright because nvcc has no 16-bit overload (#2572); non-boolean buffer elements used directly as if or assert conditions aborted on an internal is_bool() assertion (#3009); float operands fed to the integer-only div and mod family hit the same internal assertion (#3008); integer widths such as int2 and uint2 outside 1, 4, 8, 16, 32, 64 aborted CUDA codegen (#2996); reduce_max and reduce_min writing into FP8 or FP4 fragments crashed (#2998); and atomic reduction into a whole-buffer destination silently dropped all threads except thread 0 (#2959). The last also received a documentation-side fix (#3340), changing the example’s destination from a whole buffer to a named element so the example stops teaching the wrong pattern.
Source: https://github.com/tile-ai/tilelang/issues/2959
II. Multi-Backend Adaptation (Ascend / Hygon / MetaX)
2.1 Ascend Main Repo: Precise Addressing Interface with Versioned On-Chip Buffers (#3607)
Merged 10-26 10:04, 14 files +982/-26. Adds T.annotate_buffer_addresses, allowing precise byte-level addressing of allocations in the UB, L1, L0A, L0B, L0C, and SS pools within the post-scheduling Ascend pipeline; buffers placed into addressing must first declare a fixed number of versions via T.annotate_buffer_versions. Validation occurs after version expansion and layout completion, covering missing or unsupported version counts, overlaps, misalignment, dynamic sizes, and capacity overflow; the allocator must also reserve space for the SIMT UB context and yield to the AIV private address space, and L0 scale factor handles follow their data allocations. Partial mappings pin only the given ranges, while remaining buffers are placed in aligned free space and may not reuse occupied addresses; pools without addressing annotations retain their original behavior. During subcore projection, only annotations on active storage copies are retained.
Source: https://github.com/tile-ai/tilelang/pull/3607
2.2 Ascend Under Review: Manually Scheduled FlashMLA, BF16 Prefill and FP8 Decode (#3678)
Opened 10-26 19:31, covering BF16 prefill and compact FP8 decode on Ascend 950, including optional FP8 and FP4 extra KV cache, attention sink, invalid indices, and per-query lengths. The attention loop, online softmax, dequantization, and scheduling are all expressed in TileLang, with only small intrinsic header sections wrapping individual hardware instructions. The manual implementation explicitly controls AIC and AIV pipelines and synchronization; the persistent version uses T.Stage plus compiler-managed buffer versions and synchronization, with QK and PV using different layout views of the same L0B storage ring.
Source: https://github.com/tile-ai/tilelang/pull/3678
2.3 Ascend Under Review: Early Rejection of On-Chip Memory Overflow, E4M3 UB-to-L1 Copy, View Layouts and Pointer Units (#3655 / #3639 / #3623)
#3655 makes MergeUBAllocations reject overflow against target physical capacity during lowering: two independent loops each legitimately select two 32 KB L0A slices, and after merging 64 KB exactly fills capacity; previously this emitted pointer offsets past the end of the physical buffer without any size metadata, and now it produces a short diagnostic. #3639 enables E4M3 UB-to-L1 copy: ND inputs are automatically rearranged via the existing scatter and post-copy pipeline, or copied directly into pre-arranged NZ inputs, reusing existing geometry checks and adding FP8 element-size handling to footprint and latency analysis. #3623 makes buffers created by T.view and T.reshape each preserve their own layout, avoiding incorrect Cube mapping or DMA address selection when resolving layouts through shared data variables, and remaps bare pointer offsets in their own element units.
Source: https://github.com/tile-ai/tilelang/pull/3655
2.4 Ascend Under Review: Optional Batch Scheduling, Cross-Core Sync Requires Batch Mode, L0C Dual-Copy Direct Conversion (#3675 / #3614 / #3468)
#3675 adds optional batch scheduling to Ascend (schedmode 1): in normal mode the scheduler launches an operator as soon as the required core resources are partially available, so full-core synchronized operators across multiple streams may interleave; batch mode waits for all resources to be ready before launching as a whole, and must be used for full-core synchronization scenarios; #3614 describes the symptoms and fix for the same mechanism under mode 0. #3468 handles the A5 limitation that FixPipe cannot enable dual-destination mode and quant_pre simultaneously, letting T.dual_copy perform L0C fp32 to f16/bf16 conversion directly, eliminating one Vector conversion, one fp32 UB buffer, and the L0C-to-UB fp32 bandwidth.
Source: https://github.com/tile-ai/tilelang/pull/3675
2.5 Ascend Repo: Installer SHMEM Section Double Fix, Empty-Shell Wheel No Longer Falsely Succeeds (#1943 / #1946)
Two PRs under review point to the same defect (#1728): install_ascend.sh --enable-shmem does not check the return code after build.sh fails and continues to bdist_wheel; the package_data glob matches no files without error, so it produces an empty-shell package containing only __init__.py and reports Successfully installed shmem-1.0.0, only to fail more than twenty lines later at source ../../../install/set_env.sh with “failed to set shmem environment,” misdirecting troubleshooting toward environment configuration. #1946 changes only two things: adds a return-code check to exit immediately, changes set_env.sh to an absolute path based on the script directory, and verifies with a controlled harness that extracts the shmem section verbatim (before the fix, 6 of 10 checks failed and 4 passed; after the fix, all 10 pass). #1943 takes another path: before uninstalling the existing package, it sequentially checks the native build, environment script, wheel build, and wheel existence, adds 10 CPU control-flow tests, and notes that it fixes the installer’s continuation and diagnostics, not the upstream SHMEM compilation failure itself.
Source: https://github.com/tile-ai/tilelang-ascend/pull/1946
2.6 Ascend Repo: W4A4 int4 Matrix Multiply Produces Wrong Results, Root Cause Is Nibble Packing Treated as 1 Byte (#1731)
#1731 updated 10-26, with fairly complete localization and reproduction. The entire C++ template stack derives fractal geometry from sizeof(AscendC::int4b_t) == 1, but this type is nibble-packed, so a 32-byte C0 block correctly holds 64 elements rather than 32; thus all three layers of movement exhibit a twofold deviation: LoadData parameters from L1 to L0A/L0B are computed with the wrong constant, and data stacks at the wrong on-chip positions; the transposed load of the B operand is hard-coded off by load_cbuf_to_cb_s4 and silently drops the flag, so B never gets the nZ layout expected by mad_s4; byte lengths between UB and GM are computed at 1 byte per element, copying twice as much per row and mixing in adjacent rows. The compute instructions themselves are correct, so the symptom is “normal magnitude, all values wrong” (the original report had 99.6% mismatch). The fix all lands in src/tl_templates/ascend/common.h and two transformations, adds a W4A4 example and 10 int4 regressions, and takes the 1024 cube end-to-end from 99.6% mismatch to zero mismatch; the existing gemm_v0 suite (48 items), l1_to_l0 and gm_to_ub (263 items), and elementwise (492 items) all pass.
Source: https://github.com/tile-ai/tilelang-ascend/pull/1731
2.7 Ascend Repo: GM-to-UB Copies with More Than Two Dimensions Fold Leading Dimensions into DMA Rows (#1805)
#1805 fixes #1231. The DMA model of copy_gm_to_ub and copy_ub_to_gm is a 2D rectangle, but AscendCopy::Lower takes only the last two active dimensions of the region as rows and columns; when there are more than two active dimensions, leading dimensions are silently dropped: a 3D block copy A[t:t+16, :, :] (region 16, 4, 8, 512 elements total) is lowered to 4 and 8, the DMA moves only 32 elements, and the remaining 15 tokens of the UB slice are uninitialized, so subsequent computation reads garbage. The fix folds leading dimensions into the DMA row count, changing both directions. On the same day, the Ascend repo also had a batch of documentation fact-check PR updates (sin and cos, axpy, clamp, bitwise series, clear, fill), among which the clamp one also fixes the ineffective lower bound of T.tile.clamp on PTO.
Source: https://github.com/tile-ai/tilelang-ascend/pull/1805
2.8 New Ascend Defect: Cython Wrapper Creates an Analyzer on Every Call, About 0.28 ms (#1945)
Opened 10-26 15:52, with layer-by-layer localization and causal verification from the reporter. CythonKernelWrapper.forward() unconditionally constructs a TVM Analyzer() on every call, with a local median of about 0.28 ms, while it is used only once in the dynamic-shape branch; for static-shape kernels, dynamic_symbolic_map is an empty dict and simplify() never executes. Causal verification replaces the module’s Analyzer global with a stub that throws on any simplify call; all calls still succeed, and total call time drops from 442–467 µs to 104–107 µs, independent of kernel size (1 block and 32 blocks are on the same order). The measured environment is Ascend 910B3 with CANN 9.2.0. This is fixed overhead for inference pipelines with dense small-operator calls and is worth watching for the direction of the fix.
Source: https://github.com/tile-ai/tilelang-ascend/issues/1945
2.9 Hygon: Register Pipeline and Warp Divergence Merged, 28 Files (#18)
Merged 10-26 13:33, 28 files +5312/-64, opened 10-08 and converged over more than two weeks. The change adds a register pipeline to tilelang-hygon that can cooperate with the existing shared-memory pipeline, inserting corresponding commit and barrier instructions per pipeline stage; warp divergence is enabled when the warp count exceeds 4. The author’s conclusion is that example_gemm achieves performance comparable to rocblas. Note also the merge order of #18 in the same repo that day: it merged before #28 and is a large merge of trunk changes into the branch, hence the much larger line count than #28.
Source: https://github.com/tile-ai/tilelang-hygon/pull/18
2.10 Hygon: Native B16 Storage and Dynamic WASP GEMM Merged, Scale Buffer Dual-Bank Under Review (#28 / #29)
#28 merged 10-26 16:23, 6 files +340/-230, three things: preserve the Let parameter emission order of MLS, propagate the GEMM warp partition to matrix storage, and reject packed B16-to-B32 output aliasing; it also makes the WASP dimension dynamic, infers alignment per axis, fixes pong’s K tail filtering, and separates the WASP end-to-end regression from the basic MLS tests. #29 opened 10-26 17:13 and is under review: it plans a dual-bank partition for scale buffer rows separate from LDS banks, so allocation, scale copy, and MMAC lowering share the same row mapping, preserving physical range lifetimes and m0-aligned paging, spreading idle-wave work across two banks, and using it for tiled scaled GEMM under manual warp specialization.
Source: https://github.com/tile-ai/tilelang-hygon/pull/28
2.11 MetaX: Org View Has Push Record, No New Commits in Window on Any of Six Branches (10-26)
The org page shows a push timestamp for tilelang-metax within the window (Beijing time 10-26 15:08), but branch-by-branch checks found no corresponding commit: the default branch main’s latest is still the 2026-09-29 version bump, dev’s latest is a 2026-10-16 merge, the 0.1.14 branch is 2026-09-17, and 0.1.12 and race are earlier; the event stream also has no push event within the window. Accordingly it is treated as “no substantive change,” not counted as an item in this issue, and its nature is not speculated upon. The repo’s most recent official release remains 0.1.15 on 10-16.
Source: https://github.com/tile-ai/tilelang-metax
III. Ecosystem and Adopters (TileOPs / TileFoundry)
3.1 TileOPs: First release still stuck at the last step; artifact remains the 2025-10-09 dev build (#2738)
The first-release tracking issue was updated on 10-26; six of eight cleanup items are done: naming and manifest parameters, packaging and repository files, Python 3.13, public API and extension points, operator behavior conventions, input validation generation, and the docs site. Two items remain: nightly benchmarks (two broken baselines fixed, #2763 merged; new rows pulled above all comparators, cumulative scan changed to a single launch, #2766 merged; the D128 program for GQADenseWithLSEFwdOp, #2774, merged, but the MHA row is still only 0.996 of FA3, so tuning continues) and the release itself (third-party notices, PyPI install docs, developer dependency group, CHANGELOG and release steps #2753, plus the TestPyPI dry run and first tag that require maintainer action). Checking PyPI and the repository: the latest tileops is still 0.0.1.dev2 from 2025-10-09, three versions in total, and the repository has no tags or releases. The first release sits at the last step—”docs ready, artifact not uploaded”—and has stayed there for days.
Source: https://github.com/tile-ai/TileOPs/issues/2738
3.2 TileOPs: D128 dense forward splits keys; prefill-rope drops from 31.04 µs to 17.09 (#2777)
Merged 10-26 22:45, 2 files +527/-124. In the D128 dense call, if a 128-row tile leaves SMs idle, each tile’s keys are split into min(SM count divided by tile count, key steps of the shortest tile) parts, and only when the split can shave two key steps off the longest tile; each part writes an unnormalized fp32 output carrying that row’s scaling max and sum, and the merge kernel weights by the maximum max, so neither cancellation terms nor large logits lose precision. In the tile’s last key step, if a warpgroup’s last needed key falls within the low 64 keys, softmax masks and exponentiates only those 64, and warpgroup 0’s causal diagonal step always hits. On H200 at 1500 MHz, prefill-rope f16 and bf16 drop from 31.04 and 31.01 to 17.09 and 17.09 µs, 2.324× and 2.328× versus FA3; qwen3-8b chunked prefill drops from 31.30 to 17.79. Net +14 test nodes.
Source: https://github.com/tile-ai/TileOPs/pull/2777
3.3 TileOPs: D128 persistent forward rewritten per-thread and writes LSE (#2774)
Merged 10-26 18:22, 2 files +656/-48. Root cause: GQADenseWithLSEFwdOp previously ran on a non-persistent warp-specialized kernel because the persistent kernel rejected return_lse, measuring only 0.73–0.78 of FA3 in nightly benchmarks. This change rewrites the D128 persistent dense forward using TileLang’s per-thread primitives (TMA mapping, mbarrier, WGMMA descriptors, warp shuffle, stmatrix), writes log-sum-exp directly, and serves both GQADenseFwdOp and GQADenseWithLSEFwdOp from one implementation; when all keys and values exceed half of L2, one head’s query blocks are laid out adjacently so concurrent tiles share K and V in L2; each tile’s first QK launches in the previous tile’s epilogue. Public interfaces and manifest unchanged. After merge the MHA row is still 0.996 of FA3, and the tracking issue notes tuning continues—this is a separate optimization line from #2777.
Source: https://github.com/tile-ai/TileOPs/pull/2774
3.4 TileOPs: Fused-add LayerNorm rows split across CTAs; precision defect filed separately (#2768 / #2773)
#2768 merged 10-26 15:45, 5 files +525/-24. The starting point was a nightly benchmark regression (llama-70b decode row from 0.0037 to 0.0044 ms); investigation showed it was not a code change but a tuning reselection: after the tuning key changed, FusedAddLayerNormKernel retuned, and the tuner, timing candidates back-to-back from L2, picked 1024 threads, 19% slower cold than 256 threads. The new FusedAddLayerNormHeldKernel keeps a row (on SM90, one cluster CTA’s share) in registers, splits a row across up to 8 CTAs when that is cheaper on the busiest SM, and picks the block size among whole warp counts that divides the share’s access count; dispatch chooses between “queued rows” and “registers over 255” by mutual rejection, and tuning only offers widths the tuned build’s share can fill, so decode rows cannot be reselected. llama-70b decode is 2.368 µs versus flash-attn’s 4.800. A precision issue exposed by the same change is filed as #2773: fp32 sum-based mean and variance lose precision when rows are far from zero (a row of constant 10000.1 normalizes to about 0.7 instead of the bias), and near 1e36 the sum of squares overflows to all-NaN; the author suggests Welford or a two-pass scaling method.
Source: https://github.com/tile-ai/TileOPs/pull/2768
3.5 TileOPs: Four elementwise and reduction items; clamp bf16 rows 5.9% faster (#2766 / #2767 / #2769 / #2770)
Four merged the same day, all following “find the root cause first.” clamp (#2767) now compares within its own precision; the old implementation widened every element to fp32 and did a NaN check and select per bound, about 5 instructions per element; now one HMNMX2.NAN per pair, 16384-square bf16 from 0.25704 ms to 0.25024, 1.0587× versus torch-compile, verified bit-identical to torch’s fp32 comparison across all 16-bit modes, NaN, ±inf, and signed zero. Cumulative scan (#2766) changes dtype=float32 cumsum and cumprod from “widen to a copy then scan” to a single launch writing the target precision directly; under the hidden-state-f32 workload traffic drops from 112 MiB to 48 MiB, cumprod from 47.36 to 14.62 µs and cumsum from 47.86 to 14.62. GELU multiply (#2769) now evaluates in fp32 via the shared gelu() and rounds once; the old erf path had a NaN select branch, three 16-bit roundings, and a longer dependency chain; the small gated grid’s block count drops from 56 to 14. Binary ops (#2770) raise elements per thread for two-byte operands from 8 to 16, keeping two 16-byte loads in flight, changing 34 default configurations; MinimumFwdOp’s llama-7b row drops from 8.42 to 8.00 µs.
Source: https://github.com/tile-ai/TileOPs/pull/2767
3.6 TileOPs: Alignment check for call tensors moved up to the operator layer, three follow-ups (#2772 / #2778 / #2780)
#2772 merged 10-26 15:28, 55 files +373/-224: before an implementation runs, the executor copies call tensors whose storage start is not 16-byte aligned into aligned storage, copies back the written ones on success, and returns the caller’s tensors; if a copied tensor overlaps another argument (and at least one side is written), it rejects before running, since the copy would mask the kernel’s own checks; storages without an address (fake tensors or wrappers that refuse reads) are not copied; kernel-side alignment and staging logic (including MoE grouped GEMM, causal convolution state, and fused QK-norm RoPE qkv) is removed entirely. The cost is 1–2 percentage points more host time for aligned calls on the hot path, and 4.4 points for MoEPostPermuteFwdOp with out. #2778 folds this decision into the generated observer and lets the plan cache decide copying, with the hot path only reading that decision; the executor’s separate address walk is removed. #2780 opened 10-26: currently only four kernels check out for overlap with inputs, the rest with out race silently, and each check re-reads data_ptr (12 extra times per call for MoEPostPermuteFwdOp); the direction is to declare per-operator in the manifest whether overlap is allowed and check uniformly at the operator layer.
Source: https://github.com/tile-ai/TileOPs/pull/2772
3.7 TileOPs: Three fixes for offset storage, SM90 grouped GEMM and output ABI (#2761 / #2765 / #2762)
#2761 lets the grouped GEMM MMA implementation accept contiguous tensors with offset starts, aligns vector accesses, preserves identity and untouched expert rows when writing results back to offset outputs, and checks overlap before copying; the original implementation failed on such views with a CUDA address misalignment error. Adds 16 regressions covering FP16 and BF16 a, b, bias, and out offsets, with compact and masked layouts. #2765 extends the same capability to SM90 MoE grouped GEMM: when the storage start is not 16-byte aligned, copy a and b and stage out; vector_aligned now states the rule “written tensors are staged and copied back after launch,” BF16 and FP16 MMA kernels use it, and FP8 kernels inherit it from the SM90 FP8 kernel. #2762 fixes the output ABI: when the TVM FFI adapter declares that the callee allocates outputs, hand allocation and return to the TileLang course executor itself, while other adapters keep the original allocation path; the reported regression is that the old implementation failed all 27 Mamba cases on the new build, and the candidate passes on the public call path.
Source: https://github.com/tile-ai/TileOPs/pull/2765
3.8 TileOPs under review: Paged prefill for FP8 queries multiplies value in e4m3 (#2775)
Opened 10-26 17:20, still updated 10-27 07:00. GQAPagedFP8WSKernel moves the FP8 query’s value product into e4m3: the converting warp transposes each value tile into a K-major e4m3 operand (ldmatrix transpose, one byte permute per word, stmatrix), orders keys within each 16 so each thread’s scores are exactly the probabilities it supplies, then rounds probabilities to e4m3 with in-register packing. Softmax follows FA3’s FP8 form: a 2^8 offset keeps small probabilities out of e4m3 subnormals, the row max moves with each larger score, and key tiles are scanned backward from the last. On H200, llama-8b-fp8-prefill drops from 369.3 to 339.8 µs (versus FA3 from 1.000 to 1.087), qwen3-fp8-ragged-odd from 130.9 to 123.9. The author honestly notes the precision tolerance is relaxed from 2^-4 to 2^-3 because e4m3 probabilities themselves carry about half a 2^-4 of rounding, and FA3 also exceeds on such inputs.
Source: https://github.com/tile-ai/TileOPs/pull/2775
3.9 TileOPs under review: GDN prefill for sparse long sequences splits the scan (#2779)
Opened 10-26. On SM89, the sparse long-sequence GDN prefill grid reuses the existing state scan and standalone output program: applicable when inputs are dense, K-major D128, at least 16384 tokens, and state-scan CTAs are no more than a quarter of SM count; other calls keep the original implementation. The decomposition is written into the program cache key, and resident regressions for tail blocks and initial state are added. Measured (CUDA 13, PyTorch 2.13, TileLang 0.1.15): 32768-length bf16 is 1.0384 ms versus FLA’s 1.0656, 65536 is 2.1178 versus 2.1786, while 16384 is still faster in FLA (0.4695 versus 0.4409). The author explicitly states the gain holds only for this set of four value heads, that existing model shapes with eight and sixteen value heads do not take this path, and that the candidate is not universally faster than FLA.
Source: https://github.com/tile-ai/TileOPs/pull/2779
3.10 TileFoundry: Dynamic shared memory sized by the kernel’s actual view (#271)
Opened 10-26 and under review, 12 files +340/-32. The synthesized host entry previously passed dynamic_smem=0 to every TIR kernel, so kernels accessing shared memory via integer TensorView offsets ran without dynamic shared memory and never raised cudaFuncAttributeMaxDynamicSharedMemorySize even above 48 KiB. The author chooses to size by the furthest byte the kernel actually reaches rather than by target capacity, for two reasons: CUDA counts static and dynamic shared memory against the same per-block limit, and this runtime itself holds some static shared memory (ProgramMetaData or shared allocation tensors), so requesting full capacity would fail to launch outright; and the per-block request also determines how many blocks fit on an SM—on sm_89, requesting 99 KiB allows only one block even if only 512 bytes are used. Codegen also now declares smem_base once before the first statement, because in loop_outputs it previously landed inside the first loop’s block and was invisible to the second loop, causing nvcc undefined-identifier errors. Both GPU tests pass on H200 and sm_89; without the patch the former hits illegal memory access and the latter fails to compile.
Source: https://github.com/tile-ai/TileFoundry/pull/271
3.11 TileFoundry: Whole windows emitted as the operand itself; sm_89 GEMM compiles again (#273)
Opened 10-26 and under review, 5 files +54/-24. Code written by schedule finalize for sm_89 GEMM did not compile: lowering wrapped the entire accumulator in a window starting at zero and covering its full length, T.ptr_of(acc[0:0+16, 0:0+8]), and CUDA codegen reports “expected normal source layout” for pointer slices of sharded register tiles; further down, MMA reads register shards as bare slices like lhs_frag_dst[0:0+16, 0:0+32], which likewise has no handling branch. These windows are in fact whole operands. The fix goes into lowering: ConvertHIRToTIR determines once whether a window covers its operand (static-zero start, size equal to operand shape), the three window-construction sites share that determination, and it finally emits T.ptr_of(acc), with MMA reading shards directly. Of 49 schedule fixtures with TIR twins, 29 change their finalize output accordingly; sm_89 GEMM and mesh views compile again, and two wgmma outputs get past the pointer-slice rejection and stop at the next view, which is likewise rejected on main.
Source: https://github.com/tile-ai/TileFoundry/pull/273
3.12 New TileFoundry defect: analysis double-counts shared memory peak and does not propagate it to TIR (#272)
Opened 10-26; the author found it while reviewing #271. Both gaps point to the same consequence: a program that passes analysis is rejected at launch, or the final TIR cannot state how much shared memory it needs. First, the memory analysis compares smem against facts.memory.shared.per_cta (101376 bytes on sm_89), but CUDA applies this limit to static and dynamic shared memory together, and the runtime itself holds 12 bytes of __shared__ ProgramMetaData; this occupancy is written only in runtime.cuh and not told to the analysis, so placements within exactly 12 bytes pass analysis and are rejected at launch. Second, the analysis records the per-CTA shared memory high-water mark in RegionMemoryMetadata.peaks, but ConvertHIRToTIR does not write it into the produced TIR, and PrimFunction.metadata neither prints nor parses it, so it must be recomputed after finalize (#271 does exactly this by scanning all integer-address shared memory views), and a host entry the author writes that requests too little will not be caught before running.
Source: https://github.com/tile-ai/TileFoundry/issues/272
IV. Community, Tutorials, and Events
4.1 Language Services: Experimental CUDA Debugging Goes Live, Integrating cuda-gdb and Nsight (10-26)
tilelang-lsp pushed its first debugging commit on 10-26 at 17:11 (78a5761, titled adding experimental TileLang CUDA debugging). It contains four parts: a new tlsp.debug launcher that performs Python line-number mapping, compiles with -G and -lineinfo, isolates the cache, and captures generated sources; integration of Nsight’s cuda-gdb into VS Code, supporting Python breakpoints, pre-launch checks, and browsing of generated CUDA sources; added unit tests, launch configurations, and optional GPU acceptance tests (covering pending breakpoints, device-side single-stepping, thread inspection, and numeric values); and synchronized updates to the Chinese and English documentation and CI. This is the repository’s first substantive commit since August; the previous last update was the CI test on 8-04.
Source: https://github.com/tile-ai/tilelang-lsp/commit/78a5761404
4.2 Documentation Site: Eight Updates in a Single Day (10-26)
tilelang.github.io pushed eight times within the window (Beijing time 07:32, 10:16, 10:21, 16:51, 17:25, 22:42, 00:08 the next day, 00:16), all with the commit title Update docs, belonging to documentation builds automatically synchronized with merges into the main repository. On the same day there was also one push to a third-party localization repository (tilelang-docs-l10n) and the first content commit to the Chinese RISC-V community hub repository, indicating that the documentation synchronization pipeline is operating normally.
Source: https://github.com/tile-ai/tilelang.github.io
4.3 Four-Part Contribution Process Governance: PR Description Standards, Skipping Backend Tests for Docs-Only Changes, Agent Title Confirmation, Review Bot Noise Reduction (#3671 / #3672 / #3673 / #3674)
Four PRs merged on the same day, all centered on “review cost.” #3671 specifies in CONTRIBUTING.md that a PR description should state the problem, the approach, and the trade-offs; that evidence should be placed next to the claim it supports; that bug fixes should describe the intent and results of before/after behavior or regression tests; and that performance changes should provide comparable measurements and conditions. #3672 lets docs-only PRs skip the CUDA, ROCm, Metal, Ascend, and CuTeDSL builds and tests, by using the checkout of the existing lint job to inspect the merge-base diff and skipping when all changed paths are Markdown, reStructuredText, or under docs/_static/; the whitelist is deliberately narrow, excluding executable examples, build files, and workflows. #3673 adds a confirmation step to the commit skill: once the final diff, verification, and PR description are ready, first show the contributor the proposed title verbatim for them to confirm or replace. #3674 disables the review bot’s automatic summaries and docstring coverage checks, and adds shared review instructions requiring findings to be anchored to the current diff and actual call paths, to distinguish regressions from pre-existing limitations, and to compare against existing implementations before proposing fixes.
Source: https://github.com/tile-ai/tilelang/pull/3672
4.4 New Community Repositories: RISC-V Community Hub, CANN Operator Repository, Hexagon Backend Repository, Debugging Tools Repository (10-26)
Several external developments worth noting appeared within the window. TongmingLAIC/tilelang-riscv was created on 10-23 and pushed on 10-26; it is positioned as the community hub for TileLang on RISC-V, aggregating compiler backends, AI operators, development tools, and documentation. It is still an empty skeleton, but its direction aligns with the demands of the domestic RISC-V AI stack. Atlas-Ascend-Fork/ops-tilelang is the CANN community’s TileLang operator repository for Ascend NPUs, emphasizing unified management of kernel implementations, automated test cases, standard workloads, and performance baselines; it had a push on 10-26. xwhzz/tilelang-hexagon works on a Qualcomm Hexagon backend; the repository is 32 MB and had a push on 10-26. superAngGao/tilelang-debugger is a debugging workspace for source-level localization on H200. There were also routine updates to RuneFang/tvm_tilelang_cookbook (37 stars) and localizethedocs/tilelang-docs-l10n.
Source: https://github.com/TongmingLAIC/tilelang-riscv
4.5 Industry Side: Reports on the Narrowing Ecosystem Gap Between Ascend and DeepSeek (10-26)
On 10-26, media outlets relayed a SemiAnalysis report from 10-22 stating that DeepSeek’s deep collaboration with Ascend is narrowing the gap with NVIDIA in chip hardware and software ecosystems, and predicting that DeepSeek will primarily rely on the Ascend technology stack by 2027 or 2028. The report specifically notes that this judgment came weeks after DeepSeek released software tools for the Ascend ecosystem, including six software modules that correspond one-to-one with NVIDIA platforms. The news itself does not involve functional changes to TileLang; this issue registers it only as ecosystem background: the high-level language compilation tool among these six modules is tilelang-ascend, and the Ascend repository’s installer and int4 matrix multiplication fix that day fall on the same chain.
V. Trend Observations
-
The center of gravity of correctness defects has shifted from “performance regressions” to “not reported at compile time, failing only on specific architectures or memory domains.” All three mainline items that day were of this type: output allocated on the wrong stream (#3649, corrupting only on non-default streams when the current stream has queued work), a TMA cache hint missing a template argument (#3683, failing only on bulk loads with an eviction_policy), and sm8x sparse metadata lacking a fallback (#3335, where only torch’s canonical spelling was recognized, and the wrong fp16 layout convention was applied). What these defects have in common is that they require hardware or parameter preconditions outside normal CI coverage, so they are increasingly driven by the fuzzing series—five of the six closed that day in this chapter came from that series.
-
Synchronization and memory planning have become the main battleground. The three ThreadSync defects in #3680 that surfaced that day, together with the two fixes in #3682 and #3681, the prover fix in tvm fork repository #88, the regionalized kill reordering in main repository #3670, and TileFoundry #272’s shared memory peak not landing in TIR, all point to the same thing: the compiler’s synchronization and memory judgments are shifting from “heuristic” to “provable.” This also explains why #3666 matters—it replaces the built-in TVM with a separately packaged TIRx, after which such prover fixes can enter the mainline on a normal release cadence rather than remaining in the fork repository.
-
Backend adaptation has entered a “precise control” phase. Ascend’s
T.annotate_buffer_addressesallows the UB, L1, L0A, L0B, L0C, and SS pools to be addressed by byte with overlap, alignment, and capacity validation; Hygon’s register pipeline, warp divergence, and dual-bank partitioning of the scale buffer all push “it runs” toward “it can be laid out according to hardware structure.” These capabilities are concentrated in the past two weeks, indicating that domestic backends have passed the usability threshold and are beginning to address performance ceilings. -
Release engineering remains a weak point. TileOPs’s first release, after documentation, manifest, packaging, API stability, and input validation were all ready, has been stuck for days on the TestPyPI dry run and the first tag, with the PyPI artifact still at 2025-10-09. For an operator library with 196 stars and 14 merges that day, installability determines external adoption speed more than another 1 percentage point of optimization; the only unfinished technical item in the tracking issue is MHA row 0.996, and management should not let it continue to block the tag.
-
The external ecosystem is expanding in parallel. The RISC-V community hub repository, the CANN operator repository, and the Hexagon backend repository appeared or were updated on the same day, indicating that TileLang is turning from “a project of the tile-ai organization” into an ecosystem with separate repositories on multiple platforms. For domestic readers, the RISC-V direction is especially worth tracking: it is directly related to the earlier hardware路线 of AI glasses and on-device inference, but it is still only an empty skeleton, and substantive progress will depend on whether runnable operators and backends land later.
Appendix: Sources and Verification Notes
Source Verification Table
| Source | Verification Result |
|---|---|
| GitHub tile-ai organization (29 repos) | 7 repos pushed within the window: tilelang, TileOPs, TileOPs-nightly, tilelang-hygon, tilelang-metax, tilelang-lsp, tilelang.github.io |
| Merged ground truth (is:merged) | 30 entries, each checked individually to confirm merge time falls within the window |
| Open ground truth (is:open updated) | 49 entries, all checked after sorting by update time |
| New issues | 11, each with body text read |
| Closed issues | 12, of which 6 belong to the fuzzing series |
| PyPI (tileops / tilelang) | tileops latest 0.0.1.dev2 (2025-10-09); tilelang latest 0.1.15 (2026-09-30) |
| Release page tag check | TileOPs has no tags and no releases; tilelang latest v0.1.15 (2026-09-30) |
| tilelang-ascend repo | No pushes within the window (last on 10-23), but dense PR and issue activity |
| tilelang-metax repo | Organization view shows a push timestamp, but none of the six branches has commits within the window; treated as no substantive changes |
| Adopters (TileKernels / FlashQLA) | No pushes within the window (10-14) |
| Google News, multiple queries in Chinese and English | No exact hits on TileLang components within 24 hours; one industry-side report, see 4.5 |
| Hacker News | One front-page item within the window, unrelated to TileLang, excluded |
| arXiv | Keyword search found no new papers within the window; the most recent is dated 2026-07-24 |
| Community search of member and adopter repos | Six external repos had pushes within the window, see 4.4 |
Full Source List
- [1] tilelang output allocation by caller stream (#3649) — https://github.com/tile-ai/tilelang/pull/3649
- [2] tilelang NVRTC integration with TVM-FFI (#3285) — https://github.com/tile-ai/tilelang/pull/3285
- [3] tilelang batched TMA cache hint fix (#3683) — https://github.com/tile-ai/tilelang/pull/3683
- [4] tilelang reduction non-finite constants and sub-byte accumulators (#3189) — https://github.com/tile-ai/tilelang/pull/3189
- [5] tilelang SM120 block-scaled GEMM (#3286) — https://github.com/tile-ai/tilelang/pull/3286
- [6] tilelang JIT output-shape scalar parameters (#3602) — https://github.com/tile-ai/tilelang/pull/3602
- [7] tilelang sm8x sparse metadata dtype (#3335) — https://github.com/tile-ai/tilelang/pull/3335
- [8] tilelang DeepSelect Top-K example (#3304) — https://github.com/tile-ai/tilelang/pull/3304
- [9] tilelang TIRx refactor (#3666) — https://github.com/tile-ai/tilelang/pull/3666
- [10] tilelang ThreadSync fence fix (#3682) — https://github.com/tile-ai/tilelang/pull/3682
- [11] tilelang ThreadSync defect report (#3680) — https://github.com/tile-ai/tilelang/issues/3680
- [12] tilelang float32 broadcast address-of (#3681) — https://github.com/tile-ai/tilelang/pull/3681
- [13] tilelang reduction batch adaptation (#3684) — https://github.com/tile-ai/tilelang/pull/3684
- [14] tilelang transpose target shape validation (#3677) — https://github.com/tile-ai/tilelang/pull/3677
- [15] tilelang region-based kill reordering (#3670) — https://github.com/tile-ai/tilelang/pull/3670
- [16] tilelang atomic reduction whole-buffer defect (#2959) — https://github.com/tile-ai/tilelang/issues/2959
- [17] tilelang atomic reduction example fix (#3340) — https://github.com/tile-ai/tilelang/pull/3340
- [18] tilelang Ascend precise buffer addressing (#3607) — https://github.com/tile-ai/tilelang/pull/3607
- [19] tilelang Ascend hand-scheduled FlashMLA (#3678) — https://github.com/tile-ai/tilelang/pull/3678
- [20] tilelang Ascend on-chip memory overflow rejection (#3655) — https://github.com/tile-ai/tilelang/pull/3655
- [21] tilelang Ascend E4M3 UB-to-L1 copy (#3639) — https://github.com/tile-ai/tilelang/pull/3639
- [22] tilelang Ascend view layout and pointer units (#3623) — https://github.com/tile-ai/tilelang/pull/3623
- [23] tilelang Ascend optional batch scheduling (#3675) — https://github.com/tile-ai/tilelang/pull/3675
- [24] tilelang Ascend cross-core sync batch mode (#3614) — https://github.com/tile-ai/tilelang/pull/3614
- [25] tilelang Ascend L0C dual-copy direct transfer (#3468) — https://github.com/tile-ai/tilelang/pull/3468
- [26] tilelang-ascend installer SHMEM fix (#1946) — https://github.com/tile-ai/tilelang-ascend/pull/1946
- [27] tilelang-ascend installer fail-fast (#1943) — https://github.com/tile-ai/tilelang-ascend/pull/1943
- [28] tilelang-ascend W4A4 int4 matmul (#1731) — https://github.com/tile-ai/tilelang-ascend/pull/1731
- [29] tilelang-ascend leading-dimension folding for multi-dim copies (#1805) — https://github.com/tile-ai/tilelang-ascend/pull/1805
- [30] tilelang-ascend per-call wrapper overhead (#1945) — https://github.com/tile-ai/tilelang-ascend/issues/1945
- [31] tilelang-hygon register pipelining (#18) — https://github.com/tile-ai/tilelang-hygon/pull/18
- [32] tilelang-hygon native B16 and dynamic WASP (#28) — https://github.com/tile-ai/tilelang-hygon/pull/28
- [33] tilelang-hygon scale buffer double bank (#29) — https://github.com/tile-ai/tilelang-hygon/pull/29
- [34] tilelang-metax repo — https://github.com/tile-ai/tilelang-metax
- [35] TileOPs first-release tracking issue (#2738) — https://github.com/tile-ai/TileOPs/issues/2738
- [36] TileOPs D128 dense key split (#2777) — https://github.com/tile-ai/TileOPs/pull/2777
- [37] TileOPs D128 persistent LSE write (#2774) — https://github.com/tile-ai/TileOPs/pull/2774
- [38] TileOPs fused add LayerNorm row split (#2768) — https://github.com/tile-ai/TileOPs/pull/2768
- [39] TileOPs LayerNorm precision defect (#2773) — https://github.com/tile-ai/TileOPs/issues/2773
- [40] TileOPs clamp self-precision (#2767) — https://github.com/tile-ai/TileOPs/pull/2767
- [41] TileOPs cumulative scan single launch (#2766) — https://github.com/tile-ai/TileOPs/pull/2766
- [42] TileOPs GELU multiply (#2769) — https://github.com/tile-ai/TileOPs/pull/2769
- [43] TileOPs two-byte binary ops (#2770) — https://github.com/tile-ai/TileOPs/pull/2770
- [44] TileOPs operator-layer alignment (#2772) — https://github.com/tile-ai/TileOPs/pull/2772
- [45] TileOPs alignment check moved into observer (#2778) — https://github.com/tile-ai/TileOPs/pull/2778
- [46] TileOPs output overlap declaration (#2780) — https://github.com/tile-ai/TileOPs/issues/2780
- [47] TileOPs grouped GEMM offset storage (#2761) — https://github.com/tile-ai/TileOPs/pull/2761
- [48] TileOPs SM90 MoE offset storage (#2765) — https://github.com/tile-ai/TileOPs/pull/2765
- [49] TileOPs output ABI (#2762) — https://github.com/tile-ai/TileOPs/pull/2762
- [50] TileOPs FP8 paged prefill e4m3 (#2775) — https://github.com/tile-ai/TileOPs/pull/2775
- [51] TileOPs sparse long GDN prefill (#2779) — https://github.com/tile-ai/TileOPs/pull/2779
- [52] TileFoundry dynamic shared memory sizing (#271) — https://github.com/tile-ai/TileFoundry/pull/271
- [53] TileFoundry whole-window dispatch by operand (#273) — https://github.com/tile-ai/TileFoundry/pull/273
- [54] TileFoundry shared memory analysis gap (#272) — https://github.com/tile-ai/TileFoundry/issues/272
- [55] tilelang-lsp CUDA debugging commit — https://github.com/tile-ai/tilelang-lsp/commit/78a5761404
- [56] tilelang documentation site — https://github.com/tile-ai/tilelang.github.io
- [57] tilelang PR description guidelines (#3671) — https://github.com/tile-ai/tilelang/pull/3671
- [58] tilelang skip backend tests for docs-only PRs (#3672) — https://github.com/tile-ai/tilelang/pull/3672
- [59] tilelang Agent title confirmation (#3673) — https://github.com/tile-ai/tilelang/pull/3673
- [60] tilelang review bot noise reduction (#3674) — https://github.com/tile-ai/tilelang/pull/3674
- [61] tile-ai/tvm Z3 boolean bitwise ops (#88) — https://github.com/tile-ai/tvm/pull/88
- [62] tilelang-riscv community hub repo — https://github.com/TongmingLAIC/tilelang-riscv
- [63] CANN community ops-tilelang repo — https://github.com/Atlas-Ascend-Fork/ops-tilelang
- [64] tilelang-hexagon backend repo — https://github.com/xwhzz/tilelang-hexagon
- [65] PyPI tileops — https://pypi.org/project/tileops/
- [66] Ascend and DeepSeek ecosystem report — https://www.scmp.com/tech/tech-war/article/3371806/jensens-nightmare-huawei-deepseek-narrow-ai-chip-ecosystem-gap-nvidia-report