Debugging Multithreaded Programs

Charles Leiserson

MIT Lab for Computer Science

A parallel multithreaded program that is ostensibly deterministic may nevertheless behave nondeterministically due to bugs in the code. These bugs are called determinacy races, and they result when one thread updates a location in shared memory while another thread is concurrently accessing the location. We have implemented a provably efficient determinacy-race detector for Cilk, an algorithmic multithreaded programming language. If a Cilk program run on a given input data set has a determinacy race, our debugging tool, which we call the "Nondeterminator," guarantees to detect and localize the race.

The core of the Nondeterminator is an asymptotically efficient serial algorithm for detecting determinacy races in series-parallel dags (directed acyclic graphs). For a Cilk program that runs in T time on one processor and uses v shared-memory locations, the Nondeterminator runs in O(T a(v,v)) time, where a is Tarjan's functional inverse of Ackermann's function, a very slowly growing function which, for all practical purposes, is bounded above by 4. The Nondeterminator uses at most a constant factor more space than does the original program. On a variety of Cilk program benchmarks, the Nondeterminator exhibits a slowdown of less than 12 compared with the serial execution time of the original optimized code, which we contend is an acceptable slowdown for debugging purposes.

We have recently extended the original Nondeterminator tool to check programs that incorporate locking. We overview how our new Nondeterminator-2 tool detects data races. We also discuss the guarantees of determinacy that it can offer.

This talk presents joint research with Mingdong Feng, with contributions from Ien Cheng, Keith Randall, Andy Stark, and Arnold Schwartenegger.

Back to LESS

Last modified: October 13, 1998
Robert Blumofe