Skip to content

CUDA: HIP: rms_norm: add variants that load float4 at a time and store x in registers - #29720

Open
IMbackK wants to merge 2 commits into
ggml-org:masterfrom
IMbackK:rms_norm_opt
Open

IMbackK wants to merge 2 commits into
ggml-org:masterfrom
IMbackK:rms_norm_opt

Conversation

@IMbackK

@IMbackK IMbackK commented Sep 30, 2026

Copy link
Copy Markdown
Contributor

Overview

While profiling gemma4 on mi100 at batch 1 decode i noticed that the rms_norm kernels where takeing a large amount of time, relative to mem bandwidth, so i gave float4 loads a try. On the way i noticed that x fits into registers here, which might help on cdna/gcn too since its caches are puny.

Additional information

Benchmarks (benefits mostly on CDNA, RDNA more neutral)

GPU-f980f88ef31631a2

GPU Model Microbatch size Test t/s master t/s rms_norm_opt Speedup
MI100 gemma4 26B.A4B Q6_K 1 pp128 101.17 108.08 1.07
MI100 gemma4 26B.A4B Q6_K 2 pp128 155.74 174.74 1.12
MI100 gemma4 26B.A4B Q6_K 8 pp128 261.62 282.84 1.08
MI100 gemma4 26B.A4B Q6_K 64 pp1024 597.61 602.62 1.01
MI100 gemma4 26B.A4B Q6_K 512 pp1024 1848.74 1868.44 1.01
MI100 gpt-oss 20B MXFP4 MoE 1 pp128 158.46 178.38 1.13
MI100 gpt-oss 20B MXFP4 MoE 2 pp128 226.22 254.74 1.13
MI100 gpt-oss 20B MXFP4 MoE 8 pp128 329.57 338.49 1.03
MI100 gpt-oss 20B MXFP4 MoE 64 pp1024 945.78 956.21 1.01
MI100 gpt-oss 20B MXFP4 MoE 512 pp1024 2809.47 2760.06 0.98
MI100 granite 3B Q5_1 1 pp128 140.95 157.54 1.12
MI100 granite 3B Q5_1 2 pp128 244.32 263.28 1.08
MI100 granite 3B Q5_1 8 pp128 590.01 605.74 1.03
MI100 granite 3B Q5_1 64 pp1024 2245.76 2258.99 1.01
MI100 granite 3B Q5_1 128 pp1024 2978.96 2984.18 1.00
MI100 granite 3B Q5_1 512 pp1024 3637.62 3674.59 1.01
MI100 granite 3B Q8_0 1 pp128 117.93 135.40 1.15
MI100 granite 3B Q8_0 2 pp128 208.35 246.47 1.18
MI100 granite 3B Q8_0 8 pp128 584.50 604.27 1.03
MI100 granite 3B Q8_0 64 pp1024 2414.11 2419.59 1.00
MI100 granite 3B Q8_0 512 pp1024 5445.90 5502.53 1.01
MI100 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 1 pp128 175.80 176.91 1.01
MI100 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 2 pp128 280.89 286.53 1.02
MI100 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 8 pp128 576.29 587.63 1.02
MI100 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 64 pp1024 2662.60 2670.90 1.00
MI100 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 128 pp1024 3695.46 3688.00 1.00
MI100 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 512 pp1024 3094.16 3123.87 1.01
MI100 granitemoe 3B.A800M Q5_K_S 1 pp128 195.08 199.09 1.02
MI100 granitemoe 3B.A800M Q5_K_S 2 pp128 337.50 348.56 1.03
MI100 granitemoe 3B.A800M Q5_K_S 8 pp128 584.63 600.09 1.03
MI100 granitemoe 3B.A800M Q5_K_S 64 pp1024 2800.80 2834.15 1.01
MI100 granitemoe 3B.A800M Q5_K_S 512 pp1024 3361.49 3411.18 1.01
MI100 lfm2moe 8B.A1B F16 1 pp128 189.25 195.92 1.04
MI100 lfm2moe 8B.A1B F16 2 pp128 238.09 243.92 1.02
MI100 lfm2moe 8B.A1B F16 8 pp128 290.79 323.09 1.11
MI100 lfm2moe 8B.A1B F16 64 pp1024 2198.20 2238.10 1.02
MI100 lfm2moe 8B.A1B F16 512 pp1024 6462.09 6623.95 1.03
MI100 lfm2moe 8B.A1B Q4_0 1 pp128 344.78 358.10 1.04
MI100 lfm2moe 8B.A1B Q4_0 2 pp128 528.28 540.33 1.02
MI100 lfm2moe 8B.A1B Q4_0 8 pp128 749.02 762.07 1.02
MI100 lfm2moe 8B.A1B Q4_0 64 pp1024 1798.66 1803.24 1.00
MI100 lfm2moe 8B.A1B Q4_0 512 pp1024 4702.06 4748.67 1.01
MI100 lfm2moe 8B.A1B Q4_K_M 1 pp128 302.36 310.66 1.03
MI100 lfm2moe 8B.A1B Q4_K_M 2 pp128 461.59 476.18 1.03
MI100 lfm2moe 8B.A1B Q4_K_M 8 pp128 645.75 656.30 1.02
MI100 lfm2moe 8B.A1B Q4_K_M 64 pp1024 1694.27 1682.08 0.99
MI100 lfm2moe 8B.A1B Q4_K_M 512 pp1024 5050.00 5041.70 1.00
MI100 lfm2moe 8B.A1B Q5_K_M 1 pp128 286.07 285.42 1.00
MI100 lfm2moe 8B.A1B Q5_K_M 2 pp128 429.22 434.11 1.01
MI100 lfm2moe 8B.A1B Q5_K_M 8 pp128 589.03 594.58 1.01
MI100 lfm2moe 8B.A1B Q5_K_M 64 pp1024 1844.53 1846.41 1.00
MI100 lfm2moe 8B.A1B Q5_K_M 512 pp1024 4949.62 4970.34 1.00
MI100 lfm2moe 8B.A1B Q6_K 1 pp128 274.04 275.94 1.01
MI100 lfm2moe 8B.A1B Q6_K 2 pp128 410.51 420.80 1.03
MI100 lfm2moe 8B.A1B Q6_K 8 pp128 559.99 563.94 1.01
MI100 lfm2moe 8B.A1B Q6_K 64 pp1024 1300.22 1284.46 0.99
MI100 lfm2moe 8B.A1B Q6_K 512 pp1024 4753.56 4736.70 1.00
MI100 lfm2moe 8B.A1B Q8_0 1 pp128 286.30 290.57 1.01
MI100 lfm2moe 8B.A1B Q8_0 2 pp128 417.42 419.93 1.01
MI100 lfm2moe 8B.A1B Q8_0 8 pp128 605.91 608.64 1.00
MI100 lfm2moe 8B.A1B Q8_0 64 pp1024 1795.30 1817.84 1.01
MI100 lfm2moe 8B.A1B Q8_0 512 pp1024 4980.17 5082.34 1.02
MI100 llama 8B Q2_K_M 1 pp128 107.29 108.63 1.01
MI100 llama 8B Q2_K_M 2 pp128 163.59 164.44 1.01
MI100 llama 8B Q2_K_M 8 pp128 442.12 441.98 1.00
MI100 llama 8B Q2_K_M 64 pp1024 1306.26 1311.59 1.00
MI100 llama 8B Q2_K_M 512 pp1024 2997.01 3010.55 1.00
MI100 llama 8B Q3_K_M 1 pp128 105.40 107.03 1.02
MI100 llama 8B Q3_K_M 2 pp128 170.83 173.89 1.02
MI100 llama 8B Q3_K_M 8 pp128 460.01 464.84 1.01
MI100 llama 8B Q3_K_M 64 pp1024 1560.34 1574.24 1.01
MI100 llama 8B Q3_K_M 512 pp1024 3044.69 3057.94 1.00
MI100 llama 8B Q4_0 1 pp128 113.46 130.34 1.15
MI100 llama 8B Q4_0 2 pp128 203.29 220.98 1.09
MI100 llama 8B Q4_0 8 pp128 499.19 508.50 1.02
MI100 llama 8B Q4_0 64 pp1024 1704.37 1702.44 1.00
MI100 llama 8B Q4_0 512 pp1024 2158.64 2168.77 1.00
MI100 llama 8B Q4_K_M 1 pp128 104.17 113.45 1.09
MI100 llama 8B Q4_K_M 2 pp128 173.14 182.06 1.05
MI100 llama 8B Q4_K_M 8 pp128 486.00 490.40 1.01
MI100 llama 8B Q4_K_M 64 pp1024 1566.90 1574.75 1.01
MI100 llama 8B Q4_K_M 512 pp1024 2985.96 3036.26 1.02
MI100 llama 8B Q5_K_M 1 pp128 92.33 101.65 1.10
MI100 llama 8B Q5_K_M 2 pp128 155.91 166.25 1.07
MI100 llama 8B Q5_K_M 8 pp128 448.88 461.49 1.03
MI100 llama 8B Q5_K_M 64 pp1024 1643.13 1632.86 0.99
MI100 llama 8B Q5_K_M 512 pp1024 3010.02 3016.53 1.00
MI100 llama 8B Q6_K 1 pp128 83.13 92.41 1.11
MI100 llama 8B Q6_K 2 pp128 142.96 155.54 1.09
MI100 llama 8B Q6_K 8 pp128 356.98 361.06 1.01
MI100 llama 8B Q6_K 64 pp1024 1227.50 1228.76 1.00
MI100 llama 8B Q6_K 512 pp1024 2987.58 2994.51 1.00
MI100 llama 8B Q8_0 1 pp128 79.25 81.56 1.03
MI100 llama 8B Q8_0 2 pp128 139.51 142.94 1.02
MI100 llama 8B Q8_0 8 pp128 364.49 405.30 1.11
MI100 llama 8B Q8_0 64 pp1024 1679.07 1691.45 1.01
MI100 llama 8B Q8_0 512 pp1024 3384.47 3406.50 1.01
MI100 qwen35 27B Q5_K_M 1 pp128 24.80 27.05 1.09
MI100 qwen35 27B Q5_K_M 2 pp128 43.28 44.77 1.03
MI100 qwen35 27B Q5_K_M 8 pp128 111.81 118.92 1.06
MI100 qwen35 27B Q5_K_M 64 pp1024 406.73 408.75 1.00
MI100 qwen35 27B Q5_K_M 512 pp1024 620.57 623.69 1.01

