Skip to content

When -N doesn't equal -j, TH continually calls setNumCapabilities

While investigating #22960, I attempted to call GHC with -j > -N. -j controls how many modules may be compiled concurrently, while -N controls the amount of capabilities. Normally these are the same number, since if you don't explicitly set -N, the make driver code will set it to be the same as -j.

Strangely, the eventlog showed that capabilities would occasionally be created and destroyed. I found that the only other call to setNumCapabilities is in compiler/GHC/Runtime/Interpreter.hs.

It looks like createBCO has a slightly different copy of the capability logic found in the driver. Unlike the driver code it also changes the capability count even if -N has been manually set. createBCO is called while evaluating TH, so that explains the behaviour I was seeing.

A fix would be to harmonise the logic with what we have in the driver, but I'm confused why this code is calling setNumCapabilities at all. setNumCapabilities seems a bit heavy-weight to call in a function like this. I think the setNumCapabilities logic should be removed from createBCO altogether. According to git blame it was introduced to speed up remote TH. So, maybe it needs to be moved somewhere else on the remote TH side.

I'd be happy to make an MR

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information