Affiliation:
1. Inria, Paris, France
2. Carnegie Mellon University, Pittsburgh, USA
Abstract
Disentanglement is a run-time property of parallel programs that
facilitates task-local reasoning about the memory footprint of
parallel tasks. In particular, it ensures that a task does not access
any memory locations allocated by another concurrently executing task.
Disentanglement can be exploited, for example, to implement a
high-performance parallel memory manager, such as in the MPL (MaPLe)
compiler for Parallel ML. Prior research on disentanglement has
focused on the design of optimizations, either trusting the programmer
to provide a disentangled program or relying on runtime
instrumentation for detecting and managing entanglement. This paper
provides the first static approach to verify that a program is
disentangled: it contributes DisLog, a concurrent separation logic for
disentanglement. DisLog enriches concurrent separation logic with the
notions necessary for reasoning about the fork-join structure of
parallel programs, allowing the verification that memory accesses are
effectively disentangled. A large class of programs, including
race-free programs, exhibit memory access patterns that are
disentangled "by construction". To reason about these patterns, the
paper distills from DisLog an almost standard concurrent separation
logic, called DisLog+. In this high-level logic, no specific
reasoning about memory accesses is needed: functional correctness
proofs entail disentanglement. The paper illustrates the use of
DisLog and DisLog+ on a range of case studies, including two different
implementations of parallel deduplication via concurrent hashing. All
our results are mechanized in the Coq proof assistant using Iris.
Publisher
Association for Computing Machinery (ACM)