GPU-86308d5dff4ce29e

GPU Model Microbatch size Test t/s master t/s rms_norm_opt Speedup
RX 7900 XTX gemma4 26B.A4B Q6_K 1 pp128 109.30 111.56 1.02
RX 7900 XTX gemma4 26B.A4B Q6_K 2 pp128 212.18 215.14 1.01
RX 7900 XTX gemma4 26B.A4B Q6_K 8 pp128 486.64 492.53 1.01
RX 7900 XTX gemma4 26B.A4B Q6_K 64 pp1024 1685.94 1689.53 1.00
RX 7900 XTX gemma4 26B.A4B Q6_K 512 pp1024 3516.67 3629.88 1.03
RX 7900 XTX gpt-oss 20B MXFP4 MoE 1 pp128 205.33 204.58 1.00
RX 7900 XTX gpt-oss 20B MXFP4 MoE 2 pp128 318.96 319.25 1.00
RX 7900 XTX gpt-oss 20B MXFP4 MoE 8 pp128 682.91 684.51 1.00
RX 7900 XTX gpt-oss 20B MXFP4 MoE 64 pp1024 2170.03 2175.33 1.00
RX 7900 XTX gpt-oss 20B MXFP4 MoE 512 pp1024 4806.00 4952.74 1.03
RX 7900 XTX granite 3B Q5_1 1 pp128 173.19 173.97 1.00
RX 7900 XTX granite 3B Q5_1 2 pp128 293.75 297.82 1.01
RX 7900 XTX granite 3B Q5_1 8 pp128 903.89 922.31 1.02
RX 7900 XTX granite 3B Q5_1 64 pp1024 3195.87 3162.51 0.99
RX 7900 XTX granite 3B Q5_1 512 pp1024 6131.58 6148.37 1.00
RX 7900 XTX granite 3B Q8_0 1 pp128 142.87 143.11 1.00
RX 7900 XTX granite 3B Q8_0 2 pp128 274.27 275.64 1.01
RX 7900 XTX granite 3B Q8_0 8 pp128 889.88 891.30 1.00
RX 7900 XTX granite 3B Q8_0 64 pp1024 3617.55 3644.76 1.01
RX 7900 XTX granite 3B Q8_0 512 pp1024 6701.25 6708.55 1.00
RX 7900 XTX granitemoe 3B.A800M IQ3_S - 3.4375 bpw 1 pp128 199.41 219.66 1.10
RX 7900 XTX granitemoe 3B.A800M IQ3_S - 3.4375 bpw 2 pp128 391.10 392.05 1.00
RX 7900 XTX granitemoe 3B.A800M IQ3_S - 3.4375 bpw 8 pp128 1006.24 1001.33 1.00
RX 7900 XTX granitemoe 3B.A800M IQ3_S - 3.4375 bpw 64 pp1024 3773.66 3654.24 0.97
RX 7900 XTX granitemoe 3B.A800M IQ3_S - 3.4375 bpw 512 pp1024 10613.04 10663.31 1.00
RX 7900 XTX granitemoe 3B.A800M Q5_K_S 1 pp128 220.86 240.54 1.09
RX 7900 XTX granitemoe 3B.A800M Q5_K_S 2 pp128 453.07 455.71 1.01
RX 7900 XTX granitemoe 3B.A800M Q5_K_S 8 pp128 1103.16 1104.33 1.00
RX 7900 XTX granitemoe 3B.A800M Q5_K_S 64 pp1024 4053.32 4041.31 1.00
RX 7900 XTX granitemoe 3B.A800M Q5_K_S 512 pp1024 11214.62 11344.06 1.01
RX 7900 XTX lfm2moe 8B.A1B F16 1 pp128 191.90 193.54 1.01
RX 7900 XTX lfm2moe 8B.A1B F16 2 pp128 251.93 252.61 1.00
RX 7900 XTX lfm2moe 8B.A1B F16 8 pp128 400.62 404.11 1.01
RX 7900 XTX lfm2moe 8B.A1B F16 64 pp1024 2410.05 2293.96 0.95
RX 7900 XTX lfm2moe 8B.A1B F16 512 pp1024 6056.49 6064.27 1.00
RX 7900 XTX lfm2moe 8B.A1B Q4_0 1 pp128 313.07 318.25 1.02
RX 7900 XTX lfm2moe 8B.A1B Q4_0 2 pp128 591.88 597.87 1.01
RX 7900 XTX lfm2moe 8B.A1B Q4_0 8 pp128 1447.20 1456.81 1.01
RX 7900 XTX lfm2moe 8B.A1B Q4_0 64 pp1024 4950.93 4654.84 0.94
RX 7900 XTX lfm2moe 8B.A1B Q4_0 512 pp1024 11462.37 11587.03 1.01
RX 7900 XTX lfm2moe 8B.A1B Q4_K_M 1 pp128 339.24 343.37 1.01
RX 7900 XTX lfm2moe 8B.A1B Q4_K_M 2 pp128 559.04 563.40 1.01
RX 7900 XTX lfm2moe 8B.A1B Q4_K_M 8 pp128 1066.30 1074.44 1.01
RX 7900 XTX lfm2moe 8B.A1B Q4_K_M 64 pp1024 4454.03 4472.90 1.00
RX 7900 XTX lfm2moe 8B.A1B Q4_K_M 512 pp1024 9545.12 9695.35 1.02
RX 7900 XTX lfm2moe 8B.A1B Q5_K_M 1 pp128 319.08 321.26 1.01
RX 7900 XTX lfm2moe 8B.A1B Q5_K_M 2 pp128 524.38 523.42 1.00
RX 7900 XTX lfm2moe 8B.A1B Q5_K_M 8 pp128 1061.01 1066.38 1.01
RX 7900 XTX lfm2moe 8B.A1B Q5_K_M 64 pp1024 4430.18 4443.48 1.00
RX 7900 XTX lfm2moe 8B.A1B Q5_K_M 512 pp1024 9342.10 9415.15 1.01
RX 7900 XTX lfm2moe 8B.A1B Q6_K 1 pp128 296.73 293.74 0.99
RX 7900 XTX lfm2moe 8B.A1B Q6_K 2 pp128 481.04 486.78 1.01
RX 7900 XTX lfm2moe 8B.A1B Q6_K 8 pp128 928.15 934.37 1.01
RX 7900 XTX lfm2moe 8B.A1B Q6_K 64 pp1024 3617.68 3645.75 1.01
RX 7900 XTX lfm2moe 8B.A1B Q6_K 512 pp1024 5710.91 5643.20 0.99
RX 7900 XTX lfm2moe 8B.A1B Q8_0 1 pp128 283.05 286.51 1.01
RX 7900 XTX lfm2moe 8B.A1B Q8_0 2 pp128 442.61 446.03 1.01
RX 7900 XTX lfm2moe 8B.A1B Q8_0 8 pp128 1040.03 1046.01 1.01
RX 7900 XTX lfm2moe 8B.A1B Q8_0 64 pp1024 4265.26 4322.20 1.01
RX 7900 XTX lfm2moe 8B.A1B Q8_0 512 pp1024 11210.64 11499.85 1.03
RX 7900 XTX llama 8B Q2_K_M 1 pp128 163.33 166.76 1.02
RX 7900 XTX llama 8B Q2_K_M 2 pp128 247.11 250.22 1.01
RX 7900 XTX llama 8B Q2_K_M 8 pp128 369.59 371.29 1.00
RX 7900 XTX llama 8B Q2_K_M 64 pp1024 1256.46 1235.98 0.98
RX 7900 XTX llama 8B Q2_K_M 512 pp1024 3119.40 3119.42 1.00
RX 7900 XTX llama 8B Q3_K_M 1 pp128 145.11 146.39 1.01
RX 7900 XTX llama 8B Q3_K_M 2 pp128 247.03 249.14 1.01
RX 7900 XTX llama 8B Q3_K_M 8 pp128 387.35 391.49 1.01
RX 7900 XTX llama 8B Q3_K_M 64 pp1024 2063.32 2121.65 1.03
RX 7900 XTX llama 8B Q3_K_M 512 pp1024 3385.98 3398.29 1.00
RX 7900 XTX llama 8B Q4_0 1 pp128 144.28 146.58 1.02
RX 7900 XTX llama 8B Q4_0 2 pp128 266.20 269.44 1.01
RX 7900 XTX llama 8B Q4_0 8 pp128 663.03 671.33 1.01
RX 7900 XTX llama 8B Q4_0 64 pp1024 2367.43 2417.00 1.02
RX 7900 XTX llama 8B Q4_0 512 pp1024 3854.04 3906.66 1.01
RX 7900 XTX llama 8B Q4_K_M 1 pp128 133.14 134.03 1.01
RX 7900 XTX llama 8B Q4_K_M 2 pp128 231.40 233.04 1.01
RX 7900 XTX llama 8B Q4_K_M 8 pp128 416.20 417.26 1.00
RX 7900 XTX llama 8B Q4_K_M 64 pp1024 2049.86 2068.47 1.01
RX 7900 XTX llama 8B Q4_K_M 128 pp1024 2443.16 2426.82 0.99
RX 7900 XTX llama 8B Q4_K_M 512 pp1024 3575.01 3567.97 1.00
RX 7900 XTX llama 8B Q5_K_M 1 pp128 118.65 120.21 1.01
RX 7900 XTX llama 8B Q5_K_M 2 pp128 212.07 214.08 1.01
RX 7900 XTX llama 8B Q5_K_M 8 pp128 406.59 409.30 1.01
RX 7900 XTX llama 8B Q5_K_M 64 pp1024 2027.50 2009.81 0.99
RX 7900 XTX llama 8B Q5_K_M 512 pp1024 3495.19 3507.63 1.00
RX 7900 XTX llama 8B Q6_K 1 pp128 109.13 110.39 1.01
RX 7900 XTX llama 8B Q6_K 2 pp128 190.55 191.14 1.00
RX 7900 XTX llama 8B Q6_K 8 pp128 400.39 402.35 1.00
RX 7900 XTX llama 8B Q6_K 64 pp1024 1525.92 1532.18 1.00
RX 7900 XTX llama 8B Q6_K 512 pp1024 3116.46 3129.22 1.00
RX 7900 XTX llama 8B Q8_0 1 pp128 94.05 94.93 1.01
RX 7900 XTX llama 8B Q8_0 2 pp128 168.41 168.76 1.00
RX 7900 XTX llama 8B Q8_0 8 pp128 538.89 544.09 1.01
RX 7900 XTX llama 8B Q8_0 64 pp1024 2338.05 2333.83 1.00
RX 7900 XTX llama 8B Q8_0 512 pp1024 3706.96 3820.83 1.03
RX 7900 XTX qwen35 27B Q5_K_M 1 pp128 32.67 32.68 1.00
RX 7900 XTX qwen35 27B Q5_K_M 2 pp128 58.83 59.45 1.01
RX 7900 XTX qwen35 27B Q5_K_M 8 pp128 117.71 118.75 1.01
RX 7900 XTX qwen35 27B Q5_K_M 64 pp1024 572.88 570.56 1.00
RX 7900 XTX qwen35 27B Q5_K_M 512 pp1024 925.33 936.21 1.01

