dasLLAMA · CPU inference

A scripting language that holds its own on CPU.

dasLLAMA is an LLM + speech-to-text stack written entirely in daslang and JIT-compiled — no hand-written assembly. These are CPU-only comparisons. llama.cpp is a broader, more mature engine with GPU backends we don't try to match; on the CPU path alone, das keeps pace on prompt processing and often edges ahead.

up to 1.75×
LLM prefill vs llama.cpp · gemma-4 E2B, M1
30 / 32
runs das ≥ llama.cpp · 16 models × 2 boxes
~5×
Qwen3-Omni audio vs mtmd, CPU-only (M1)
dasllama.das
// LLM inference in daslang — JIT, no C++
require dasllama/dasllama
require daslib/jobque_boost

[export]
def main() {
    let path = "Llama-3.1-8B.gguf"
    var m <- load_model(path, QuantMode.q8)
    let ids <- encode(m, "Summarize the results:")
    with_job_que() {
        setup_dasllama_jobque()
        var s = create_session(m)
        let sp = SamplingParams()
        generate(m, s, ids, sp, 128l) $(_id, p) {
            print(p)
            return true
        }
    }
}
$ daslang -jit dasllama.das
loaded Llama-3.1-8B · q8 · 8.03B active · CPU / 8 threads
prefill 132.1 tok/s · das/llama.cpp 1.11×
decode  13.6 tok/s · das/llama.cpp 0.96×
✓ no hand-written assembly · Apple M1 Max

das ÷ llama.cpp, CPU only. Right of the line, das is ahead on prefill.

A like-for-like CPU comparison: llama.cpp built with no Accelerate/AMX BLAS, so this reflects scalar/SIMD kernels — not its GPU backends, which are out of scope here. pp512 = prefill over a 512-token prompt; tg128 = greedy generation of 128 tokens. All Q8.

machine
phase
0.5× (llama.cpp 2× faster)1.0×2.0× (das 2× faster)
modelactive B pp512 daspp512 lcppdas/lcpp tg128 dastg128 lcppdas/lcpp

Competitive with the dedicated engines on CPU.

Transcription time, CPU only, greedy decode. Bars show speed relative to the reference CLI (longer = faster); the small figure is real-time factor — seconds of audio per second of compute. Note the macOS *-cli tools do get Apple's AMX matrix unit here, so this isn't scalar-only on their side.

machine

Where the CPU-only gap is widest: audio chat.

This is a narrow, CPU-only slice: llama.cpp's Conformer/AuT audio encoders don't route through BLAS/AMX on CPU, so the reference spends ~99% of its time in the audio encoder. das's optimized fp32 scalar encoder comes out well ahead on that path — a GPU build of llama.cpp would tell a different story.

Canary-Qwen 2.5B (the only engine with a SALM reference, NeMo) — das leads on short dictation clips: 0.66× on jfk, 0.77× on jfk3. It trails on a 3-minute clip where it runs an un-quantized fp32 decoder — a known follow-up.

The framing, in full.

what das is
An LLM + ASR inference engine written entirely in daslang and JIT-compiled — no hand-written SIMD/assembly. The point is narrow but real: a scripting language keeping pace with hand-tuned C++ on the CPU path.
apples-to-apples
Everything here is CPU. The llama.cpp reference is built with no Accelerate/AMX BLAS on M1 (pure NEON/i8mm) for a like-for-like kernel comparison — not a comment on its GPU backends, which are broader and out of scope. Where a reference does get AMX (ASR *-cli on macOS), that's noted.
prefill vs decode
das wins prompt-processing (compute-bound); it trails single-token generation (memory-bandwidth-bound). Neither is cherry-picked without the other — the toggle above shows both.
quantization
LLM numbers are Q8. ASR is q8 encoder/decoder except audio-chat and Canary, which run fp32 for correctness. das output is verified token-for-token against each reference.
two machines
An Arm laptop (Apple M1 Max) and an x86 workstation (Ryzen Threadripper 3990X) show the same pattern — that's the point; it's not one lucky box.
dates & versions
daslang 0.6.3; measured 2026-07-09, Parsec off. llama.cpp ebd048f (M1) / fdb1db877 (zen2). Raw data lives in the JSON these charts render from.