Skip to content

CUDA: use MMVF for thin f16/bf16 mul_mat at small batch size - #29633

Merged
ynankani merged 2 commits into
ggml-org:masterfrom
ynankani:ynankani/cuda_bf16_mmvf_small_batch
Oct 5, 2026
Merged

ynankani merged 2 commits into
ggml-org:masterfrom
ynankani:ynankani/cuda_bf16_mmvf_small_batch

Conversation

@ynankani

Copy link
Copy Markdown
Contributor

Overview

Use MMVF for thin f16/bf16 mul_mat at small batch size instead of slow cublass path. Credits to @am17an for this suggestion #29187 (comment)

Additional information

Performance RTX-6000 PRO-BLACKWELL Collected with -p 256 -n 0 -ub 1,2,3,4,5,6,7,8 -r 5 <style> </style>
GPU Model Microbatch Test t/s master t/s PR Speedup
RTX PRO 6000 Blackwell qwen3.8 27B BF16 1 pp256 29.19 29.02 0.99
RTX PRO 6000 Blackwell qwen3.8 27B BF16 2 pp256 50.96 54.37 1.07
RTX PRO 6000 Blackwell qwen3.8 27B BF16 3 pp256 75.35 80.25 1.06
RTX PRO 6000 Blackwell qwen3.8 27B BF16 4 pp256 100.28 106.64 1.06
RTX PRO 6000 Blackwell qwen3.8 27B BF16 5 pp256 122.67 130.58 1.06
RTX PRO 6000 Blackwell qwen3.8 27B BF16 6 pp256 147.91 156.55 1.06
RTX PRO 6000 Blackwell qwen3.8 27B BF16 7 pp256 171 180.15 1.05
RTX PRO 6000 Blackwell qwen3.8 27B BF16 8 pp256 196.26 206.71 1.05
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 1 pp256 67.65 66.53 0.98
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 2 pp256 110.7 123.59 1.12
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 3 pp256 157.66 172.48 1.09
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 4 pp256 200.67 217.65 1.08
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 5 pp256 235.84 254.27 1.08
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 6 pp256 268.84 285.23 1.06
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 7 pp256 286.51 304.17 1.06
RTX PRO 6000 Blackwell qwen3.8 27B RadixArk NVFP4 8 pp256 312.36 327.29 1.05
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 1 pp256 62.95 63.08 1
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 2 pp256 105 117.1 1.12
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 3 pp256 149.37 165.49 1.11
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 4 pp256 189 208.54 1.1
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 5 pp256 222.93 244.2 1.1
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 6 pp256 255.09 276.86 1.09
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 7 pp256 275.31 293.54 1.07
RTX PRO 6000 Blackwell qwen3.8 27B Unsloth NVFP4 8 pp256 299.47 316.54 1.06
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 1 pp256 72.33 71.88 0.99
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 2 pp256 133.22 133.1 1
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 3 pp256 182.09 183.34 1.01
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 4 pp256 225.35 225.76 1
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 5 pp256 251 250.12 1
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 6 pp256 294.89 294.84 1
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 7 pp256 346.61 350.89 1.01
RTX PRO 6000 Blackwell qwen3.8 27B UD-Q4_K_M 8 pp256 392.39 390.8 1
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 1 pp256 266.25 263.74 0.99
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 2 pp256 442.54 448.73 1.01
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 3 pp256 606.49 609.16 1
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 4 pp256 632.32 630.33 1
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 5 pp256 740.58 742.58 1
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 6 pp256 861.74 852.66 0.99
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 7 pp256 944.45 931.93 0.99
RTX PRO 6000 Blackwell qwen3.6 35B-A3B UD-Q4_K_M 8 pp256 1024.66 1030.79 1.01

Requirements

@ynankani
ynankani requested a review from a team as a code owner September 29, 2026 06:53
@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 29, 2026
@am17an

am17an commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

can you measure on more devices? Preferably ampere and ada too

@JohannesGaessler JohannesGaessler 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.

Modify the logic in ggml_cuda_should_use_mmvf instead of adding a second check in ggml_cuda_mul_mat. You can dynamically adjust the threshold for ne11 based on the return value of ggml_cuda_should_use_mmf.

@ynankani

Copy link
Copy Markdown
Contributor Author

can you measure on more devices? Preferably ampere and ada too

