{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "xbill",
  "title_listed": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x",
  "keywords": "",
  "domain": "大模型算法",
  "content_type": "工程实践",
  "is_paid_flag": "否",
  "url": "https://dev.to/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56",
  "publish_date": "2026-09-23",
  "corpus_stage": "",
  "notes": "",
  "id": "92375b2c2507",
  "collected_at": "2026-10-02T13:51:17",
  "title": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x - DEV Community",
  "body_markdown": "This article provides a step by step guide to measuring a laptop GPU against the CPU in the same chassis for serving Gemma 4 E2B through llama.cpp, with both builds on a fresh Debian sid toolchain and the passes run in ABBA order so heat cannot pick the winner. A suite of Python MCP tools is built to simplify management of the llama.cpp hosted deployment.\nhttps://github.com/xbill9/gemma4-dev\nThe GTX 1650 Ti decodes\n4.14x\nfaster than the i7-10750H it shares a chassis with, prefills\n3.42x\nfaster and finishes requests\n3.62x\nfaster end to end. Running the two devices in one order and then the other moves that decode ratio from 4.09x to 4.17x, so a single-order benchmark on this laptop is off by about 2%.\nWhat Is Being Measured?\nThe same 3.35 GB quantization-aware GGUF,\ngoogle/gemma-4-E2B-it-qat-q4_0-gguf\n, served by\nllama-server\ntwice on one laptop: once on the CPU, once on the GPU. Both builds come from one llama.cpp commit and the two command lines differ by one flag.\nAn earlier run of this comparison is published as\nA 4 GB Laptop GPU Beats a 12-Core CPU by 4.3x on Gemma 4\n. This one re-measures it after the laptop moved to Debian sid, with three changes: a newer llama.cpp commit built on gcc 16.2 and CUDA 13.4, thread flags set for this CPU's real core count, and a run order that cancels thermal drift.\nAt This Point You Should Have…\nAn NVIDIA GPU with a CUDA driver — here a GTX 1650 Ti with Max-Q Design, driver 615.71.09\nThe CUDA toolkit —\nnvcc\n13.4 here\ncmake\nand a host compiler CUDA accepts — gcc 16.2.0 here\nPython 3.10 or newer, the system\npython3\n, no virtualenv\nThe repository cloned, with\nlocal-llamacpp-1650ti-2b-q4_0/\nand\nlocal-llamacpp-cpu-2b-q4_0/\nside by side\nClaude Code, or any MCP client that speaks stdio\nThe Laptop\nMachine\nLenovo Yoga 9 15IMH5\nCPU\nIntel Core i7-10750H, 6 cores / 12 threads, AVX2\nGPU\nGeForce GTX 1650 Ti with Max-Q Design, 4096 MiB, compute capability 7.5\nOS\nDebian GNU/Linux forky/sid, kernel 7.2.6\nCompiler\ngcc 16.2.0\nCUDA\n13.4 (V13.4.92)\nllama.cpp\nf95b0d9\n, build 318\nThe CPU and the Max-Q card sit under one cooling system, which is why the run order below matters.\nStep 1 — Check the Toolchain Still Supports the Card\nA distribution upgrade can move the compiler past what CUDA accepts, and a CUDA upgrade can drop old GPUs. Both were close here.\n$\nnvidia-smi\n--query-gpu\n=\nname,compute_cap,memory.total,driver_version\n--format\n=\ncsv\nname, compute_cap, memory.total [MiB], driver_version\nNVIDIA GeForce GTX 1650 Ti with Max-Q Design, 7.5, 4096 MiB, 615.71.09\n$\nnvcc\n--list-gpu-arch\ncompute_75\ncompute_80\ncompute_86\n...\nEnter fullscreen mode\nExit fullscreen mode\nThe card is compute capability 7.5, and\ncompute_75\nis the first entry CUDA 13.4 lists. This laptop's GPU is the oldest architecture the current toolkit still builds for.\n$\ngcc\n--version\ngcc (Debian 16.2.0-3) 16.2.0\n$\ngrep\n-n\n'later than 16'\n/usr/local/cuda/include/crt/host_config.h\n137:#\nerror\n--\nunsupported GNU version! gcc versions later than 16 are not supported! ...\nEnter fullscreen mode\nExit fullscreen mode\nCUDA 13.4 accepts gcc up to 16, and sid ships 16.2.\nStep 2 — Build Both Devices From One Commit\nEach rig's Makefile carries its own\nbuild\ntarget. The GPU build targets only this card's architecture, sm_75; the CPU build turns every GPU backend off.\n# local-llamacpp-1650ti-2b-q4_0\ncmake\n-S\n~/llama.cpp\n-B\n~/llama.cpp/build\n-DGGML_CUDA\n=\nON\n-DCMAKE_CUDA_ARCHITECTURES\n=\n75\n-DGGML_NATIVE\n=\nON\n-DCMAKE_BUILD_TYPE\n=\nRelease\ncmake\n--build\n~/llama.cpp/build\n--config\nRelease\n-j6\n--target\nllama-server llama-bench\n# local-llamacpp-cpu-2b-q4_0\ncmake\n-S\n~/llama.cpp\n-B\n~/llama.cpp/build-cpu\n-DGGML_CUDA\n=\nOFF\n-DGGML_VULKAN\n=\nOFF\n-DGGML_NATIVE\n=\nON\n-DCMAKE_BUILD_TYPE\n=\nRelease\ncmake\n--build\n~/llama.cpp/build-cpu\n--config\nRelease\n-j6\n--target\nllama-server llama-bench\nEnter fullscreen mode\nExit fullscreen mode\nBoth binaries report the same commit and compiler:\n$\n~/llama.cpp/build/bin/llama-server\n--version\nversion: 0.4.1-dev (build 318, commit f95b0d9)\nbuilt with GNU 16.2.0 for Linux x86_64\n$\n~/llama.cpp/build-cpu/bin/llama-server\n--version\nversion: 0.4.1-dev (build 318, commit f95b0d9)\nbuilt with GNU 16.2.0 for Linux x86_64\nEnter fullscreen mode\nExit fullscreen mode\nAnd only one of them can see the card:\n$\n~/llama.cpp/build/bin/llama-server\n--list-devices\nAvailable devices:\n  CUDA0: NVIDIA GeForce GTX 1650 Ti with Max-Q Design (3732 MiB, 3671 MiB free)\n$\nCUDA_VISIBLE_DEVICES\n=\n~/llama.cpp/build-cpu/bin/llama-server\n--list-devices\nAvailable devices:\n  (none)\nEnter fullscreen mode\nExit fullscreen mode\n🔎 Tip: Always Give the CUDA Build a Job Count\ncmake --build -j\nwith no number starts every CUDA source file at once. llama.cpp has about 188 of them, each\nnvcc\nforks\ncicc\nand\ncudafe++\n, and a 15 GiB laptop runs out of memory. At\n-j6\nthe full CUDA build peaked at 4.0 GiB and never touched swap, so the limit costs nothing. Both Makefiles pass\n-j$(BUILD_JOBS)\nwith a default of 6.\nAfter a compiler or CUDA upgrade, delete the build directory before configuring. A stale\nCMakeCache.txt\nkeeps the old compiler, and\n/usr/local/cuda\nis a symlink, so the cached path looks current.\nStep 3 — Serve One Device at a Time on the Same Port\nBoth devices serve on\n127.0.0.1:8080\n, so the endpoint, the prompts and the benchmark script stay fixed while the device changes underneath. The flags match except for\n-ngl\n, the number of layers offloaded to the GPU:\nllama-server\n-m\ngemma-4-E2B_q4_0-it.gguf\n--host\n127.0.0.1\n--port\n8080\n\\\n-ngl\n{\n0|99\n}\n-c\n8192\n-ctk\nf16\n-ctv\nf16\n-fa\n1\n-t\n6\n-tb\n12\n--parallel\n1\n--metrics\nEnter fullscreen mode\nExit fullscreen mode\n-t 6 -tb 12\nmatches the CPU's six physical cores and twelve threads, and both devices get it. GPU decode barely responds to thread count, so matching them costs the GPU nothing and removes one difference between the two runs.\nFor the GPU side there is a small wrapper,\nllamacpp-1650ti\n, that reads these values out of the rig's\ntpu.env\n, starts the server in the background and checks which device answered:\n$\nllamacpp-1650ti start\nllamacpp-1650ti: starting /home/xbill/models/gemma-4-E2B-it-qat-q4_0/gemma-4-E2B_q4_0-it.gguf on 127.0.0.1:8080 (-ngl 99)\nllamacpp-1650ti: pid 88166, log /home/xbill/gemma4-dev/local-llamacpp-1650ti-2b-q4_0/run/llama-server.log\nllamacpp-1650ti: waiting up to 180s for http://127.0.0.1:8080/health\n     0s  VRAM 3 MiB, 0 %\nllamacpp-1650ti: healthy after 2s -- http://127.0.0.1:8080\nllamacpp-1650ti: device=gpu · pid=88166 · -ngl 99 · mapped: ggml-cuda, libcublas, libcuda, libcudart · /home/xbill/llama.cpp/build/bin/llama-server\n$\nllamacpp-1650ti stop\nllamacpp-1650ti: sent SIGTERM to pid 88166;\nVRAM is released on\nexit\nEnter fullscreen mode\nExit fullscreen mode\nThe wrapper refuses to start if anything already holds the port, and refuses to stop the CPU build if that is what holds it.\nStep 4 — Read the Device Off the Running Process\nBoth devices answer the same URL with the same JSON, so the HTTP response cannot say which one produced it. The rigs'\nattest.py\nreads it from\n/proc\ninstead:\n/proc/<pid>/exe\nfor the binary,\n/proc/<pid>/maps\nfor the GPU libraries it has loaded,\n/proc/<pid>/cmdline\nfor the real\n-ngl\n. The benchmark script refuses to start if the answer is the wrong device, and writes it at the top of every log:\narm: device=cpu · pid=72478 · -ngl 0 · /home/xbill/llama.cpp/build-cpu/bin/llama-server\narm: device=gpu · pid=74308 · -ngl 99 · mapped: ggml-cuda, libcublas, libcuda, libcudart · /home/xbill/llama.cpp/build/bin/llama-server\nEnter fullscreen mode\nExit fullscreen mode\nmaps\nis used because llama.cpp loads its CUDA backend at runtime, where\nldd\ndoes not see it. Each report also records the SHA-256 of the executable that ran:\n9c88c7821fcc11a6…\nfor the CPU build and\n9f2a8b0b6ed5365d…\nfor the GPU build, the same on both passes of each.\nThe MCP servers expose the same check as a tool, so an agent that starts a server can confirm what it started before it measures anything.\nStep 5 — Run in ABBA Order With a Temperature Gate\nEach device gets two passes, in the order CPU, GPU, GPU, CPU. Each device then has one early pass and one late pass, so a slow drift in the laptop's temperature over the session affects both equally. Before every pass the script waits at least 120 seconds and until the CPU package is at or below 50 °C and the GPU at or below 45 °C.\n13:20:12 pkg=38C gpu=36C throttle=35105 START cpu pass1\n13:27:57 pkg=85C gpu=52C throttle=44709 END cpu pass1 rc=0\n13:30:00 pkg=45C gpu=40C throttle=44730 START gpu pass1\n13:32:12 pkg=79C gpu=56C throttle=45150 END gpu pass1 rc=0\n13:34:15 pkg=42C gpu=39C throttle=45150 START gpu pass2\n13:36:26 pkg=78C gpu=55C throttle=48034 END gpu pass2 rc=0\n13:38:29 pkg=41C gpu=39C throttle=48060 START cpu pass2\n13:46:31 pkg=82C gpu=53C throttle=67346 END cpu pass2 rc=0\nEnter fullscreen mode\nExit fullscreen mode\nthrottle\nis the CPU package's cumulative thermal-throttle counter. CPU pass 1 added 9,604 events, the two GPU passes 420 and 2,879, and CPU pass 2 added 19,279. A CPU pass takes about eight minutes and a GPU pass about two.\nEach pass is the same sweep: four prompt lengths by two output lengths, three repeats per cell, one request at a time.\npython3 sweep.py\n--base\nhttp://127.0.0.1:8080/v1\n--out\n<run>/passN\n--rig\n<rig>\n--expect-device\n<cpu|gpu>\nEnter fullscreen mode\nExit fullscreen mode\nThe Result\nEach figure is the mean of the two passes' per-cell medians. Decode is the token rate measured off the response stream; TTFT is time to first token.\nin tok\nout tok\nCPU decode\nGPU decode\nGPU lead\nCPU TTFT ms\nGPU TTFT ms\nGPU lead\n94\n32\n18.31\n71.89\n3.93x\n1084\n381\n2.84x\n94\n128\n17.96\n71.57\n3.98x\n1171\n385\n3.04x\n516\n32\n17.06\n70.61\n4.14x\n5528\n1608\n3.44x\n516\n128\n17.19\n70.35\n4.09x\n5527\n1610\n3.43x\n998\n32\n16.10\n69.25\n4.30x\n11071\n3242\n3.41x\n998\n128\n16.77\n69.38\n4.14x\n11057\n3246\n3.41x\n1959\n32\n16.14\n68.52\n4.25x\n23118\n6497\n3.56x\n1959\n128\n16.37\n68.22\n4.17x\n22718\n6496\n3.50x\nMedians over the eight cells: decode\n4.14x\n, prefill\n3.42x\n, end to end\n3.62x\n.\nDecode stays nearly flat on both devices across a 21x range of prompt length (94 to 1959 tokens), from 18.31 down to 16.14 tok/s on the CPU and from 71.89 down to 68.22 on the GPU, while TTFT grows in proportion to the prompt on both. Decode reads the model once per token and is limited by memory bandwidth; prefill does arithmetic over the whole prompt. The GPU wins both, by different margins, and the prefill margin grows with the prompt from 2.84x to 3.56x.\nIs the Difference Bigger Than the Noise?\nBy an order of magnitude. The decode ratio stays between 3.93x and 4.30x in every cell. The noise is the drift between a device's two passes:\ndecode drift, pass 1 to pass 2\nworst cell\nGPU\nmedian\n+0.6%\n, range 0.0% to +1.3%\n—\nCPU\nmedian\n-1.1%\n, range -9.3% to +0.1%\n998 in / 32 out: 16.89 → 15.32\nWithin a pass, the three repeats of a cell spread by at most 1.14% on the GPU. On the CPU they spread by at most 2.69% in pass 1 and\n14.05%\nin pass 2, which had twice the throttle events. CPU time to first token also rose in pass 2, by up to 7.4% at the longest prompt, while the GPU's moved by at most 0.9%.\nAll of the measurable noise in this comparison comes from the CPU, and it tracks heat.\nWhat Is Run Order Worth?\nEach ordering can be read on its own. CPU pass 1 against GPU pass 1 is the CPU-first design; GPU pass 2 against CPU pass 2 is GPU-first.\norder\ndecode ratio\nprefill ratio\nCPU first, then GPU\n4.09x\n3.38x\nGPU first, then CPU\n4.17x\n3.47x\nABBA, both\n4.14x\n3.42x\nRunning the CPU first understates the GPU's lead, because the CPU pass runs while the laptop is still cool and the GPU pass inherits its heat. On this laptop the effect is about 2% of the ratio. ABBA order removes it for the cost of one extra pass per device.\n🔎 Tip: Count Tokens, Not Stream Chunks\nllama.cpp can put more than one token in a streamed chunk, so a decode rate computed from chunk timing undercounts. Recomputed as completion tokens over the measured decode time, the rates read 16.77-20.27 tok/s on the CPU and 69.87-79.58 on the GPU, and the median ratio stays at\n4.14x\n. Both devices run the same server code, so the undercount cancels in the ratio. It does not cancel when comparing either absolute figure against a different server.\n🔎 Tip: Confirm the Prompt Cache Stayed Cold\nllama-server\nreuses the key/value cache for a prompt prefix it has seen, which makes time to first token look faster than prefill really is. Each prompt starts with a unique prefix, and\n--metrics\nexposes a counter that confirms it:\ncpu pass1: llamacpp:prompt_tokens_total 28553 llamacpp:prompt_tokens_cached_total 0\ncpu pass2: llamacpp:prompt_tokens_total 28553 llamacpp:prompt_tokens_cached_total 0\ngpu pass1: llamacpp:prompt_tokens_total 28553 llamacpp:prompt_tokens_cached_total 0\ngpu pass2: llamacpp:prompt_tokens_total 28553 llamacpp:prompt_tokens_cached_total 0\nEnter fullscreen mode\nExit fullscreen mode\nNone of the 28,553 prompt tokens in any pass came from the cache.\nCompare and Contrast\n🥇 GTX 1650 Ti\n🥈 i7-10750H\nDecode, single stream\n68.22-71.89 tok/s\n16.10-18.31 tok/s\nTime to first token, 1959-token prompt\n6.5 s\n22.7-23.1 s\nPass-to-pass drift\n≤1.3%\nup to 9.3%\nThrottle events per pass\n420 and 2,879\n9,604 and 19,279\nPass length\nabout 2 minutes\nabout 8 minutes\nSo, Which One?\nThe GPU, for any interactive use of this model on this laptop. It is about four times faster on every prompt length measured, it is steadier, and it heats the shared package far less than the CPU does for the same work.\nThe CPU build is still worth keeping: it serves the same model at 16-18 tok/s when the card is busy or absent. It is also the device to benchmark with the most care, because its numbers move with the laptop's temperature.\nHow Does This Compare With the Earlier Run?\nThe earlier run measured 4.27x decode and 3.63x prefill. Three things changed at once — the llama.cpp commit (\nc6824a9\nto\nf95b0d9\n), the thread flags (\n-t 4 -tb 8\nto\n-t 6 -tb 12\n) and the run order — so the difference between the two results cannot be assigned to any one of them. The more-threads explanation fits the direction, since CPU time to first token fell and the prefill ratio narrowed with it, but this run does not isolate it.\nSummary\nThe goal of this article was to re-measure a 4 GB laptop GPU against the 6-core CPU in the same chassis for serving Gemma 4 E2B, after a toolchain upgrade and with thermal drift controlled. The key to the solution was ABBA ordering with a temperature gate, identical flags on both devices apart from\n-ngl\n, and reading the serving device from\n/proc\non every pass. The results were:\n🟢 GPU decode is\n4.14x\nthe CPU, 3.93x to 4.30x across every cell\n🟢 GPU prefill is\n3.42x\n, growing with prompt length; end to end is\n3.62x\n🟢 The GTX 1650 Ti still builds and runs on CUDA 13.4 with gcc 16.2, as the oldest architecture that toolkit supports\n⚠️ Run order is worth about 2% of the ratio here: 4.09x CPU-first against 4.17x GPU-first\n⚠️ The CPU carries all of the measurable noise, up to 9.3% between passes and 14% within one, and it follows the throttle count\n❌ The earlier 4.27x and this 4.14x cannot be compared directly, because commit, threads and order all changed together\nScope: one laptop, one GGUF, llama.cpp\nf95b0d9\nbuilt twice with gcc 16.2 and CUDA 13.4, eight paired cells, two passes per device in ABBA order, three repeats per cell per pass, one request at a time, prompt cache verified cold, page cache warm throughout.\nThe strategy for using MCP for local accelerator comparison was validated with an incremental step by step approach.\nReferences\nRepository:\nhttps://github.com/xbill9/gemma4-dev\nGPU rig:\nhttps://github.com/xbill9/gemma4-dev/tree/main/local-llamacpp-1650ti-2b-q4_0\nCPU rig:\nhttps://github.com/xbill9/gemma4-dev/tree/main/local-llamacpp-cpu-2b-q4_0\nRun report:\nhttps://github.com/xbill9/gemma4-dev/blob/main/local-llamacpp-1650ti-2b-q4_0/benchmarks/runs/2026-09-22-paired-sweep-1650ti/REPORT.md\nEarlier run:\nA 4 GB Laptop GPU Beats a 12-Core CPU by 4.3x on Gemma 4\nModel:\nhttps://huggingface.co/google/gemma-4-E2B-it-qat-q4_0-gguf\nllama.cpp:\nhttps://github.com/ggml-org/llama.cpp",
  "metadata": {
    "title": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x - DEV Community",
    "description": "Gemma 4 E2B q4_0 served by llama.cpp on one laptop, CPU-only and on a GTX 1650 Ti, rebuilt on CUDA 13.4 and re-measured in CPU, GPU, GPU, CPU order with a temperature gate. The card takes decode by 4.14x, and run order moves the answer by about 2%. Tagged with gemma, llamacpp, cuda, benchmarking.",
    "keywords": "gemma, llamacpp, cuda, benchmarking, software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56",
    "og:title": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x",
    "og:description": "Gemma 4 E2B q4_0 served by llama.cpp on one laptop, CPU-only and on a GTX 1650 Ti, rebuilt on CUDA 13.4 and re-measured in CPU, GPU, GPU, CPU order with a temperature gate. The card takes decode by 4.14x, and run order moves the answer by about 2%.",
    "og:site_name": "DEV Community",
    "og:image": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxbill9%2Fgemma4-dev%2Fmain%2Fdocs%2Fcpu-vs-1650ti-abba%2Fdevto-cover.78380332.jpg",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@",
    "twitter:title": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x",
    "twitter:description": "Gemma 4 E2B q4_0 served by llama.cpp on one laptop, CPU-only and on a GTX 1650 Ti, rebuilt on CUDA 13.4 and re-measured in CPU, GPU, GPU, CPU order with a temperature gate. The card takes decode by 4.14x, and run order moves the answer by about 2%.",
    "twitter:card": "summary_large_image",
    "twitter:widgets:new-embed-design": "on",
    "twitter:image:src": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxbill9%2Fgemma4-dev%2Fmain%2Fdocs%2Fcpu-vs-1650ti-abba%2Fdevto-cover.78380332.jpg"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/92375b2c2507/code/body-000.txt",
      "chars": 269,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-001.txt",
      "chars": 203,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-002.txt",
      "chars": 495,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-003.txt",
      "chars": 271,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-004.txt",
      "chars": 258,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-005.txt",
      "chars": 153,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-006.txt",
      "chars": 646,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-007.txt",
      "chars": 224,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-008.txt",
      "chars": 460,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-009.txt",
      "chars": 105,
      "language": "text"
    },
    {
      "file": "attachments/92375b2c2507/code/body-010.txt",
      "chars": 336,
      "language": "text"
    }
  ],
  "images": [],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://github.com/xbill9/gemma4-dev",
      "label": "https://github.com/xbill9/gemma4-dev",
      "type": "a"
    },
    {
      "href": "https://dev.to/gde/a-4-gb-laptop-gpu-beats-a-12-core-cpu-by-43x-on-gemma-4-4150",
      "label": "A 4 GB Laptop GPU Beats a 12-Core CPU by 4.3x on Gemma 4",
      "type": "a"
    },
    {
      "href": "https://github.com/xbill9/gemma4-dev/tree/main/local-llamacpp-1650ti-2b-q4_0",
      "label": "https://github.com/xbill9/gemma4-dev/tree/main/local-llamacpp-1650ti-2b-q4_0",
      "type": "a"
    },
    {
      "href": "https://github.com/xbill9/gemma4-dev/tree/main/local-llamacpp-cpu-2b-q4_0",
      "label": "https://github.com/xbill9/gemma4-dev/tree/main/local-llamacpp-cpu-2b-q4_0",
      "type": "a"
    },
    {
      "href": "https://github.com/xbill9/gemma4-dev/blob/main/local-llamacpp-1650ti-2b-q4_0/benchmarks/runs/2026-09-22-paired-sweep-1650ti/REPORT.md",
      "label": "https://github.com/xbill9/gemma4-dev/blob/main/local-llamacpp-1650ti-2b-q4_0/benchmarks/runs/2026-09-22-paired-sweep-165",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/google/gemma-4-E2B-it-qat-q4_0-gguf",
      "label": "https://huggingface.co/google/gemma-4-E2B-it-qat-q4_0-gguf",
      "type": "a"
    },
    {
      "href": "https://github.com/ggml-org/llama.cpp",
      "label": "https://github.com/ggml-org/llama.cpp",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:48:26Z",
  "source_url": "https://dev.to/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 16064,
  "expected_body_images": 0,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/92375b2c2507/pages/source.html",
  "local_html": "attachments/92375b2c2507/pages/article.html",
  "body_base_path": "attachments/92375b2c2507/pages/",
  "body_markdown_path": "attachments/92375b2c2507/pages/article.md"
}