3.1. Preliminaries3.1.1. Decomposition, Tasks, and Dependency Graphs3.1.2. Granularity, Concurrency, and Task-Interaction3.1.3. Processes and Mapping3.1.4. Processes versus Processors3.2. Decomposition Techniques3.2.1. Recursive Decomposition3.2.2. Data Decomposition3.2.3. Exploratory Decomposition3.2.4. Speculative Decomposition3.2.5. Hybrid Decompositions3.3. Characteristics of Tasks and Interactions3.3.1. Characteristics of Tasks3.3.2. Characteristics of Inter-Task Interactions3.4. Mapping Techniques for Load Balancing3.4.1. Schemes for Static MappingMappings Based on Data PartitioningBlock DistributionsCyclic and Block-Cyclic DistributionsRandomized Block DistributionsMappings Based on Task PartitioningHierarchical Mappings3.4.2. Schemes for Dynamic MappingCentralized SchemesDistributed SchemesSuitability to Parallel Architectures3.5. Methods for Containing Interaction Overheads3.5.1. Maximizing Data Locality3.5.2. Minimizing Contention and Hot Spots3.5.3. Overlapping Computations with Interactions3.5.4. Replicating Data or Computations3.5.5. Using Optimized Collective Interaction Operations3.5.6. Overlapping Interactions with Other Interactions3.6. Parallel Algorithm Models3.6.1. The Data-Parallel Model3.6.2. The Task Graph Model3.6.3. The Work Pool Model3.6.4. The Master-Slave Model3.6.5. The Pipeline or Producer-Consumer Model3.6.6. Hybrid Models3.7. Bibliographic RemarksProblems