Same GGUF files, same host, one uniform OpenAI /v1/chat/completions surface, across text / image / audio / video / single-turn / multi-turn / function-call / structured-output scenarios on the selected compute backends (ggml_cuda / ggml_vulkan / ggml_metal / ggml_cpu / cpu / ...).
Numbers are tokens/second (higher is better). — = not applicable / skipped, fail = errored at runtime, n/a = combination never attempted.
| Component | Version / detail |
|---|---|
| TensorSharp | git a8d8f40, .NET 10.0.204 (backends: ggml_cuda / ggml_vulkan / ggml_metal / cuda / mlx / ggml_cpu / cpu) |
| llama.cpp | C:\Works\llama.cpp\build-cuda\bin\Release\llama-server.exe |
| vLLM | endpoint http://127.0.0.1:8000 (connect-only) |
| GPU | NVIDIA GeForce RTX 3080 Laptop GPU, 16384 MiB |
- Each
(engine, backend, model)group launches its server once; all of that group's scenarios run against it, so per-scenario timings exclude model-load cost. - Metrics come from the streamed response:
ttftis time-to-first-token (prefill latency proxy),prefill_tps = prompt_tokens / ttft, anddecode_tps = (completion_tokens - 1) / (t_last - t_first). - DiffusionGemma denoises whole blocks (no token stream), so it is run non-streaming and its
decode_tpsis wall-clock tokens/second. - Greedy sampling (
temperature=0); one warmup request per server is discarded. - The headline per-engine tables are the single-stream, MTP-off baseline. MTP on/off and parallel-request scaling are reported in their own sections below.
Geomean of TensorSharp's per-scenario speedup over each reference engine on the same backend, across every scenario both engines ran (single-stream, MTP-off). A value > 1.0× means TensorSharp is faster (for decode / prefill throughput) or lower-latency (for TTFT); — = no overlapping cells. Per-scenario ratios are in each model's section below.
No overlapping TensorSharp / reference cells to compare.
Decode throughput (tok/s)
| Scenario | TensorSharp · CUDA | TensorSharp · Direct CUDA |
|---|---|---|
| text_short | 78.7 | 35.3 |
| text_long | 78.4 | 38.5 |
| multi_turn | 79.1 | 38.5 |
Prefill throughput (tok/s)
| Scenario | TensorSharp · CUDA | TensorSharp · Direct CUDA |
|---|---|---|
| text_short | 1832.1 | 128.2 |
| text_long | 1847.3 | 48.0 |
| multi_turn | 1940.7 | 114.2 |
Time to first token (ms, lower is better)
| Scenario | TensorSharp · CUDA | TensorSharp · Direct CUDA |
|---|---|---|
| text_short | 1078.0 | 15407.0 |
| text_long | 1703.0 | 65532.0 |
| multi_turn | 1079.0 | 18329.0 |
Decode throughput (tok/s)
| Scenario | TensorSharp · CUDA | TensorSharp · Direct CUDA |
|---|---|---|
| text_short | 73.9 | 24.4 |
| text_long | 76.6 | 23.5 |
| multi_turn | 76.7 | 25.0 |
Prefill throughput (tok/s)
| Scenario | TensorSharp · CUDA | TensorSharp · Direct CUDA |
|---|---|---|
| text_short | 1472.8 | 270.4 |
| text_long | 1690.1 | 267.4 |
| multi_turn | 1702.4 | 263.4 |
Time to first token (ms, lower is better)
| Scenario | TensorSharp · CUDA | TensorSharp · Direct CUDA |
|---|---|---|
| text_short | 1360.0 | 7407.0 |
| text_long | 1891.0 | 11954.0 |
| multi_turn | 1250.0 | 8078.0 |
Both engines decode the same GGUF greedily (temperature=0) on the same backend, so their outputs should agree closely. similarity is a whitespace-normalized SequenceMatcher ratio between the two outputs (1.00 = identical); low similarity, an invalid JSON object in json_mode, or a missing tool call in function_call flags an output-quality problem on one side. Prefill scenarios (8-token outputs) are excluded. Side-by-side excerpts follow the table, lowest agreement first.
No overlapping ok cells with captured output to compare.
Single-stream decode tok/s with MTP/NextN speculative decoding off vs on (TensorSharp only). Speedup < 1.0× means speculation cost more than it saved for that cell — expected when the fused full-model decode path is already the fast path.
No MTP on/off pairs were run (use --mtp off,on).
decode/req is the mean per-request decode tok/s; aggregate is the system-wide decode throughput (total generated tokens / the wall window during which any sequence was decoding) when N identical requests are fired at one server at once.
No parallel-request cells were run (use --concurrency 1,4,8).
No function-call cells were run.