Major Section: ACL2 Documentation
This documentation topic relates to an experimental extension of ACL2,
ACL2(p), created initially by David L. Rager. See compiling-acl2p for how to
build an executable image that supports parallel evaluation. Also see
books/parallel
for examples.
IMPORTANT NOTE. We hope and expect that every evaluation result is correctly computed by ACL2(p), and that every formula proved using ACL2(p) is a theorem of the ACL2 logic (and in fact is provable using ACL2). However, we do not guarantee these properties. Since ACL2(p) is intended to be an aid in efficient evaluation and proof development, we focus less on ironclad soundness and more on providing an efficient and working implementation. Nevertheless, if you encounter a case where ACL2(p) computes an incorrect result, or produces a proof where ACL2 fails to do so, please tell the implementors.
One of ACL2's strengths lies in its ability to execute industrial models efficiently. The ACL2 source code provides an experimental parallel evaluation capability that can increase the speed of explicit evaluation, including simulator runs using such models, and it can also decrease the time required for proofs that make heavy use of the evaluation of ground terms.
The parallelism primitives are plet
, pargs
, pand
,
por
, and spec-mv-let
. Pand
and por
terminate early
when an argument is found to evaluate to nil
or non-nil
,
respectively, thus potentially improving on the efficiency of lazy
evaluation. Spec-mv-let
is a modification of mv-let
that
supports speculative and parallel execution.
pand
and por
.
and
let
or
mv-let
supporting speculative and parallel execution
Of the above five parallelism primitives, all but spec-mv-let
allow for
limiting parallel evaluation (spawning of so-called ``threads'') depending on
resource availability. Specifically, the primitives allow specification of a
size condition to control the granularity under which threads are
allowed to spawn. You can use such granularity declarations in
recursively-defined functions to implement data-dependent parallelism in
their execution.
We recommend that in order to learn to use the parallelism primitives, you begin by reading examples: see parallelism-tutorial. That section will direct you to further documentation topics.
In addition to providing parallel programming primitives, ACL2(p) also provides the ability to execute the main ACL2 proof process in parallel. See set-waterfall-parallelism for further details.
While we aim to support Clozure Common Lisp (CCL), Steel Bank Common Lisp (SBCL), and Lispworks, SBCL and Lispworks both currently sometimes experience problems when evaluating the ACL2 proof process (the ``waterfall'') in parallel. Therefore, CCL is the recommend Lisp for anyone that wants to use parallelism and isn't working on fixing those problems.