Skip to content

perf: hoist F16 weight row conversion out of the token loop - #430

Open
unsafePtr wants to merge 1 commit into
kkokosa:mainfrom
unsafePtr:perf/gemmf16-loop-reorder
Open

perf: hoist F16 weight row conversion out of the token loop#430
unsafePtr wants to merge 1 commit into
kkokosa:mainfrom
unsafePtr:perf/gemmf16-loop-reorder

Conversation

@unsafePtr

Copy link
Copy Markdown

Before


BenchmarkDotNet v0.14.0, Ubuntu 26.04 LTS (Resolute Raccoon)
AMD Ryzen 9 7900, 1 CPU, 24 logical and 12 physical cores
.NET SDK 10.0.110
  [Host]     : .NET 10.0.10 (10.0.1026.32716), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
  Job-RLZORF : .NET 10.0.10 (10.0.1026.32716), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI

IterationCount=10  WarmupCount=3  

Method N Mean Error StdDev Prefill tok/s Decode tok/s Allocated
SequentialGemvF16 1 3.134 ms 0.0144 ms 0.0095 ms N/A N/A -
GemmF16 1 3.125 ms 0.0129 ms 0.0085 ms N/A N/A -
SequentialGemvF16 4 12.538 ms 0.0412 ms 0.0273 ms N/A N/A -
GemmF16 4 11.736 ms 0.0186 ms 0.0097 ms N/A N/A -
SequentialGemvF16 16 50.098 ms 0.1162 ms 0.0691 ms N/A N/A -
GemmF16 16 45.914 ms 0.1275 ms 0.0843 ms N/A N/A -
SequentialGemvF16 64 202.428 ms 0.8437 ms 0.5581 ms N/A N/A -
GemmF16 64 186.253 ms 0.7593 ms 0.4519 ms N/A N/A -
SequentialGemvF16 256 812.221 ms 2.1728 ms 1.4372 ms N/A N/A -
GemmF16 256 723.298 ms 1.1440 ms 0.6808 ms N/A N/A -
SequentialGemvF16 512 1,619.602 ms 18.6370 ms 12.3272 ms N/A N/A -
GemmF16 512 1,481.975 ms 1.3429 ms 0.8882 ms N/A N/A -

After


BenchmarkDotNet v0.14.0, Ubuntu 26.04 LTS (Resolute Raccoon)
AMD Ryzen 9 7900, 1 CPU, 24 logical and 12 physical cores
.NET SDK 10.0.110
  [Host]     : .NET 10.0.10 (10.0.1026.32716), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
  Job-TPILYV : .NET 10.0.10 (10.0.1026.32716), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI

IterationCount=10  WarmupCount=3  

Method N Mean Error StdDev Prefill tok/s Decode tok/s Allocated
SequentialGemvF16 1 3.125 ms 0.0194 ms 0.0116 ms N/A N/A -
GemmF16 1 3.117 ms 0.0128 ms 0.0085 ms N/A N/A -
SequentialGemvF16 4 12.478 ms 0.0276 ms 0.0164 ms N/A N/A -
GemmF16 4 5.501 ms 0.0139 ms 0.0083 ms N/A N/A -
SequentialGemvF16 16 50.559 ms 0.3339 ms 0.1987 ms N/A N/A -
GemmF16 16 15.289 ms 0.0930 ms 0.0615 ms N/A N/A -
SequentialGemvF16 64 203.868 ms 0.7361 ms 0.4381 ms N/A N/A -
GemmF16 64 55.826 ms 0.0966 ms 0.0575 ms N/A N/A -
SequentialGemvF16 256 807.068 ms 1.5245 ms 0.9072 ms N/A N/A -
GemmF16 256 196.585 ms 0.7611 ms 0.4529 ms N/A N/A -
SequentialGemvF16 512 1,539.876 ms 3.6712 ms 2.1847 ms N/A N/A -
GemmF16 512 437.798 ms 0.9572 ms 0.5696 ms N/A N/A -

GemmF16 and GemmTiledF16Worker iterated token-first with the weight row
loop inside, so each row's F16 to F32 conversion was redone once per
token instead of once. Reordering to row-outer / token-inner converts
each row once and dots it against all N tokens.

Also adds the F16 coverage GemmBenchmarks was missing, which is why this
went unmeasured.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant