Skip to content

Benchmark Ladder

Date: 2026-07-15

This ladder organizes mlx_atomistic benchmark rows by decision value. It is not a ranking across engines. Reference rows are used only where operation semantics and metric families line up.

LayerPurposeComparable rule
micro/kernelIsolate local MLX costs such as force terms, neighbor work, virtual-site reconstruction, and synchronization.Diagnostic unless a reference engine exposes the same operation and metric.
controlled MDRun tiny same-workload MD rows with matching atom and step semantics.Comparable only when both sides are ok and use the same metric family.
feature physicsTime MLX feature rows for GBSA/OBC, TIP4P-Ew, soft-core/lambda, and replica exchange.Comparable only after a matching OpenMM controlled case exists; otherwise diagnostic.
scalingSweep sizes or policies to tell fixed overhead from force-evaluation, neighbor-list, or memory-pressure costs.Usually MLX-only diagnostic; reference parity is separate.
reference parityMap controlled OpenMM rows to MLX rows and allow ratios only for matching metrics.Comparable, diagnostic, or blocked from normalized payload status.
stretchTrack real-system rows such as DHFR and bounded at-scale PME.Comparable only for manifest-matched operations; runtime-only rows stay diagnostic until metric semantics match.
RowLayerMLX commandOpenMM commandLAMMPS mappingMetric familyRaw outputComparability statusDecision value
lj-synthetic-loopcontrolled MD; reference parityuv run python -m mlx_atomistic.benchmarks.md_performance --sizes 32 --steps 1 --sample-interval 1 --diagnostic-interval 1 --evaluation-interval 1 --jsonuv run python scripts/benchmark_openmm_opencl.py --platform OpenCL --particles 32 --steps 1 --warmup-steps 0 --spacing-nm 1.0 --jsonSimple LJ-like smoke mapping may use uv run python scripts/benchmark_lammps_opencl.py --particles 32 --steps 1 --json; first-class LAMMPS parity is deferred.steps/s; ns/day only when timestep and step semantics are alignedresults/same-workload-openmm-comparison/mlx-lj-synthetic-loop.json; results/same-workload-openmm-comparison/openmm-lj-synthetic-loop.json; optional results/performance-audit-harness-hardening/lammps-fast.jsoncomparable only for MLX/OpenMM rows with matching atom count, step count, and timing metric; LAMMPS is diagnostic/deferredDecide whether tiny full-loop overhead deserves optimization before larger-system work.
gbsa-obc-smallfeature physics; reference parityuv run python -m mlx_atomistic.benchmarks.phase3_physics --evaluations 1 --waters 1 --atoms 4 --replica-steps 1 --jsonuv run python scripts/benchmark_openmm_opencl.py --case gbsa-obc-small --platform Reference --particles 4 --steps 1 --jsondeferred; no LAMMPS mapping in this slicems/eval latency; no mixed unit ratioMLX combined raw source: results/same-workload-openmm-comparison/mlx-phase3-controlled.json; MLX row extract: results/same-workload-openmm-comparison/mlx-gbsa-obc-small.json; OpenMM: results/same-workload-openmm-comparison/openmm-gbsa-obc-small.json; summary: results/same-workload-openmm-comparison/summary.json; audit source results/performance-audit-harness-hardening/phase3-physics-fast.jsoncomparable for the refreshed MLX/OpenMM Reference latency row; OpenMM reports fixture: gbsa_obc_small, status: ok, and obc_force_setupDecide whether GBSA/OBC force evaluation is an optimization target from the controlled latency row.
tip4p-ew-watermicro/kernel; feature physics; reference parityuv run python -m mlx_atomistic.benchmarks.phase3_physics --evaluations 1 --waters 1 --atoms 4 --replica-steps 1 --json; micro row: uv run python -m mlx_atomistic.benchmarks.mm_force_terms --evaluations 1 --particles 16 --jsonuv run python scripts/benchmark_openmm_opencl.py --case tip4p-ew-water --platform Reference --particles 4 --steps 1 --jsondeferred; no LAMMPS mapping in this slicems/eval latency for virtual-site reconstruction; no mixed unit ratioMLX combined raw source: results/same-workload-openmm-comparison/mlx-phase3-controlled.json; MLX row extract: results/same-workload-openmm-comparison/mlx-tip4p-ew-water.json; OpenMM: results/same-workload-openmm-comparison/openmm-tip4p-ew-water.json; summary: results/same-workload-openmm-comparison/summary.json; audit sources results/performance-audit-harness-hardening/phase3-physics-fast.json and results/performance-audit-harness-hardening/mm-force-terms-fast.jsoncomparable for the refreshed MLX/OpenMM Reference virtual-site reconstruction latency row; OpenMM reports operation_semantics: virtual_site_reconstruction and openmm_operation: Context.computeVirtualSitesDecide whether TIP4P-Ew overhead is reconstruction-specific or part of a broader water-workload cost.
soft-core-lambdafeature physicsuv run python -m mlx_atomistic.benchmarks.phase3_physics --evaluations 1 --waters 1 --atoms 4 --replica-steps 1 --jsondeferred mappingdeferredms/eval for lambda-grid energy/force derivative workresults/performance-audit-harness-hardening/phase3-physics-fast.json; future same-workload path under results/same-workload-openmm-comparison/ when mappeddiagnostic; reference parity deferredDecide whether lambda derivative work needs a larger opt-in sweep before optimization.
replica-exchangefeature physicsuv run python -m mlx_atomistic.benchmarks.phase3_physics --evaluations 1 --waters 1 --atoms 4 --replica-steps 1 --jsondeferred mappingdeferredms/eval, per-replica throughput, aggregate replica throughput, swap/history countersresults/performance-audit-harness-hardening/phase3-physics-fast.jsondiagnostic; reference parity deferredDecide whether replica execution, history materialization, or swap bookkeeping is the next MLX bottleneck.
scaling-sweepscalinguv run python -m mlx_atomistic.benchmarks.md_acceleration --include-large --evaluations 10 --json; uv run python -m mlx_atomistic.benchmarks.md_performance --include-large --steps 100 --jsondeferred until a controlled OpenMM sweep is specifieddeferred except simple LJ-like smoke notesms/eval, neighbor-build timing, steps/s; keep units separate by rowresults/mlx-md-acceleration.json; results/mlx-md-performance.json; audit smoke sources under results/performance-audit-harness-hardening/diagnostic for MLX scaling; reference parity deferredDecide whether overhead is fixed, neighbor-list dominated, memory-pressure dominated, or force-evaluation dominated.
dhfr-implicitstretch; reference parityuv run python -m mlx_atomistic.benchmarks.dhfr --case dhfr-implicit --steps 1 --jsonuv run python scripts/benchmark_openmm_dhfr.py --case dhfr-implicit --platform Reference --steps 1 --jsondeferredns/day for matching one-step GBSA/OBC rowsMLX: results/same-workload-openmm-comparison/mlx-dhfr-implicit.json; OpenMM Reference: results/same-workload-openmm-comparison/openmm-dhfr-implicit.json; summary: results/same-workload-openmm-comparison/summary.json; OpenMM OpenCL context: results/openmm-opencl-dhfr-m5max.jsoncomparable for the one-step MLX/OpenMM Reference smoke row; broader OpenCL context remains separateTrack the smaller DHFR real-system path and harden MLX artifact/runtime behavior before broad performance claims.
dhfr-explicit-pmestretch; reference parityuv run python -m mlx_atomistic.benchmarks.dhfr --case dhfr-explicit-pme --steps 1 --amber-topology results/inputs/Amber20_Benchmark_Suite/PME/Topologies/JAC.prmtop --amber-coordinates results/inputs/Amber20_Benchmark_Suite/PME/Coordinates/JAC.inpcrd --jsonuv run --with openmm python scripts/run_charged_pme_parity.py --mlx-prepared results/dhfr-artifacts/dhfr-explicit-pme --amber-prmtop results/inputs/Amber20_Benchmark_Suite/PME/Topologies/JAC.prmtop --amber-coordinates results/inputs/Amber20_Benchmark_Suite/PME/Coordinates/JAC.inpcrd --replicas 1,1,1 --platform OpenCL --out results/scalable-charged-pme-runtime/jac-1xdeferredmanifest-matched energy/complete-force parity; MLX ns/day is diagnostic until a matching OpenMM runtime row existsresults/scalable-charged-pme-runtime/jac-1x/charged_pme_parity_report.json; results/scalable-charged-pme-runtime/jac-1x/runtime-smoke.json; OpenMM OpenCL context: results/openmm-opencl-dhfr-m5max.jsonparity passed and the explicit-plasma MLX step is runnable; no throughput ratio because runtime schemas do not matchKeep the charged-system convention explicit and improve the measured runtime without weakening parity or fail-closed policy.
jac-charged-pme-94kstretch; scaling; reference parityuv run python -m mlx_atomistic.benchmarks.charged_pme runtime --prepared results/larger-system-scaling/jac-2x2x1-modern/prepared --warmups 10 --steps 75 --seed 17 --out results/larger-system-scaling/jac-2x2x1-modern/matched-runtime-v2/mlx_runtime.jsonuv run --no-sync python scripts/run_openmm_charged_pme_runtime.py ... --replicas 2,2,1 --platform OpenCL --precision single --warmups 10 --steps 75 --out results/larger-system-scaling/jac-2x2x1-modern/matched-runtime-v2deferredmanifest-matched energy/complete-force parity and fixed-cell NVT throughputparity/profile JSON under results/scalable-charged-pme-runtime/jac-2x2x1/; matched runtime under results/larger-system-scaling/jac-2x2x1-modern/matched-runtime-v2/; scalable-charged-pme-runtime-m5max.mdcomparable on the exact 75-step protocol; MLX/OpenMM = 9.7586xPreserve the bounded charged-PME envelope and target the remaining direct-nonbonded cost without weakening parity.
gpcrmd-729-pme-92kstretch; reference parityuv run python -m mlx_atomistic.prep.gpcrmd_benchmark --target-id gpcrmd-729-beta1-5f8u-cyanopindolol --prepared results/gpcrmd-pme-runtime-closure/prepared --protocol-manifest results/gpcrmd-pme-runtime-closure/prepared/mlx-workload-manifest.json --warmups 1 --measured-steps 2 --checkpoint-restart --out results/gpcrmd-pme-runtime-closure/runtime --force --jsonuv run --with openmm python scripts/run_gpcrmd_pme_parity.py --source-manifest results/gpcrmd-pme-runtime-closure/source/fixture-manifest.json --cache notebooks/ligand-receptor-motion/data/gpcrmd-cache/729 --mlx-prepared results/gpcrmd-pme-runtime-closure/prepared --platform OpenCL --out results/gpcrmd-pme-runtime-closure/paritydeferredmanifest-matched total/component energy and complete-force parity; MLX bounded fixed-cell NVT, restart, and PME-stage diagnosticssource, parity, runtime, profile, and blocker-matrix evidence under results/gpcrmd-pme-runtime-closure/; gpcrmd-729-pme-runtime-m5max.mdparity passed at 92,001 atoms and bounded MLX runtime/restart passed; no throughput ratio without a matching OpenMM NVT runtime manifestClose the selected fixture’s stale topology/PME blockers while retaining the fixed-cell NVT and short-run claim boundary.
  • OpenMM parity rows belong under scripts/ and emit normalized ok, diagnostic, or blocked payloads. Ratios are valid only for matching ok rows.
  • LAMMPS is deferred for this ladder except for simple LJ-like smoke notes. Do not map LAMMPS materials, protein, or package-specific benchmark families to MLX rows without a separate same-workload plan.
  • DHFR now has explicit same-workload row IDs. dhfr-implicit is runnable as a one-step GBSA/OBC smoke row. dhfr-explicit-pme, the 94,232-atom JAC supercell, and GPCRmd 729 pass manifest-matched energy/complete-force parity under their declared charge policies. Their MLX runtime rows do not receive an OpenMM throughput ratio without matching OpenMM runtime manifests. ApoA1, Cellulose, and STMV OpenMM reports remain reference context until matching MLX workloads exist.