Skip to content

Benchmarks

These are the escpod align measurements carried over from escapepod-rs 0.31.0. The binary was escpod align then; the numbers were measured on the original binary and not re-measured for eschalign. The full notes, including the long-read kernel work, are in benchmarks/README.md.

Samples are dorado uBAMs aligned against the sacCer3 dual-adapter panel (164 references, 138–200 nt, 24,790 bases) with default scoring (2,-1,-10,-1, local). M4 has 3,296,074 reads; M1 has 489,795 reads (mean length 122 nt, max ~400 kb).

CPU

srun -p rna -c 32 --mem=32G (Gold 6240R, 16 cores + HT), -t 32. Two reps, rep 1 / rep 2.

sample kernel wall (s) CPU (s) MaxRSS (MiB) reads/s
M4, 3.30 M reads avx512 117.0 / 117.6 3,256 / 3,264 2,746 / 2,717 28,172 / 28,023
M4 avx2 114.1 / 113.2 3,407 / 3,402 2,339 / 2,349 28,895 / 29,120
M1, 0.49 M reads avx512 19.0 / 19.5 483 / 480 2,356 / 2,329 25,779 / 25,156
M1 avx2 16.8 / 17.0 499 / 500 2,229 / 2,203 29,120 / 28,778
M1 scalar 484.8 / 484.8 15,273 / 15,274 1,497 / 1,484 1,010 / 1,010

On Cascade Lake AVX-512 does not beat AVX2 here: 512-bit integer ops issue on ports 0 and 5 only, and the kernel is ALU-bound. AVX-512 spends ~4% less CPU; AVX2 finishes ~3% sooner on wall. ESCHALIGN_BACKEND=avx2 is the lever.

The step this replaces (bwa mem -k 6 + samtools calmd in aa-tRNA-seq-pipeline) is budgeted 160 GB and 12 h per sample and measured at 78–90 GiB RSS; eschalign is ~2 minutes and under 3 GiB for a 3.3 M-read sample, and memory is set by --batch-size, not by the reads.

GPU

Both arms on one gpu node (-c 16, Xeon Gold 6326, one A30), the same --features gpu release build, --device cpu against --device gpu, arms interleaved, M4:

arm wall (s) CPU (s) MaxRSS (MiB) reads/s
--device cpu 183.8 / 184.2 2,898 / 2,900 1,967 / 1,951 17,930 / 17,895
--device gpu 69.2 / 69.0 685 / 682 3,079 / 3,066 47,659 / 47,790

The GPU arm wins on wall (2.66×) at a quarter of the CPU, and the output is byte-identical. See GPU.

Long reads

A tRNA sample's median read is ~130 nt, but M1 carries reads up to ~400 kb. Reads of 1,024 nt or more take a reference-major score kernel, and reads of 16 kb or more are scored across the thread pool, with byte-identical output. ESCHALIGN_ROW_MAJOR_ONLY=1 turns both off for A/B runs. On M1 (rna, -t 32) the avx512 arm went from 19.2 / 19.5 s to 15.2 / 15.3 s wall. Kernel-level numbers are in benchmarks/README.md.

Reproducing

benchmarks/benchmark_align.sh is the interleaved end-to-end harness (its header documents the flags). Arms (binary × backend × device × sort order) are interleaved, not grouped, the input is paged in once before the first arm, and CPU is reported beside wall.

srun -p rna -c 32 --mem=32G -- benchmarks/benchmark_align.sh \
    --reads sample.ubam --reference trna.fa --md5 --reps 3

Benchmark output belongs under results/ or ~/scratch/<topic>/, never ~/.cache.