Publications by Doran Wilde

"Deriving Formulae to Count Solutions to Parameterized Linear Systems using Ehrhart Polynomials:
Applications to the Analysis of Nested-Loop Programs"
by Philippe Clauss, Vincent Loechner and Doran Wilde
jsc97.ps.gz (184K)
Optimizing parallel compilers need to be able to analyze nested loop programs with parametric affine loop bounds, in order to derive efficient parallel programs. The iteration spaces of nested loop programs can be modeled by polyhedra and systems of linear constraints. Using this model, important program analyses such as computing the number of flops executed by a loop, computing the number of memory locations or cache lines touched by a loop, and computing the amount of processor to processor communication needed during the execution of a loop--- all reduce to the same mathematical problem: finding the formula for number of integer solutions to a system of parameterized linear constraints, as a function of the parameters.
In this paper, we present a method for deriving a closed-form symbolic formula for the number of integer points contained in a polyhedral region in terms of size parameters. If the set of integer points to be counted lies inside a union of rational convex polytopes, then the number of points can be formulated by a special kind of polynomial called an Ehrhart pseudo-polynomial. The procedure consists of first, computing the parametric vertices of a polytope defined by a set of parametric linear constraints, and then solving for the pseudo-polynomial which gives the exact formula for the number of integer points in the polytope. An algorithm to derive this formula is presented. The method is then illustrated using many examples from the literature and in the area of parallel program optimization.

"Parameterized Polyhedra and their Vertices"
by Vincent Loechner and Doran Wilde
ijpp97.ps.gz (121K) to appear in Int'l Journal of Parallel Programming, Vol. 25, No. 6, Dec. 1997 issue
Algorithms specified for parametrically sized problems are more general purpose and more reusable than algorithms for fixed sized problems. For this reason, there is a need for representing and symbolically analyzing linearly parameterized algorithms.
An important class of parallel algorithms can be described as systems of parameterized affine recurrence equations (PARE). In this representation, linearly parameterized polyhedra are used to describe the domains of variables. This paper describes an algorithm which computes the set of parameterized vertices of a polyhedron, given its representation as a system of parameterized inequalities. This provides an important tool for the symbolic analysis of the parameterized domains used to define variables and computation domains in PARE's.
A library of operations on parameterized polyhedra based on the Polyhedral Library has been written in C and is freely distributed.

"A Library for Doing Polyhedral Operations"
by Doran K. Wilde
mathprog.ps.gz (133K) journal version
pi785.ps.gz (134K) IRISA Technical Report #785
Master's thesis
The design and implementation of a library of C-code procedures to perform operations on polyhedra is described. The library supports intersection, union, difference, simplification in context, convex hull, affine image, affine preimage, and computation of dual forms. Since not all of these functions are closed over polyhedra, the library is extended to operate on finite unions of polyhedra. The major design decisions made during the implementation of the library are discussed. The data structures used for representing finite unions of polyhedra is developed and validity rules for the representation of polyhedra are derived. And finally, the algorithms used to implement the various functions in the library are presented.

"Memory Reuse Analysis in the Polyhedral Model"
by D. Wilde and S. Rajopadhye
ppl97.ps.gz (82K) Parallel Processing Letters (to appear Oct 97)
europar96.ps.gz (46K) Europar`96 Conference version
europar96-ext.ps.gz (66K) Extended version
In the context of developing a compiler for Alpha, a functional language based on systems of affine recurrence equations (SAREs), we address the problem of transforming scheduled single-assignment code to multiple assignment code. We show how the polyhedral model allows us to statically compute the usage table of an Alpha program, and how this provides a foundation for many kinds of compile time optimizations. We illustrate this by showing a constructive method to generate memory efficient code, and indicate how it can also be used in communication optimization.

"A Regular VLSI Array for an Irregular Algorithm"
by F. de Dinechin, D. Wilde, S. Rajopadhye, R. Andonov
irreg95.ps.gz (34K) Irregular`96 Conference version
knapsack95.ps.gz (66K) Extended Version
We present an application specific, asynchronous VLSI processor array for the dynamic programming algorithm for the 0/1 knapsack problem. The array is derived systematically, using correctness-preserving transformations in two steps: the standard (dense) dynamic programming is first transformed into an irregular (sparse) functional program which has better efficiency. The program is then implemented on a modular VLSI architecture with nearest neighbor connections and constant memory in each processor. To do this, we prove that buffer sizes are bounded, and then show how a number of processors can be configured so that the buffers are pooled. This yields a linear array of identical asynchronous processors, each with a simple comparator, multiplexor and a pair of fixed size fifos.