Performance RTX-4090
GPU Model Microbatch Test t/s master t/s PR Speedup
RTX 4090 qwen3.8 27B Unsloth NVFP4 1 pp256 44.04 44.06 1
RTX 4090 qwen3.8 27B Unsloth NVFP4 2 pp256 76.69 84.22 1.1
RTX 4090 qwen3.8 27B Unsloth NVFP4 3 pp256 113.06 123.62 1.09
RTX 4090 qwen3.8 27B Unsloth NVFP4 4 pp256 150.41 164.67 1.09
RTX 4090 qwen3.8 27B Unsloth NVFP4 5 pp256 182.68 198.64 1.09
RTX 4090 qwen3.8 27B Unsloth NVFP4 6 pp256 217.39 235.45 1.08
RTX 4090 qwen3.8 27B Unsloth NVFP4 7 pp256 249.54 268.85 1.08
RTX 4090 qwen3.8 27B Unsloth NVFP4 8 pp256 285.14 304.99 1.07
RTX 4090 qwen3.8 27B UD-Q4_K_M 1 pp256 53.98 53.98 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 2 pp256 103.13 103.14 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 3 pp256 150.81 150.89 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 4 pp256 198.73 198.64 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 5 pp256 236.51 237.05 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 6 pp256 278.31 278.41 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 7 pp256 316.39 314.87 1
RTX 4090 qwen3.8 27B UD-Q4_K_M 8 pp256 353.96 354.48 1
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 1 pp256 207.94 210.11 1.01
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 2 pp256 337.87 352.45 1.04
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 3 pp256 474.41 472.11 1
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 4 pp256 554.51 552.53 1
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 5 pp256 637.67 636.77 1
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 6 pp256 724.51 725.11 1
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 7 pp256 820.37 806.36 0.98
RTX 4090 qwen3.6 35B-A3B UD-Q4_K_M 8 pp256 907.14 890.6 0.98
Performance RTX-3090
GPU Model Microbatch Test t/s master t/s PR Speedup
RTX 3090 qwen3.8 27B Unsloth NVFP4 1 pp256 36.59 36.51 1
RTX 3090 qwen3.8 27B Unsloth NVFP4 2 pp256 61.02 66.18 1.08
RTX 3090 qwen3.8 27B Unsloth NVFP4 3 pp256 87.25 94.13 1.08
RTX 3090 qwen3.8 27B Unsloth NVFP4 4 pp256 105.69 111.14 1.05
RTX 3090 qwen3.8 27B Unsloth NVFP4 5 pp256 122.56 129.09 1.05
RTX 3090 qwen3.8 27B Unsloth NVFP4 6 pp256 128.42 135.17 1.05
RTX 3090 qwen3.8 27B Unsloth NVFP4 7 pp256 134.74 143.58 1.07
RTX 3090 qwen3.8 27B Unsloth NVFP4 8 pp256 133.49 151.2 1.13
RTX 3090 qwen3.8 27B UD-Q4_K_M 1 pp256 46.23 45.82 0.99
RTX 3090 qwen3.8 27B UD-Q4_K_M 2 pp256 86.08 81.54 0.95
RTX 3090 qwen3.8 27B UD-Q4_K_M 3 pp256 114.98 109.11 0.95
RTX 3090 qwen3.8 27B UD-Q4_K_M 4 pp256 135.15 134.12 0.99
RTX 3090 qwen3.8 27B UD-Q4_K_M 5 pp256 154.45 154.4 1
RTX 3090 qwen3.8 27B UD-Q4_K_M 6 pp256 164.34 163.95 1
RTX 3090 qwen3.8 27B UD-Q4_K_M 7 pp256 170.48 170.14 1
RTX 3090 qwen3.8 27B UD-Q4_K_M 8 pp256 176.66 175.95 1
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 1 pp256 169.43 170.85 1.01
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 2 pp256 280.93 282.92 1.01
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 3 pp256 372.63 373.32 1
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 4 pp256 417.49 418.03 1
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 5 pp256 466.27 467.32 1
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 6 pp256 506.53 509.23 1.01
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 7 pp256 549.87 555.79 1.01
RTX 3090 qwen3.6 35B-A3B UD-Q4_K_M 8 pp256 595.25 592.16 0.99

@am17an

am17an commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

it says thin F16 and BF16, have we measured the F16 path? because that would I think have a different performance profile.

@ynankani

Copy link
Copy Markdown
Contributor Author

it says thin F16 and BF16, have we measured the F16 path? because that would I think have a different performance profile.

yup need to collect that, let me change the outtype to fp16 and collect perf sweep for that.

@ynankani

Copy link
Copy Markdown
Contributor Author

it says thin F16 and BF16, have we measured the F16 path? because that would I think have a different performance profile.

Performance RTX-PRO-6000-BLACKWELL Seeing similar gains with FP16
GPU Model Microbatch Test t/s master t/s PR Speedup
RTX PRO 6000 Blackwell qwen3.8 27B F16 1 pp256 28.52 28.49 1
RTX PRO 6000 Blackwell qwen3.8 27B F16 2 pp256 49.98 53.19 1.06
RTX PRO 6000 Blackwell qwen3.8 27B F16 3 pp256 74.07 78.59 1.06
RTX PRO 6000 Blackwell qwen3.8 27B F16 4 pp256 98.69 104.7 1.06
RTX PRO 6000 Blackwell qwen3.8 27B F16 5 pp256 121.07 127.63 1.05
RTX PRO 6000 Blackwell qwen3.8 27B F16 6 pp256 145.51 152.8 1.05
RTX PRO 6000 Blackwell qwen3.8 27B F16 7 pp256 167.98 176.14 1.05
RTX PRO 6000 Blackwell qwen3.8 27B F16 8 pp256 192.6 202.38 1.05

