Host
Intel Core Ultra 9 285K · 24 cores
Platform
linux/amd64
Go
go1.27.0
CPython
python:3.14-slim
PyPy
pypy:3.11-slim
Runs / combo
7 + 2 warmup

Dense neural-network layer

Forward pass of a 256x256 dense (fully-connected) layer with ReLU activation. The inner dot-product loop hits pipit's SIMD recogniser; every other runner runs it scalarly.

Compile time · median (cold)

median of 7 runs

Native Gocompiled
109 ms109×
Pipitbytecode VM
995 µsbaseline
CPython 3.14bytecode VM
450 µs0.45×
PyPy 7.3tracing JIT
321 µs0.32×
Ttengobytecode VM
238 µs0.24×
Sscriggobytecode VM
300 µs0.30×
Mmvmbytecode VM
323 µs0.32×
YyaegiAST walker
430 µs0.43×

Full statistics

RunnerNCompileRuntimeP95StddevRSSvs pipitStatus
Native Gocompiled7109 ms148 µs151 µs1.05 µs1.62 GiB109×OK
Pipitbytecode VM7995 µs831 µs851 µs15.0 µs592 MiB1.00×OK
CPython 3.14bytecode VM7450 µs25.1 ms25.6 ms254 µsn/a0.45×OK
PyPy 7.3tracing JIT7321 µs6.21 ms6.84 ms298 µsn/a0.32×OK
tengobytecode VM7238 µs22.9 ms31.3 ms3.92 ms1.69 GiB0.24×OK
scriggobytecode VM7300 µs14.1 ms23.5 ms4.37 ms1.69 GiB0.30×OK
mvmbytecode VM7323 µs18.2 ms18.4 ms199 µs1.69 GiB0.32×OK
yaegiAST walker7430 µs16.4 ms16.4 ms1.79 ms1.69 GiB0.43×OK
Workload & symmetry rules

Workload

For each of 256 output neurons: compute output[i] = relu(sum_j(W[i][j] * input[j]) + bias[i]) over a deterministically-seeded 256x256 weight matrix and 256-element input vector. Sum the activations, multiply by 1000, emit as a single integer so canonical hashing is FP-safe.

Symmetry rules

  • Hand-rolled scalar dot-product loop in every runner. No matrix libraries, no numpy, no SIMD intrinsics in the source.
  • The Go source is structured so pipit's pattern recogniser sees the inner loop as a dot-product and emits one subOpSimdDotProductFloat64 per row. The same source runs scalarly on every other Go-family interpreter.
  • Python emits a Python for loop over scalar floats; no numpy.dot.

Why this benchmark exists

It is the headline number for pipit's SIMD recogniser. Bench 14 (Mandelbrot) shows pure FP throughput; bench 22 (n-body) shows struct-in-FP-loop; this one specifically shows what the SIMD path is worth in a workload that maps to it perfectly. If the recogniser fires, pipit closes much of the gap to native Go.

Source code