Problem
60 repros emit 2-3 kernels for the pattern:
permute_default = permute(x, [1, 0]) # weight grad [N, C] → [C, N]
sum_dim_int_list = sum(x, dim=[0]) # bias grad [N, C] → [C]
Both read the same large input. Current approach reads it twice (once per kernel). Fused kernel reads once, writes both outputs.
Verified Speedup
1.69x — fused Triton kernel hits 99% of memcopy SOL (0.103ms vs 0.174ms for torch.compile on f32[25216, 3072]).
Prototype: bench_fused_transpose_sum.py — tiles [64,64], uses tl.trans() for coalesced transpose write + tl.atomic_add for partial sum accumulation.
Root Cause in Inductor
The scheduler blocker is tiling_prevents_reduction_fusion at simd.py:1458-1470. select_tiling is called on the permute as a purely pointwise op (reduction_numel=1), returning a 2-tuple. The check expects a 3-tuple with r0_: 1 suffix.
However, initial attempt to add (numel2, rnumel2) to the accepted set didn't reduce kernel count — there may be an earlier rejection. Needs debug tracing through can_fuse to find the actual blocker.
Key Insight
The transpose store can happen INSIDE the reduction loop body. Each tile loaded for the reduction also gets written transposed. fits_in_main_body (simd.py:1493) already supports pointwise stores inside reduction loops when node_numel == numel * rnumel. The scheduler just needs to recognize the permute qualifies.
Impact
60 repros, tensors up to 6.6GB. Saves one full memory pass per repro.
Repros from #26
85 repros from the finalized #26 checklist.
sum_sum_sum_d06bf12e10d0 — 28 kernels, 1.72x gap, 2617MB
sum_sum_sum_55426f9a4493 — 28 kernels, 1.72x gap, 2483MB
sum_sum_4bd81dea302d — 9 kernels, 3.30x gap, 126MB
sum_sum_sum_8d668b8fcd9e — 7 kernels, 3.14x gap, 1617MB
sum_sum_sum_1d1edd983280 — 7 kernels, 3.12x gap, 1617MB
sum_sum_sum_83ddb84cc830 — 7 kernels, 2.88x gap, 403MB
sum_sum_sum_9e7a546b859f — 7 kernels, 1.92x gap, 101MB
sum_sum_sum_64f701d26f0a — 6 kernels, 2.98x gap, 388MB
sum_sum_sum_e2388f04f7c2 — 6 kernels, 2.68x gap, 264MB
sum_sum_sum_4fdc0c9d691f — 6 kernels, 2.68x gap, 19MB
sum_c2895e89552b — 6 kernels, 2.66x gap, 138MB
sum_12b455c3b1b0 — 6 kernels, 2.61x gap, 25MB
sum_sum_sum_5c7c5e63becb — 6 kernels, 2.42x gap, 89MB
sum_sum_sum_a9940aaceefe — 6 kernels, 2.11x gap, 220MB
sum_5eec4697d8ff — 5 kernels, 2.60x gap, 72MB
sum_sum_sum_9814418db3a9 — 5 kernels, 2.58x gap, 206MB
sum_79c6d0673ca2 — 5 kernels, 2.48x gap, 41MB
sum_sum_sum_580d823755af — 5 kernels, 2.47x gap, 206MB
sum_1457ecad8f5c — 5 kernels, 2.37x gap, 189MB
sum_sum_sum_6107a2f54029 — 4 kernels, 5.86x gap, 824MB
sum_sum_sum_dc96c4651516 — 4 kernels, 5.76x gap, 824MB
sum_sum_sum_48033561d121 — 4 kernels, 3.44x gap, 227MB
sum_sum_sum_1b02daac4062 — 4 kernels, 3.35x gap, 103MB
sum_sum_sum_da376d09d2cb — 4 kernels, 3.34x gap, 103MB
sum_sum_sum_81b1543349e5 — 4 kernels, 3.33x gap, 103MB
sum_sum_sum_3213336f4c0b — 4 kernels, 3.22x gap, 157MB
sum_fd44d96c0b10 — 4 kernels, 3.11x gap, 164MB
sum_86b5dc92d54f — 4 kernels, 2.66x gap, 41MB
sum_sum_sum_f2c6042682bc — 3 kernels, 4.25x gap, 76MB
sum_sum_sum_1d10e6314ef6 — 3 kernels, 3.22x gap, 107MB
sum_sum_sum_cb22a50c0d9f — 3 kernels, 3.04x gap, 214MB
sum_sum_sum_559e754b2ff4 — 3 kernels, 2.74x gap, 15MB
sum_sum_sum_e2d4961f3571 — 3 kernels, 2.73x gap, 202MB
sum_sum_sum_69414585b76b — 3 kernels, 2.66x gap, 214MB
sum_sum_sum_97999676281e — 3 kernels, 2.14x gap, 312MB
sum_sum_sum_1c9995bc990f — 3 kernels, 2.09x gap, 214MB
sum_sum_sum_728df9734dbe — 3 kernels, 2.02x gap, 6MB
sum_13195092a57b — 3 kernels, 2.01x gap, 37MB
sum_sum_sum_baf315cfc5f0 — 3 kernels, 2.00x gap, 201MB
sum_sum_sum_59e022113eeb — 3 kernels, 2.00x gap, 403MB
sum_66b92a2b30bb — 3 kernels, 1.98x gap, 37MB
sum_sum_sum_766837223ded — 3 kernels, 1.98x gap, 2MB
sum_cfe874779dd6 — 3 kernels, 1.93x gap, 3294MB
sum_sum_75ee5fc5ea19 — 3 kernels, 1.91x gap, 16003MB
sum_cb19b2c26400 — 3 kernels, 1.74x gap, 13MB
sum_046be72c7ad9 — 3 kernels, 1.72x gap, 6589MB
sum_60071d2e71f2 — 3 kernels, 1.70x gap, 6MB
sum_d657e5a1c5df — 3 kernels, 1.70x gap, 14MB
sum_0568508d372d — 3 kernels, 1.67x gap, 50MB
sum_a630880e528a — 3 kernels, 1.67x gap, 780KB
sum_2821c003f795 — 3 kernels, 1.64x gap, 42MB
sum_27f326f22f76 — 3 kernels, 1.62x gap, 129KB
sum_df75f19c9c7a — 3 kernels, 1.61x gap, 188KB
sum_31bf563cdf96 — 3 kernels, 1.59x gap, 465MB
sum_f160d1f03c1f — 3 kernels, 1.58x gap, 465MB
sum_sum_sum_b42d335bef54 — 3 kernels, 1.55x gap, 82MB
sum_587e52500b08 — 3 kernels, 1.55x gap, 467MB
sum_558522245da0 — 3 kernels, 1.55x gap, 467MB
sum_51676b1433c8 — 3 kernels, 1.52x gap, 403MB
sum_7f12bfc45e1a — 3 kernels, 1.52x gap, 403MB
sum_7c50e5b80bfe — 3 kernels, 1.52x gap, 8KB
sum_7953a8b0bbba — 3 kernels, 1.49x gap, 12MB
sum_2bcc7099936f — 3 kernels, 1.47x gap, 302MB
sum_6080543764bd — 3 kernels, 1.44x gap, 4MB
sum_bd2fed913c26 — 3 kernels, 1.44x gap, 101MB
sum_33b494a50932 — 3 kernels, 1.43x gap, 302MB
sum_ab7572b27d2c — 3 kernels, 1.43x gap, 101MB
sum_214ee1a84aa5 — 3 kernels, 1.43x gap, 101MB
sum_b8db5e701976 — 3 kernels, 1.41x gap, 101MB
sum_426d5bebb63f — 3 kernels, 1.40x gap, 930MB
sum_196d0dc5c868 — 3 kernels, 1.39x gap, 101MB
sum_62dca72fabd1 — 3 kernels, 1.35x gap, 50MB
sum_f95857722916 — 3 kernels, 1.33x gap, 654MB
sum_6295c187c71d — 3 kernels, 1.31x gap, 50MB
sum_fe2660cedc0a — 3 kernels, 1.30x gap, 214MB
sum_80634958a126 — 3 kernels, 1.24x gap, 336MB
sum_sum_7af057233a52 — 2 kernels, 2.78x gap, 78MB
sum_sum_f4d29f9ee6ad — 2 kernels, 1.70x gap, 3933MB
sum_sum_666d023699ba — 2 kernels, 1.51x gap, 1475MB
sum_096e9f1570b5 — 2 kernels, 1.46x gap, 13MB
sum_sum_cb1e4e3e8236 — 2 kernels, 1.44x gap, 2857MB
sum_sum_c769ee8f5293 — 2 kernels, 1.41x gap, 692MB
sum_b57af4bf1f43 — 2 kernels, 1.39x gap, 94MB
sum_sum_sum_34c857ab7db3 — 2 kernels, 1.18x gap, 3758MB
sum_34445852895e — 2 kernels, 0.94x gap, 67MB
Problem
60 repros emit 2-3 kernels for the pattern:
Both read the same large input. Current approach reads it twice (once per kernel). Fused kernel reads once, writes both outputs.
Verified Speedup
1.69x — fused Triton kernel hits 99% of memcopy SOL (0.103ms vs 0.174ms for torch.compile on f32[25216, 3072]).
Prototype:
bench_fused_transpose_sum.py— tiles [64,64], usestl.trans()for coalesced transpose write +tl.atomic_addfor partial sum accumulation.Root Cause in Inductor
The scheduler blocker is
tiling_prevents_reduction_fusionatsimd.py:1458-1470.select_tilingis called on the permute as a purely pointwise op (reduction_numel=1), returning a 2-tuple. The check expects a 3-tuple withr0_: 1suffix.However, initial attempt to add
(numel2, rnumel2)to the accepted set didn't reduce kernel count — there may be an earlier rejection. Needs debug tracing throughcan_fuseto find the actual blocker.Key Insight
The transpose store can happen INSIDE the reduction loop body. Each tile loaded for the reduction also gets written transposed.
fits_in_main_body(simd.py:1493) already supports pointwise stores inside reduction loops whennode_numel == numel * rnumel. The scheduler just needs to recognize the permute qualifies.Impact
60 repros, tensors up to 6.6GB. Saves one full memory pass per repro.
Repros from #26
85 repros from the finalized #26 checklist.
sum_sum_sum_d06bf12e10d0— 28 kernels, 1.72x gap, 2617MBsum_sum_sum_55426f9a4493— 28 kernels, 1.72x gap, 2483MBsum_sum_4bd81dea302d— 9 kernels, 3.30x gap, 126MBsum_sum_sum_8d668b8fcd9e— 7 kernels, 3.14x gap, 1617MBsum_sum_sum_1d1edd983280— 7 kernels, 3.12x gap, 1617MBsum_sum_sum_83ddb84cc830— 7 kernels, 2.88x gap, 403MBsum_sum_sum_9e7a546b859f— 7 kernels, 1.92x gap, 101MBsum_sum_sum_64f701d26f0a— 6 kernels, 2.98x gap, 388MBsum_sum_sum_e2388f04f7c2— 6 kernels, 2.68x gap, 264MBsum_sum_sum_4fdc0c9d691f— 6 kernels, 2.68x gap, 19MBsum_c2895e89552b— 6 kernels, 2.66x gap, 138MBsum_12b455c3b1b0— 6 kernels, 2.61x gap, 25MBsum_sum_sum_5c7c5e63becb— 6 kernels, 2.42x gap, 89MBsum_sum_sum_a9940aaceefe— 6 kernels, 2.11x gap, 220MBsum_5eec4697d8ff— 5 kernels, 2.60x gap, 72MBsum_sum_sum_9814418db3a9— 5 kernels, 2.58x gap, 206MBsum_79c6d0673ca2— 5 kernels, 2.48x gap, 41MBsum_sum_sum_580d823755af— 5 kernels, 2.47x gap, 206MBsum_1457ecad8f5c— 5 kernels, 2.37x gap, 189MBsum_sum_sum_6107a2f54029— 4 kernels, 5.86x gap, 824MBsum_sum_sum_dc96c4651516— 4 kernels, 5.76x gap, 824MBsum_sum_sum_48033561d121— 4 kernels, 3.44x gap, 227MBsum_sum_sum_1b02daac4062— 4 kernels, 3.35x gap, 103MBsum_sum_sum_da376d09d2cb— 4 kernels, 3.34x gap, 103MBsum_sum_sum_81b1543349e5— 4 kernels, 3.33x gap, 103MBsum_sum_sum_3213336f4c0b— 4 kernels, 3.22x gap, 157MBsum_fd44d96c0b10— 4 kernels, 3.11x gap, 164MBsum_86b5dc92d54f— 4 kernels, 2.66x gap, 41MBsum_sum_sum_f2c6042682bc— 3 kernels, 4.25x gap, 76MBsum_sum_sum_1d10e6314ef6— 3 kernels, 3.22x gap, 107MBsum_sum_sum_cb22a50c0d9f— 3 kernels, 3.04x gap, 214MBsum_sum_sum_559e754b2ff4— 3 kernels, 2.74x gap, 15MBsum_sum_sum_e2d4961f3571— 3 kernels, 2.73x gap, 202MBsum_sum_sum_69414585b76b— 3 kernels, 2.66x gap, 214MBsum_sum_sum_97999676281e— 3 kernels, 2.14x gap, 312MBsum_sum_sum_1c9995bc990f— 3 kernels, 2.09x gap, 214MBsum_sum_sum_728df9734dbe— 3 kernels, 2.02x gap, 6MBsum_13195092a57b— 3 kernels, 2.01x gap, 37MBsum_sum_sum_baf315cfc5f0— 3 kernels, 2.00x gap, 201MBsum_sum_sum_59e022113eeb— 3 kernels, 2.00x gap, 403MBsum_66b92a2b30bb— 3 kernels, 1.98x gap, 37MBsum_sum_sum_766837223ded— 3 kernels, 1.98x gap, 2MBsum_cfe874779dd6— 3 kernels, 1.93x gap, 3294MBsum_sum_75ee5fc5ea19— 3 kernels, 1.91x gap, 16003MBsum_cb19b2c26400— 3 kernels, 1.74x gap, 13MBsum_046be72c7ad9— 3 kernels, 1.72x gap, 6589MBsum_60071d2e71f2— 3 kernels, 1.70x gap, 6MBsum_d657e5a1c5df— 3 kernels, 1.70x gap, 14MBsum_0568508d372d— 3 kernels, 1.67x gap, 50MBsum_a630880e528a— 3 kernels, 1.67x gap, 780KBsum_2821c003f795— 3 kernels, 1.64x gap, 42MBsum_27f326f22f76— 3 kernels, 1.62x gap, 129KBsum_df75f19c9c7a— 3 kernels, 1.61x gap, 188KBsum_31bf563cdf96— 3 kernels, 1.59x gap, 465MBsum_f160d1f03c1f— 3 kernels, 1.58x gap, 465MBsum_sum_sum_b42d335bef54— 3 kernels, 1.55x gap, 82MBsum_587e52500b08— 3 kernels, 1.55x gap, 467MBsum_558522245da0— 3 kernels, 1.55x gap, 467MBsum_51676b1433c8— 3 kernels, 1.52x gap, 403MBsum_7f12bfc45e1a— 3 kernels, 1.52x gap, 403MBsum_7c50e5b80bfe— 3 kernels, 1.52x gap, 8KBsum_7953a8b0bbba— 3 kernels, 1.49x gap, 12MBsum_2bcc7099936f— 3 kernels, 1.47x gap, 302MBsum_6080543764bd— 3 kernels, 1.44x gap, 4MBsum_bd2fed913c26— 3 kernels, 1.44x gap, 101MBsum_33b494a50932— 3 kernels, 1.43x gap, 302MBsum_ab7572b27d2c— 3 kernels, 1.43x gap, 101MBsum_214ee1a84aa5— 3 kernels, 1.43x gap, 101MBsum_b8db5e701976— 3 kernels, 1.41x gap, 101MBsum_426d5bebb63f— 3 kernels, 1.40x gap, 930MBsum_196d0dc5c868— 3 kernels, 1.39x gap, 101MBsum_62dca72fabd1— 3 kernels, 1.35x gap, 50MBsum_f95857722916— 3 kernels, 1.33x gap, 654MBsum_6295c187c71d— 3 kernels, 1.31x gap, 50MBsum_fe2660cedc0a— 3 kernels, 1.30x gap, 214MBsum_80634958a126— 3 kernels, 1.24x gap, 336MBsum_sum_7af057233a52— 2 kernels, 2.78x gap, 78MBsum_sum_f4d29f9ee6ad— 2 kernels, 1.70x gap, 3933MBsum_sum_666d023699ba— 2 kernels, 1.51x gap, 1475MBsum_096e9f1570b5— 2 kernels, 1.46x gap, 13MBsum_sum_cb1e4e3e8236— 2 kernels, 1.44x gap, 2857MBsum_sum_c769ee8f5293— 2 kernels, 1.41x gap, 692MBsum_b57af4bf1f43— 2 kernels, 1.39x gap, 94MBsum_sum_sum_34c857ab7db3— 2 kernels, 1.18x gap, 3758MBsum_34445852895e— 2 kernels, 0.94x gap, 67MB