Parallel computation will become the norm in the coming decades. Unfortunately, advances in parallel hardware have far outpaced parallel applications of software. There are currently two approaches to applying parallelism to applications. One is to write completely new applications in new languages. But abandoning applications that work is unacceptable to most nonacademic users of high-performance computers. The other approach is to convert existing applications to a parallel form. This can be done manually or automatically. Even partial success in doing the job automatically has obvious economic advantages.This book describes a fundamentally new theoretical framework for finding poor algorithms in an application program and replacing them with ones that parallelize the code.