[GHC] #8972: Investigate adding fast compare-and-swap Int type/primops
GHC
ghc-devs at haskell.org
Fri May 2 13:26:46 UTC 2014
#8972: Investigate adding fast compare-and-swap Int type/primops
-------------------------------------+------------------------------------
Reporter: tibbe | Owner: tibbe
Type: feature request | Status: new
Priority: normal | Milestone: 7.10.1
Component: Compiler | Version: 7.9
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets: #8157, #7883
-------------------------------------+------------------------------------
Comment (by nominolo):
Replying to [comment:6 rrnewton]:
> I suspect the problem with atomicModifyIORef's poor behavior may have to
do with blackholes? Tracing ghc events will perturb these workloads a
bunch I guess, but maybe threadscope could still tell us something wrt
blackhole events.
We were affected by this issue and looked at the thread status of all
threads and noticed that they all get blocked on a blackhole. We suspect
there are two issues here:
1. Poor cache behaviour due to the CAS retry busy loop.
2. All the threads get queued up waiting for the thread that currently
owns the blackhole to get scheduled again.
The second point is a potential issue for many other applications (e.g,.
if a thread is holding on to an MVar). In the operating system world they
deal with those kinds of issues either using:
- interrupt blocking: i.e., a thread cannot be de-scheduled while holding
the lock
- time-slice donation / priority boosting: If a thread enters a critical
section and still has some alotted compute time left, it "donates" that
time to the thread owning the critical section, so that it will make
progress and leave the critical section. If you have thread priorities
then you can temporarily raise the priority of the thread in the critical
section. This rather complicated because priority boosting may have to be
recursive (you have to boost to the priority of the highest-priority
thread waiting), so not everyone likes this method.
For GHC, I think it could be useful to have both mechanisms available.
Marking a thread as non-interruptable could be exported from a "Here be
dragons" module for using when you know that a thread will hold a
lock/MVar only for a very short time.
For thunks, when a thread blocks on a blackhole, the scheduler should
probably then schedule that thread next. This way, the time spent
evaluating a blackhole will be proportional to the number of threads
waiting on it. I don't know if the reduced fairness causes issues here,
though. You could mark a blackhole as "boosted" meaning, that as soon the
blackhole is updated we not just wake up all threads in the run-queue, but
also yield to the first thread in the blackhole.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8972#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list