Knowledge-based transformational synthesis of efficient structures for concurrent computation

The object of our research is the codification of programming knowledge for the synthesis of concurrent programs. This is important because concurrency is a way of securing better performance on amenable problems than is available on non-concurrent computers. We divide this knowledge into two sections: knowledge for the synthesis of arrays of processors that could be connected in a geometrically regular manner (crystalline concurrency), and knowledge for the synthesis of tree structures (tree concurrency). We divide synthesis of crystalline concurrency, in turn, into several subsections: synthesis of declarations of multiple processors and the wires implied by the dependencies among the values they contain, reduction of this wire network to a smaller wire network, creation of subnetworks to replace an overly-broad fanout network, virtualization which is the creation of additional array elements and processors to reflect the internal enumerations that comprise the computation of a datum, and aggregation which is the merging of several processors into one. We also divide tree concurrency synthesis. Our primary technique is divide and conquer, but to make this technique effective we must take another view of the specification. We respecify a given requirement, that of computing a new array whose values are pointwise computable as a function of an existing array and an index, as a requirement to compute a functional object whose side effect is to satisfy the original specification, together with the requirement that said object be called with the proper arguments. We call the computed functional object a closure. We use a transformational approach. The transformational system has rules, each of which contains two predicates: an antecedent and a consequent. If the antecedent of a rule is true of a given object, the rule applies and the object is modified to make the consequent true. We demonstrate these techniques' ability to synthesize one or more solutions to each of several classical problems from the literature. These solutions are topological descriptions of arrays of computing elements ("processors"). The resulting elements' complexities range from a couple of gates to something comparable to a microprocessor. We do not attempt to actually lay out the processors and interconnections.