GPU-575dfb9c7cb709fd

GPU Model Microbatch size Test t/s master t/s rms_norm_opt Speedup
AI PRO R9700 gemma4 26B.A4B Q6_K 1 pp128 99.25 101.81 1.03
AI PRO R9700 gemma4 26B.A4B Q6_K 2 pp128 174.94 177.26 1.01
AI PRO R9700 gemma4 26B.A4B Q6_K 8 pp128 439.08 441.35 1.01
AI PRO R9700 gemma4 26B.A4B Q6_K 64 pp1024 1408.24 1411.78 1.00
AI PRO R9700 gemma4 26B.A4B Q6_K 512 pp1024 3957.10 4060.19 1.03
AI PRO R9700 gpt-oss 20B MXFP4 MoE 1 pp128 179.25 180.75 1.01
AI PRO R9700 gpt-oss 20B MXFP4 MoE 2 pp128 272.09 273.44 1.00
AI PRO R9700 gpt-oss 20B MXFP4 MoE 8 pp128 645.79 649.24 1.01
AI PRO R9700 gpt-oss 20B MXFP4 MoE 64 pp1024 2120.06 2122.78 1.00
AI PRO R9700 gpt-oss 20B MXFP4 MoE 512 pp1024 5709.46 5856.27 1.03
AI PRO R9700 granite 3B Q5_1 1 pp128 153.51 154.84 1.01
AI PRO R9700 granite 3B Q5_1 2 pp128 251.41 256.31 1.02
AI PRO R9700 granite 3B Q5_1 8 pp128 806.01 811.81 1.01
AI PRO R9700 granite 3B Q5_1 64 pp1024 3586.98 3614.21 1.01
AI PRO R9700 granite 3B Q5_1 512 pp1024 5890.19 6007.49 1.02
AI PRO R9700 granite 3B Q8_0 1 pp128 120.24 121.06 1.01
AI PRO R9700 granite 3B Q8_0 2 pp128 205.60 207.88 1.01
AI PRO R9700 granite 3B Q8_0 8 pp128 635.56 638.76 1.01
AI PRO R9700 granite 3B Q8_0 64 pp1024 3903.06 3888.48 1.00
AI PRO R9700 granite 3B Q8_0 512 pp1024 8625.80 8788.57 1.02
AI PRO R9700 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 1 pp128 226.85 230.18 1.01
AI PRO R9700 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 2 pp128 418.79 422.77 1.01
AI PRO R9700 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 8 pp128 1173.61 1164.73 0.99
AI PRO R9700 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 64 pp1024 3808.10 4064.39 1.07
AI PRO R9700 granitemoe 3B.A800M IQ3_S - 3.4375 bpw 512 pp1024 12349.80 13015.95 1.05
AI PRO R9700 granitemoe 3B.A800M Q5_K_S 1 pp128 208.47 212.95 1.02
AI PRO R9700 granitemoe 3B.A800M Q5_K_S 2 pp128 425.38 432.20 1.02
AI PRO R9700 granitemoe 3B.A800M Q5_K_S 8 pp128 1105.30 1105.78 1.00
AI PRO R9700 granitemoe 3B.A800M Q5_K_S 64 pp1024 3946.61 4146.58 1.05
AI PRO R9700 granitemoe 3B.A800M Q5_K_S 512 pp1024 13246.76 13652.99 1.03
AI PRO R9700 lfm2moe 8B.A1B F16 1 pp128 154.08 155.66 1.01
AI PRO R9700 lfm2moe 8B.A1B F16 2 pp128 208.67 211.29 1.01
AI PRO R9700 lfm2moe 8B.A1B F16 8 pp128 329.35 334.95 1.02
AI PRO R9700 lfm2moe 8B.A1B F16 64 pp1024 1487.46 1506.79 1.01
AI PRO R9700 lfm2moe 8B.A1B F16 512 pp1024 1976.78 2006.14 1.01
AI PRO R9700 lfm2moe 8B.A1B Q4_0 1 pp128 321.10 324.01 1.01
AI PRO R9700 lfm2moe 8B.A1B Q4_0 2 pp128 473.93 478.24 1.01
AI PRO R9700 lfm2moe 8B.A1B Q4_0 8 pp128 1134.79 1144.70 1.01
AI PRO R9700 lfm2moe 8B.A1B Q4_0 64 pp1024 3953.21 3952.64 1.00
AI PRO R9700 lfm2moe 8B.A1B Q4_0 512 pp1024 13201.72 13479.63 1.02
AI PRO R9700 lfm2moe 8B.A1B Q4_K_M 1 pp128 306.02 312.91 1.02
AI PRO R9700 lfm2moe 8B.A1B Q4_K_M 2 pp128 456.31 463.20 1.02
AI PRO R9700 lfm2moe 8B.A1B Q4_K_M 8 pp128 998.21 1020.95 1.02
AI PRO R9700 lfm2moe 8B.A1B Q4_K_M 64 pp1024 3689.62 3816.99 1.03
AI PRO R9700 lfm2moe 8B.A1B Q4_K_M 512 pp1024 11489.06 11729.48 1.02
AI PRO R9700 lfm2moe 8B.A1B Q5_K_M 1 pp128 296.05 300.14 1.01
AI PRO R9700 lfm2moe 8B.A1B Q5_K_M 2 pp128 426.71 426.27 1.00
AI PRO R9700 lfm2moe 8B.A1B Q5_K_M 8 pp128 983.01 991.53 1.01
AI PRO R9700 lfm2moe 8B.A1B Q5_K_M 64 pp1024 3651.25 3779.84 1.04
AI PRO R9700 lfm2moe 8B.A1B Q5_K_M 512 pp1024 11173.91 11458.41 1.03
AI PRO R9700 lfm2moe 8B.A1B Q6_K 1 pp128 278.67 278.62 1.00
AI PRO R9700 lfm2moe 8B.A1B Q6_K 2 pp128 404.41 408.97 1.01
AI PRO R9700 lfm2moe 8B.A1B Q6_K 8 pp128 854.30 865.35 1.01
AI PRO R9700 lfm2moe 8B.A1B Q6_K 64 pp1024 3061.01 3161.57 1.03
AI PRO R9700 lfm2moe 8B.A1B Q6_K 512 pp1024 7844.41 7984.47 1.02
AI PRO R9700 lfm2moe 8B.A1B Q8_0 1 pp128 248.92 250.69 1.01
AI PRO R9700 lfm2moe 8B.A1B Q8_0 2 pp128 346.98 350.36 1.01
AI PRO R9700 lfm2moe 8B.A1B Q8_0 8 pp128 877.17 882.13 1.01
AI PRO R9700 lfm2moe 8B.A1B Q8_0 64 pp1024 3214.83 3423.95 1.07
AI PRO R9700 lfm2moe 8B.A1B Q8_0 512 pp1024 12571.11 12874.15 1.02
AI PRO R9700 llama 8B Q2_K_M 1 pp128 130.84 134.12 1.03
AI PRO R9700 llama 8B Q2_K_M 2 pp128 213.14 216.70 1.02
AI PRO R9700 llama 8B Q2_K_M 8 pp128 340.26 345.34 1.01
AI PRO R9700 llama 8B Q2_K_M 64 pp1024 337.62 340.64 1.01
AI PRO R9700 llama 8B Q2_K_M 512 pp1024 295.05 293.86 1.00
AI PRO R9700 llama 8B Q3_K_M 1 pp128 121.70 123.43 1.01
AI PRO R9700 llama 8B Q3_K_M 2 pp128 207.28 209.40 1.01
AI PRO R9700 llama 8B Q3_K_M 8 pp128 370.26 372.07 1.00
AI PRO R9700 llama 8B Q3_K_M 64 pp1024 2349.75 2377.55 1.01
AI PRO R9700 llama 8B Q3_K_M 512 pp1024 4236.72 4284.07 1.01
AI PRO R9700 llama 8B Q4_0 1 pp128 122.28 123.84 1.01
AI PRO R9700 llama 8B Q4_0 2 pp128 195.96 196.88 1.00
AI PRO R9700 llama 8B Q4_0 8 pp128 458.65 464.59 1.01
AI PRO R9700 llama 8B Q4_0 64 pp1024 2844.55 2827.41 0.99
AI PRO R9700 llama 8B Q4_0 512 pp1024 5219.44 5345.66 1.02
AI PRO R9700 llama 8B Q4_K_M 1 pp128 114.53 116.11 1.01
AI PRO R9700 llama 8B Q4_K_M 2 pp128 184.35 186.46 1.01
AI PRO R9700 llama 8B Q4_K_M 8 pp128 366.69 370.03 1.01
AI PRO R9700 llama 8B Q4_K_M 64 pp1024 2409.07 2390.73 0.99
AI PRO R9700 llama 8B Q4_K_M 512 pp1024 4281.87 4316.48 1.01
AI PRO R9700 llama 8B Q5_K_M 1 pp128 101.45 102.40 1.01
AI PRO R9700 llama 8B Q5_K_M 2 pp128 169.21 170.76 1.01
AI PRO R9700 llama 8B Q5_K_M 8 pp128 358.84 361.23 1.01
AI PRO R9700 llama 8B Q5_K_M 64 pp1024 2359.57 2326.54 0.99
AI PRO R9700 llama 8B Q5_K_M 512 pp1024 4221.66 4234.06 1.00
AI PRO R9700 llama 8B Q6_K 1 pp128 89.53 90.31 1.01
AI PRO R9700 llama 8B Q6_K 2 pp128 155.52 156.99 1.01
AI PRO R9700 llama 8B Q6_K 8 pp128 323.13 327.10 1.01
AI PRO R9700 llama 8B Q6_K 64 pp1024 1767.59 1765.38 1.00
AI PRO R9700 llama 8B Q6_K 512 pp1024 2686.06 2705.75 1.01
AI PRO R9700 llama 8B Q8_0 1 pp128 73.16 73.39 1.00
AI PRO R9700 llama 8B Q8_0 2 pp128 132.74 134.21 1.01
AI PRO R9700 llama 8B Q8_0 8 pp128 445.41 447.31 1.00
AI PRO R9700 llama 8B Q8_0 64 pp1024 2500.53 2488.00 0.99
AI PRO R9700 llama 8B Q8_0 512 pp1024 5179.54 5233.01 1.01
AI PRO R9700 qwen35 27B Q5_K_M 1 pp128 27.08 27.23 1.01
AI PRO R9700 qwen35 27B Q5_K_M 2 pp128 48.09 48.52 1.01
AI PRO R9700 qwen35 27B Q5_K_M 8 pp128 99.94 100.59 1.01
AI PRO R9700 qwen35 27B Q5_K_M 64 pp1024 655.59 659.76 1.01
AI PRO R9700 qwen35 27B Q5_K_M 512 pp1024 937.73 949.99 1.01

