Introduction

Before the advent of the multi-/manycore revolution, there were two principle reasons that developers chose to use parallelism.  One was that a particular code took too long to process serially; for these developers, parallelism was a way to speed up a time-sensitive execution.  For another class of developers, the problem was more space than time -- the data set to be processed and/or produced was too large or complex to adequately run serially.  So parallelism was, inherently, about dealing with some form of performance constraint.