"A Shift Register Based Systolic Array for the General Knapsack Problem"
by Rumen Andonov, Sanjay Rajopadhye and Doran Wilde
ppl95.ps.gz (51K) Parallel Processing Letters
We present a shift register based systolic array for a class of recurrences with dynamic dependences called knapsack problem recurrences. All previous arrays or parallel implementations led to either low efficiency or to complicated control. To the best of our knowledge,the proposed design is the first realistic pure systolic and optimal array of a pseudo-polynomial, NP-complete problem. The key feature of the array is that it requires almost no control circuitry.

"From Alpha to Imperative Code: A Transformational Compiler for an Array Based Functional Language"
by Doran Wilde
wilde95.ps.gz (285K) Ph.D. Dissertation, Oregon State University
Practical parallel programming demands that the details of distributing data to processors and interprocessor communication be managed by the compiler. These tasks quickly become too difficult for a programmer to do by hand for all but the simplest parallel programs. Yet, many parallel languages still require the programmer to manage much of the the parallelism.
I discuss the synthesis of parallel imperative code from algorithms written in a functional language called Alpha. Alpha is based on systems of affine recurrence equations and was designed to specify algorithms for regular array architectures. Being a functional language, Alpha implicitly supports the expression of both concurrency and communication. Thus, the programmer is freed from having to explicitly manage the parallelism.
Using the information derived from static analysis, Alpha can be transformed into a form suitable for generating imperative parallel code through a series of provably correct program transformations. The kinds of analysis needed to generate efficient code for array-based functional programs are a generalization of dependency analysis, usage analysis, and scheduling techniques used in systolic array synthesis.

"The Naive Execution of Affine Recurrence Equations"
by Patrice Quinton, Sanjay Rajopadhye, Doran Wilde
asap95.ps.gz (67K) ASAP'95, Jul, 1995, Strasbourg, France
In recognition of the fundamental relation between regular arrays and systems of affine recurrence equations, the Alpha language was developed as the basis of a computer aided design methodology for regular array architectures. Alpha is used to initially specify algorithms at a very high algorithmic level. Regular array architectures can then be derived from the algorithmic specification using a transformational approach supported by the Alpha environment. This design methodology guarantees the final design to be correct by construction, assuming the initial algorithm was correct.
In this paper, we address the problem of validating an initial specification. We demonstrate a translation methodology which compiles Alpha into the imperative sequential language C. The C-code may then be compiled and executed to test the specification. We show how an Alpha program can be naively implemented by viewing it as a set of monolithic arrays and their filling functions, implemented using applicative caching. This is the approach which is used by the translator. We discuss two problems that had to be solved before implementing the translator. The first is how to allocate 1-dimensional storage for a polyhedron, and the second is how to scan a polyhedron with nested loops.

"Deriving Imperative Code from Functional Programs"
by Patrice Quinton, Sanjay Rajopadhye, Doran Wilde
fpca95.ps.gz (55K) FPCA`95, June 1995, La Jolla, California
Alpha is a data parallel functional language which has the capability of specifying algorithms at a very high level. Our ultimate objective is to generate efficient parallel imperative code from an Alpha program. In this paper, we discuss the related problem of generating efficient single processor imperative code. Analysis techniques that were developed for the synthesis of systolic arrays are extended and adapted for the compilation of functional programming languages. We also demonstrate how a transformational methodology can be used as a compilation engine to transform an Alpha program to a sequential form. C--code is then generated using a straightforward pretty printer from the sequential form Alpha program. The C-code may then be compiled to efficiently execute the program.

"On Deriving Data Parallel Code from a Functional Program"
by Patrice Quinton, Sanjay Rajopadhye, Doran Wilde
ipps95.ps.gz (49K) IPPS, April 1995, Santa Barbara,CA
We discuss a translation methodology for transforming a high level Algorithmic specification written in Alpha to an imperative data parallel language. We informally introduce the Alpha language with the aid of an example and explain how it is adapted for doing static analysis and transformation. An Alpha program can be naively compiled using applicative caching. Our compilation method makes incremental transformations on the abstract syntax tree of an Alpha program in order to make efficiency and performance improvements over the naive code and optimize it for a given architecture. The compilation steps described include scheduling, alignment, partitioning, allocation, loop nest generation, and code generation and they are illustrated with an example.

"Regular Array Synthesis Using Alpha"
by Doran Wilde and Oumarou Sie
asap94.ps.gz (61K) ASAP`94, June, 1994, San Francisco
We report our current research in a computer assisted methodology for synthesizing regular array processors using the Alpha language and design environment. The design process starts from an algorithmic level description of the function and finishes with a netlist of an array processor which performs the specified function. To illustrate the proposed approach, we present the design of an array processor to do polynomial division.

