Run-time algorithm specialisation
   HOME

TheInfoList



OR:

In
computer science Computer science is the study of computation, automation, and information. Computer science spans theoretical disciplines (such as algorithms, theory of computation, information theory, and automation) to Applied science, practical discipli ...
, run-time algorithm specialization is a methodology for creating efficient algorithms for costly computation tasks of certain kinds. The methodology originates in the field of
automated theorem proving Automated theorem proving (also known as ATP or automated deduction) is a subfield of automated reasoning and mathematical logic dealing with proving mathematical theorems by computer programs. Automated reasoning over mathematical proof was a ...
and, more specifically, in the Vampire theorem prover project. The idea is inspired by the use of
partial evaluation In computing, partial evaluation is a technique for several different types of program optimization by specialization. The most straightforward application is to produce new programs that run faster than the originals while being guaranteed t ...
in optimising program translation. Many core operations in theorem provers exhibit the following pattern. Suppose that we need to execute some algorithm \mathit(A,B) in a situation where a value of A ''is fixed for potentially many different values of'' B. In order to do this efficiently, we can try to find a specialization of \mathit for every fixed A, i.e., such an algorithm \mathit_A, that executing \mathit_A(B) is equivalent to executing \mathit(A,B). The specialized algorithm may be more efficient than the generic one, since it can ''exploit some particular properties'' of the fixed value A. Typically, \mathit_A(B) can avoid some operations that \mathit(A,B) would have to perform, if they are known to be redundant for this particular parameter A. In particular, we can often identify some tests that are true or false for A, unroll loops and recursion, etc.


Difference from partial evaluation

The key difference between run-time specialization and partial evaluation is that the values of A on which \mathit is specialised are not known statically, so the ''specialization takes place at run-time''. There is also an important technical difference. Partial evaluation is applied to algorithms explicitly represented as codes in some programming language. At run-time, we do not need any concrete representation of \mathit. We only have to ''imagine'' \mathit ''when we program'' the specialization procedure. All we need is a concrete representation of the specialized version \mathit_A. This also means that we cannot use any universal methods for specializing algorithms, which is usually the case with partial evaluation. Instead, we have to program a specialization procedure for every particular algorithm \mathit. An important advantage of doing so is that we can use some powerful ''ad hoc'' tricks exploiting peculiarities of \mathit and the representation of A and B, which are beyond the reach of any universal specialization methods.


Specialization with compilation

The specialized algorithm has to be represented in a form that can be interpreted. In many situations, usually when \mathit_A(B) is to be computed on many values B in a row, we can write \mathit_A as a code of a special
abstract machine An abstract machine is a computer science theoretical model that allows for a detailed and precise analysis of how a computer system functions. It is analogous to a mathematical function in that it receives inputs and produces outputs based on pr ...
, and we often say that A is ''compiled''. Then the code itself can be additionally optimized by answer-preserving transformations that rely only on the semantics of instructions of the abstract machine. Instructions of the abstract machine can usually be represented as records. One field of such a record stores an integer tag that identifies the instruction type, other fields may be used for storing additional parameters of the instruction, for example a pointer to another instruction representing a label, if the semantics of the instruction requires a jump. All instructions of a code can be stored in an array, or list, or tree. Interpretation is done by fetching instructions in some order, identifying their type and executing the actions associated with this type. In C or C++ we can use a switch statement to associate some actions with different instruction tags. Modern compilers usually compile a switch statement with integer labels from a narrow range rather efficiently by storing the address of the statement corresponding to a value i in the i-th cell of a special array. One can exploit this by taking values for instruction tags from a small interval of integers.


Data-and-algorithm specialization

There are situations when many instances of A are intended for long-term storage and the calls of \mathit(A,B) occur with different B in an unpredictable order. For example, we may have to check \mathit(A_1,B_1) first, then \mathit(A_2,B_2), then \mathit(A_1,B_3), and so on. In such circumstances, full-scale specialization with compilation may not be suitable due to excessive memory usage. However, we can sometimes find a compact specialized representation A^ for every A, that can be stored with, or instead of, A. We also define a variant \mathit^ that works on this representation and any call to \mathit(A,B) is replaced by \mathit^(A^{\prime},B), intended to do the same job faster.


See also

*
Psyco Psyco is an unmaintained specializing just-in-time compiler for pre-2.7 Python originally developed by Armin Rigo and further maintained and developed by Christian Tismer. Development ceased in December, 2011. Psyco ran on BSD-derived opera ...
, a specializing run-time compiler for Python * multi-stage programming


References


A. Voronkov, "The Anatomy of Vampire: Implementing Bottom-Up Procedures with Code Trees", ''Journal of Automated Reasoning'', 15(2), 1995
(''original idea'')


Further reading

* A. Riazanov and A. Voronkov, "Efficient Checking of Term Ordering Constraints", ''Proc. IJCAR'' 2004, Lecture Notes in Artificial Intelligence 3097, 2004 (''compact but self-contained illustration of the method'') * A. Riazanov and A. Voronkov
Efficient Instance Retrieval with Standard and Relational Path Indexing
Information and Computation, 199(1-2), 2005 (''contains another illustration of the method'') * A. Riazanov
"Implementing an Efficient Theorem Prover"
PhD thesis, The University of Manchester, 2003 (''contains the most comprehensive description of the method and many examples'') Algorithms Software optimization