2
Deterministic Parallelism for the 99% Parallelism is crucial for performance Hard to understand for most programmers Deterministic parallelism is much easier In many cases, non-determinism is a bug How to catch / prevent non-determinism bugs?

3
Two Sorts of Code 1.High-performance parallel libraries – Uses complex and subtle parallel constructs – Written by concurrency experts: the 1% 2.Deterministic application code – Uses parallel libraries in a deterministic way – Parallelism behavior is straightforward – Written by everybody else: the 99% We focus on application code

7
Specifying Commutativity for Libraries Methods annotated with commutativity sets – Each pair of methods in set commute 1, …,S n } – States method is in sets S 1 through S n – Commutes with all other methods in these sets

11
Commutativity means Commutativity Queue add might self-commute for some uses – E.g. worklist-based algorithms: each queue item is consumed in the same way Still cannot mark add as self-commuting Instead, change library to capture use case

13
Dynamically Verifying Determinism Each parallel library call a dynamic check – Ensures no non-commuting methods could possibly run in parallel HJd exposes these checks to the user – Construct called permission region [RV 11] – Many calls can be grouped into one check – See our paper for more details