A parallel computer can perform multiple operations simultaneously, as opposed to sequential computers
We focus on massive parallelism
In theoretical work, the Parallel Random Access Machine is also used, where idealized processors with a simple instruction set interact via shared memory
Here, we look at a simpler model based on Boolean circuits
We take each gate to be an individual processor, and so define the processor complexity of a circuit to be its size, and the parallel time complexity to be its depth
As in our exploration of Circuit Complexity, we look at circuit families to handle variable sized inputs
To make sure this corresponds to the standard PRAM computation model, we also impose a uniformity requirement, so that all circuits in a family can be easily obtained
Definition: A family of circuits is uniform if some log space transducer outputs when ‘s input is
We consider the simultaneous size-depth circuit complexity
Example:
Say is the language over of all strings with an odd number of s
We can test membership with a standard gate, which can be written with standard operations as
To generalize to variables, we could make a sequence of circuits, which uses size-depth
Or even better, we can construct a binary tree of gates, for a size-depth complexity of
Example:
The Boolean matrix multiplication function takes variables representing and , and outputs values representing where
The circuit for this function has gates for each , and for every a binary tree of gates to compute the outer expression
Each tree has gates with depth, so this circuit has size and depth
We extend this example to calculate the transitive closure of , the matrix
This matrix is closely related to the problem (the canonical -complete problem), where we view as an adjacency matrix of a directed graph
The computation of can be represented with a binary tree of size and depth , hence computing takes
We make circuits for each which adds another factor of to the size and an additional layer of depth (but not a factor)
Hence the size-depth complexity of transitive closure is
It turns out that many interesting problems have complexity for some , and can therefore be considered highly parallelizable
Definition: Let be the class of languages that can be decided by a uniform family of circuits with polynomial size and depth
is the class of languages in for some
Functions computed by such families are called NC computable
stands for Nick’s class (Nick Pippenger)
A small note is that this is not quite the standard definition for
Theorem:
On input of length , as needed the algorithm can construct the th circuit and evaluate the circuit with a depth-first search
Since the circuit depth is logarithmic, we can store the path and partial results in logarithmic space
Theorem:
Let be a language (encoded into ) decided by an machine
We construct a uniform circuit family for
Note that a configuration of on in a log space machine describes the state, the contents of the work tape, and the positions of both the input and the work tape heads, but not itself
This means that there are polynomially many configurations, and we can make the edges match a computation on by looking at the transition function and the head position on
Thus, we can output a circuit that computes the transitive closure of a graph that matches the computation graph for and then outputs the position indicating the presence of such a path
This circuit has polynomial size and depth (as explained in our earlier example)
That this can be done by a log space transducer is a bit unintuitive, but keep in mind we can be flexible with the output representation of a circuit
Theorem:
A polynomial time algorithm can just run the log space transducer to generate and then simulate it on an input of length
would imply all polynomial time solvable problems are highly parallelizable, which seem unlikely
Definition: A language is P-complete if and every in is log space reducible to
Theorem: If and then
This follows because circuit families can compute log space reductions
Theorem: is -complete
We’ve already seen how to reduce a language to a circuit when we first introduced circuit complexity
We reduce a language in on input by producing a circuit simulating and passing in that circuit and to
We can do this reduction in log space because the circuit has a simple and repetitive structure, so is -complete