New Judges, and New Runtimes
It's been a while since we've posted an update on what we've been working on, so we felt it was about time for one.
New Baremetal Judges
The biggest news we have to share is already over a month old by now: DMOJ judges now run on a dedicated, bare-metal machine!
Until now we've sourced our judges from cloud providers, but that has always been a bit of hardware roulette: sometimes a judge VM would be provisioned on Intel hardware, while other times our provider would give us shiny new AMD EPYC cores. Typically, these machines were also overcommitted by our hosts, so timing consistency between submissions was at the mercy of potentially noisy neighbours.
No longer! We've gone and purchased real hardware to run judges on: a 6-core (12-thread) AMD Ryzen 5 3600X @ 3.8 GHz, with 16 GB 3200 MHz CL16 dual-channel RAM. Frequency scaling has been disabled for timing consistency. Each judge runs in a QEMU instance allocated 2 GB RAM and 1 physical core (2 threads).
These judges are much (2-5×) faster than the old ones (and empirically, much more consistent). As a result, problem time limits have been rescaled based off a randomized sample of submissions — some problems may currently have time limits that are either too low, or too high. If you think you've run into such a problem, please let us know in Slack.
New Runtime Versions
We maintain Docker images based off stable Debian (Buster) with runtimes as part of the DMOJ/runtimes-docker project; these are the runtimes used by judges on the DMOJ. Since the GCC in Buster (version 8) was incorrectly identifying the Zen 2 judges as Bulldozer, we've upgraded our images to Debian Sid in order to get GCC 9. Apart for better support for our judges, you can read what's new here.
As a side-effect of upgrading to Sid, we now have much newer versions of most runtimes.
Notably, Python 3 has been upgraded from 3.7 to 3.8, and Clang from 7 to 9. OCaml was also upgraded from 4.05 to 4.10; we took this opportunity to rewrite the OCaml backend to link Jane Street Core/Base/Stdio and Zarith libraries, for a nicer functional programming experience :)