Requirements

  • I have read and agree with the contributing guidelines
  • AI usage disclosure: YES, my initial implementation had some bugs (missing non-hip applicable pdl barriers, alignment requirements) Qwen3.8-flash-next helped with those.

@IMbackK
IMbackK requested a review from a team as a code owner September 30, 2026 08:30
@github-actions github-actions Bot added ggml changes relating to the ggml tensor library for machine learning CUDA Related to the CUDA backend labels Sep 30, 2026
Comment thread ggml/src/ggml-cuda/norm.cu Outdated

@am17an am17an left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, nice change. Tested on RTX Pro 6000, results are all positive or neutral.

@ORippler ORippler left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@IMbackK did you benchmark both wider loads and keeping elements in registers independently? Wider loads are not really expected to help unless you run into an IPC issue on AMD - the memory access pattern is fully coalesced. This kernel is by definition latency-limited (moving 43 kB inputs is not going to saturate any recent HW BW imo, and on CUDA we launch just 1/ at most very few CTAs meaning we cannot saturate memory BW).

Image Image Image

The above were generated on gemma4-26b on master, not this PR.

If vpt/keeping things in registers alone is sufficient, it would simplify the PR and reduce templating.


Other observations:

  1. rms_norm_mul_rope_f32/other kernels with the same pattern could benefit from this as well most likely.
  2. For the invocation I opened, we actually could hide latency on CUDA a bit by emitting wider loads (2816 cols / 1024 threads = 2.5 loads per thread on master, and the compiler decided to do the classic 1/4/8/16 optimization based on provided block_size, so we have a loop and pay 3x the latency of which would be needed). But based on Aman's numbers and previous PRs/attempts E2E performance gains are negligible for NVGPUs (#20520)

