Throughput against batch size
Operations per second, against batch size; both axes logarithmic.
Chart. The left and right arrow keys move between measured batch sizes; Home and End reach the first and last; Escape hides the reading.
A threshold, not a best point
Arrow keys on the chart inspect the next or previous measured batch. Home and End reach the bounds; Escape closes the reading.
All measured points
Time for one batch
Median time for the whole batch, in milliseconds, against batch size; both axes logarithmic.
Chart. The left and right arrow keys move between measured batch sizes; Home and End reach the first and last; Escape hides the reading.
Time per operation
Time per operation is batch time divided by batch size. It is not the wait for an individual request. Time spent filling the batch is excluded.
All measured batch times
Where the time goes
Check a batch in this browser
JavaScript runs ML‑KEM‑768 key generation and encapsulation for the same seeds, then compares each full-output digest with the recorded GPU digest.
Verified before it was timed
Passed / run, and identical / compared, for each operation and GPU.
Every timed run checked
¹ NIST’s ML‑KEM vectors test complete operations. The standalone NTT is checked coefficient by coefficient against the reference code, after its centred representatives are moved into [0, q).
Python reference and Keccak checks
One batch on the GPU, in five steps
Each horizontal lane represents an independent instance in the batch. Beneath each step, the kernels’ own mapping.
Key generation and encapsulation use this flow. The standalone NTT benchmark measures one forward transform per polynomial.
Method notes
Recorded evidence, with the timing boundary stated.
Sources and dates
The technical note sets out the method and results. The notebook contains the executed calculations and stored outputs.