New Judges, and New Runtimes

posted on April 9, 2020, 5:11 p.m.

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 :)


  • 19
    richardzhang  commented on April 10, 2020, 2:54 p.m.

    Long we have waited.

    Java? Baited.

    C++? Overrated.

    Python? Tolerated.



    • 8
      Plasmatic  commented on April 10, 2020, 5:36 p.m.

      what if dmoj makes an FP contest >.>

      • 8
        Xyene  commented on April 10, 2020, 5:49 p.m. edited

        I brought this up but nobody seemed super thrilled about the idea for some reason... :(

        7-problem contest, each only solvable in one of {OCaml, Haskell, F#, Scala, Racket, Chicken Scheme, Steel Bank Common Lisp}.

  • 10
    lilweege  commented on April 9, 2020, 8:11 p.m.

    Finally, walrus operators!

    • 7
      echofox  commented on April 10, 2020, 2:03 p.m.


  • 14
    pblpbl  commented on April 9, 2020, 7:57 p.m.

    What is the approximate speed of the judge in terms of operations per second now?

    • 9
      Xyene  commented on April 10, 2020, 2:29 p.m.

      To quote d, "if you're doing vectorization well, you can hit 18 billion increments / sec".

      The upgrade from GCC 8 to 9 (and Clang 7 to 9) yesterday also made some significant improvements in C/C++ speed. Benchmarks on the internet suggested a 5-10% speed increase between GCC 8 -march=bdver4 tuning and GCC 9 -march=zenver2, but in some problems like factorial2 we're seeing 2× speed increases on some submissions.