Signed-off-by: ynankani <ynankani@nvidia.com>
@ynankani
ynankani force-pushed the ynankani/cuda_bf16_mmvf_small_batch branch from e56cd33 to bbbb1d0 Compare September 30, 2026 06:15
Comment on lines +830 to +833
// MMF needs full row tiles, for other row counts MMVF still beats cuBLAS at small batch size
if (src0_small && !ggml_cuda_should_use_mmf(type, cc, warp_size, src0_ne, src0_nb, ne11, /*mul_mat_id =*/ false)) {
return ne11 <= MMVF_MAX_BATCH_SIZE;
}

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.

My intuition is that the correct logic is to put this in front of the switch statement for the type. I'll check the AMD performance.

@JohannesGaessler

Copy link
Copy Markdown
Contributor

Note: these numbers are with a patch on top that force-disables MMF. It seems that only for RDNA a speedup can be achieved vs. hipBLAS by using MMVF more often:

GPU Model Microbatch size Test t/s b11245 t/s a1e9fcc Speedup
RX 9060 XT llama 1B BF16 1 pp512 122.08 122.21 1.00
RX 9060 XT llama 1B BF16 2 pp512 216.42 216.74 1.00
RX 9060 XT llama 1B BF16 3 pp512 275.27 275.64 1.00
RX 9060 XT llama 1B BF16 4 pp512 146.67 312.91 2.13
RX 9060 XT llama 1B BF16 5 pp512 190.12 391.39 2.06
RX 9060 XT llama 1B BF16 6 pp512 227.56 434.80 1.91
RX 9060 XT llama 1B BF16 7 pp512 264.24 471.69 1.79
RX 9060 XT llama 1B BF16 8 pp512 288.61 501.40 1.74
RX 9060 XT llama 1B F16 1 pp512 122.88 122.84 1.00
RX 9060 XT llama 1B F16 2 pp512 215.72 215.52 1.00
RX 9060 XT llama 1B F16 3 pp512 299.11 298.86 1.00
RX 9060 XT llama 1B F16 4 pp512 336.10 335.33 1.00
RX 9060 XT llama 1B F16 5 pp512 415.22 414.39 1.00
RX 9060 XT llama 1B F16 6 pp512 235.62 451.12 1.91
RX 9060 XT llama 1B F16 7 pp512 274.19 486.89 1.78
RX 9060 XT llama 1B F16 8 pp512 298.59 514.05 1.72
RX 9060 XT llama 1B all F32 1 pp512 71.34 71.29 1.00
RX 9060 XT llama 1B all F32 2 pp512 138.45 138.91 1.00
RX 9060 XT llama 1B all F32 3 pp512 204.31 203.66 1.00
RX 9060 XT llama 1B all F32 4 pp512 249.05 247.90 1.00
RX 9060 XT llama 1B all F32 5 pp512 327.28 326.69 1.00
RX 9060 XT llama 1B all F32 6 pp512 378.40 377.02 1.00
RX 9060 XT llama 1B all F32 7 pp512 394.12 392.38 1.00
RX 9060 XT llama 1B all F32 8 pp512 423.78 421.36 0.99

I did not touch the NVIDIA-specific logic.

@JohannesGaessler
JohannesGaessler force-pushed the ynankani/cuda_bf16_mmvf_small_batch branch from 44dab7b to ebae262 Compare September 30, 2026 20:28
@ynankani

ynankani commented Oct 5, 2026

Copy link
Copy Markdown
Contributor Author

Hi @am17an, Could i please get a 2nd review and approval for this?

@ynankani
ynankani merged commit 9d3aba6 into ggml-org:master Oct 5, 2026
15 of 17 checks passed
benjigill added a commit to benjigill/llama.cpp that referenced this pull request Oct 6, 2026
 matcher

Upstream ggml-org#29633 added a warp_size parameter; the fused Q4_K gate/up
SwiGLU matcher still used the old signature and failed to compile.
Wizard815 pushed a commit to Wizard815/mx-llama.cpp-Rocm10 that referenced this pull request Oct 6, 2026
…g#29633)

* CUDA: use MMVF for thin f16/bf16 mul_mat at small batch size

Signed-off-by: ynankani <ynankani@nvidia.com>

* adjust kernel selection logic

---------

Signed-off-by: ynankani <ynankani@nvidia.com>
Co-authored-by: Johannes Gäßler <johannesg@5d6.de>
(cherry picked from commit 9d3aba6)
edwardyoon pushed a commit to edwardyoon/focus-llama that referenced this pull request Oct 8, 2026
…g#29633)

* CUDA: use MMVF for thin f16/bf16 mul_mat at small batch size

Signed-off-by: ynankani <ynankani@nvidia.com>

* adjust kernel selection logic

---------

Signed-off-by: ynankani <ynankani@nvidia.com>
Co-authored-by: Johannes Gäßler <johannesg@5d6.de>
(cherry picked from commit 9d3aba6)
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.

3 participants