Comment on lines +352 to +360
// The vec path reads 16B per lane, so the base pointer and every row offset have to be 16B aligned.
static bool rms_norm_f32_vec_aligned(
const void * ptr, const int64_t stride_row, const int64_t stride_channel, const int64_t stride_sample,
const int64_t nrows, const int64_t nchannels, const int64_t nsamples) {
return ((uintptr_t) ptr & 15) == 0
&& (nrows <= 1 || stride_row % 4 == 0)
&& (nchannels <= 1 || stride_channel % 4 == 0)
&& (nsamples <= 1 || stride_sample % 4 == 0);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't we use ggml_cuda_is_aligned from common.cuh here? It exists purely to check base alignment of poitner and rows at the ggml_tensor level

#define RMS_NORM_LAUNCH(BLOCK_SIZE, VPT, VEC) \
do { \
const dim3 block_dims(BLOCK_SIZE, 1, 1); \
const ggml_cuda_kernel_launch_params launch_params{ blocks_num, block_dims, block_dims.x > WARP_SIZE ? 32 * sizeof(float) : 0, stream }; \

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not an AMD guy but WARP_SIZE resolves to 32, and I was guided to use an IHV-agnostic helper in the past. Not sure if extending block_reduce and this kernel to use full warps on AMD HW may be an alternative path

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dosent matter, it wastes half the wave but is not compute bound anyhow

static_assert(!do_scale || !do_multiply, "fusing scale is not supported with multiplying");

// dst is written at row * ncols, i.e. always at a multiple of ncols, so only its base needs checking here
bool vec = ncols % 4 == 0 && ncols > 0 && ((uintptr_t) dst & 15) == 0

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might make sense to use braces to separate dst and x checks that are both happening here

Comment on lines +404 to +406
if (n4 <= 32) {
RMS_NORM_LAUNCH(32, 1, true);
} else if (n4 <= 128) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scheduling < 4 full warps tends to be an anti-pattern in cuda, as it often reduces occupancy

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i dont think this branch is actually practically used in real models so i dont think its worth anz complexity to optimize it

float4 r = make_float4(scale*xs[k].x, scale*xs[k].y, scale*xs[k].z, scale*xs[k].w);
if constexpr (do_multiply) {
const float4 m = mul4[i];
r.x *= m.x; r.y *= m.y; r.z *= m.z; r.w *= m.w;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
r.x *= m.x; r.y *= m.y; r.z *= m.z; r.w *= m.w;
r.x *= m.x;
r.y *= m.y;
r.z *= m.z;
r.w *= m.w;

I find it more legible uncollapsed

@IMbackK

IMbackK commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor Author

@IMbackK did you benchmark both wider loads and keeping elements in registers independently? Wider loads are not really expected to help unless you run into an IPC issue on AMD - the memory access pattern is fully coalesced. This kernel is by definition latency-limited (moving 43 kB inputs is not going to saturate any recent HW BW imo, and on CUDA we launch just 1/ at most very few CTAs meaning we cannot saturate memory BW).

Nope i was actually after wider loads and the x in registers just came as an aside. anyhow looks like that x in register actually has the dominant effect but the wider loads help too, numbers from test-backend-ops perf cases:

ncols nrows scalar/ x twice(base) scalar/ x in registers vec/ x twice vec/ x in registers pr
2048 32768 760.4us 706.0GB/s 695.5us 771.9GB/s 591.2us 908.1GB/s 577.1us 930.3GB/s
3584 18724 660.7us 812.6GB/s 582.2us 922.2GB/s 609.5us 880.8GB/s 562.6us 954.2GB/s
4096 16384 674.7us 795.8GB/s 578.9us 927.4GB/s 614.4us 873.9GB/s 561.0us 956.9GB/s
5120 13107 707.1us 759.3GB/s 574.7us 934.1GB/s 674.2us 796.3GB/s 564.5us 951.0GB/s
8192 8192 802.1us 669.3GB/s 564.3us 951.4GB/s 788.5us 680.9GB/s 557.5us 963.0GB/s

using half the waves in the reduction should not matter here but the n4 < 32 case is indeed pretty bad.

@JohannesGaessler

Copy link
Copy Markdown
Contributor

There are parallel efforts to fix issues with limited CUDA grid sizes: #28175 . The changes are largely orthogonal to each other though.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CUDA Related to the CUDA backend ggml changes relating to the ggml tensor library for machine learning

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants