Run-time algorithm specialization

Uses your system voice; voice and rate in settings.

Snapshot

≈ 6 min read

Names in other languages

No names in other languages are held for this entry yet.

Article bodies are English and are not machine-translated. A name in another language is not a translation of the article.

In computer science, 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 and, more specifically, in the Vampire theorem prover project. The idea is inspired by the use of partial evaluation in optimising program translation. Many core operations in theorem provers exhibit the following pattern. Suppose that we need to execute some algorithm \mathit{alg}(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{alg} for every fixed A , i.e., such an algorithm \mathit{alg}_A , that executing \mathit{alg}_A(B) is equivalent to executing \mathit{alg}(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{alg}_A(B) can avoid some operations that \mathit{alg}(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.

In computer science, 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 and, more specifically, in the Vampire theorem prover project. The idea is inspired by the use of partial evaluation in optimising program translation. Many core operations in theorem provers exhibit the following pattern. Suppose that we need to execute some algorithm \mathit{alg}(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{alg} for every fixed A , i.e., such an algorithm \mathit{alg}_A , that executing \mathit{alg}_A(B) is equivalent to executing \mathit{alg}(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{alg}_A(B) can avoid some operations that \mathit{alg}(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. ==Specialization with compilation== The specialized algorithm has to be represented in a form that can be interpreted. In many situations, usually when \mathit{alg}_A(B) is to be computed on many values of B in a row, \mathit{alg}_A can be written as machine code instructions for a special abstract machine, and it is typically said that A is compiled. The code itself can then be additionally optimized by answer-preserving transformations that rely only on the semantics of instructions of the abstract machine. The instructions of the abstract machine can usually be represented as records. One field of such a record, an instruction identifier (or instruction tag), would identify the instruction type, e.g. an integer field may be used, with particular integer values corresponding to particular instructions. Other fields may be used for storing additional parameters of the instruction, e.g. a pointer field may point to another instruction representing a label, if the semantics of the instruction require a jump. All instructions of the code can be stored in a traversable data structure such as an array, linked list, or tree. Interpretation (or execution) proceeds by fetching instructions in some order, identifying their type, and executing the actions associated with said type. In many programming languages, such as C and C++, a simple switch statement may be used to associate actions with different instruction identifiers. Modern compilers usually compile a switch statement with constant (e.g. integer) labels from a narrow range by storing the address of the statement corresponding to a value i in the i -th cell of a special array, as a means of efficient optimisation. This can be exploited by taking values for instruction identifiers from a small interval of values. ==Data-and-algorithm specialization== There are situations when many instances of A are intended for long-term storage and the calls of \mathit{alg}(A,B) occur with different B in an unpredictable order. For example, we may have to check \mathit{alg}(A_1,B_1) first, then \mathit{alg}(A_2,B_2) , then \mathit{alg}(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^{\prime} for every A , that can be stored with, or instead of, A . We also define a variant \mathit{alg}^{\prime} that works on this representation and any call to \mathit{alg}(A,B) is replaced by \mathit{alg}^{\prime}(A^{\prime},B) , intended to do the same job faster. ==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)

Text derived from https://en.wikipedia.org/w/index.php?oldid=1337324489 under CC BY-SA 4.0; modifications have been made.

Provenance

snapshot enwiki-001337324489 · captured 1770577128.0 · version history

Cite this page as: encyclopegia.org, “Run-time algorithm specialization”, snapshot enwiki-001337324489. https://encyclopegia.org/a/run-time-algorithm-specialization