"The Alpha Compiler and Uncompiler, Technical Report"
by Doran Wilde and Andrew Snoddy
nt9401.ps.gz (76K) IRISA Technical Report 1994-#1
The Alpha parser translates an Alpha source program into an abstract syntax tree (AST). The Alpha unparser, or pretty printer, does the opposite translation from an Alpha AST back to a source program. These two translators are an integral part of the Alpha environment. This report is both a user's guide and technical documentation for these two programs.

"Allocating Memory Arrays for Polyhedra"
by Doran Wilde and Sanjay Rajopadhye
pi749.ps.gz (89K) IRISA Technical Report #749
We have been investigating problems which arise in compiling single assignment languages (in which memory is not explicitly allocated) into parallel code. Like standard parallelizing compilers, different index space transformations are performed on variables declared over convex polyhedral regions. Polyhedra can be transformed in such a way as to reduce the volume of the bounding box which we use to reduce the amount of memory allocated to a variable. Allocation of memory to variables which are defined over finite convex polyhedral regions requires a tradeoff in the complexity of the memory addressing function versus the amount of memory used. We present a tradeoff in which the memory address function is limited to an affine function of the indices (thus memory is allocated to a rectangular parallelepiped region). Given this constraint, we seek a unimodular transformation which minimizes the volume of the bounding box of the polyhedron. This is a non-linear programming problem. We present a method in which the volume of the bounding box is minimized one dimension at a time by a succession of skewing transformations. Each one of these is a linear programming problem.

"An Inductive Constructive Method for Computation of the Face Lattice of a Polyhedron"
by Doran Wilde
pi786.ps.gz (82K) IRISA Technical Report #786
This article describes two algorithms to generate the face lattice of a polyhedron. A procedure by Motzkin which computes the dual of a polyhedron is presented and then extended to compute the entire face lattice of a polyhedron. This new algorithm recursively generates the lattice. Another non-recursive algorithm to construct lattices which was invented by Seidel is also presented.

"The Alpha Language"
by Doran Wilde
pi827.ps.gz (81K) IRISA Technical Report #827
This report is a formal description of the Alpha language, as it is currently implemented. Alpha is a strongly typed, functional language which embodies the formalism of systems of affine recurrence equations. In this report, Alpha language constructs are described, and denotational and type semantics are given. The theorems which are the basis for doing transformations on an Alpha program are stated. And finally, the syntax and semantics of Alpha are given.

"Using Static Analysis to Derive Imperative Code from Alpha"
by Patrice Quinton, Sanjay Rajopadhye, Doran Wilde
pi828.ps.gz (79K) IRISA Technical Report #828
In this article, we demonstrate a translation methodology which transforms a high level algorithmic specification written in the Alpha language to an imperative data parallel language. Alpha is a functional language which was designed to facilitate the kinds of static analyses needed for doing regular array synthesis. We show that the same methods which are used for solving regular array synthesis problems can be applied to the compilation of Alpha as a functional language.
We informally introduce the Alpha language with the aid of examples and explain how it is adapted to doing static analysis and transformation. We first show how an Alpha program can be naively implemented by viewing it as a set of monolithic arrays and their filling functions, implemented using applicative caching. We then show how static analysis can be used to improve the efficiency of this naive implementation by orders of magnitude. We present a compilation method which makes incremental transformations on the abstract syntax tree of an Alpha program in order to make performance improvements and optimize it for a given architecture. The compilation steps described include scheduling, alignment, partitioning, allocation, loop nest generation, and code generation and they are illustrated with a running example. We discuss some of the static analysis issues which come up at each of these steps and briefly describe what static analysis tools are used.

"Loop Nest Synthesis using the Polyhedral Library"
by Herve Le Verge, Vincent Van Dongen, Doran Wilde
pi830.ps.gz (55K) IRISA Technical Report #830 (English)
Presented at RENPAR`6 (French).
A new method to synthesis loop nests given a polyhedral domain, the context domain, and the loop nesting order is described. The method is based on functions in the IRISA polyhedral library.