This document discusses parallel programming and algorithm design. It covers principles of parallel algorithms like decomposing computations into simultaneous tasks. It describes task decomposition techniques like data, recursive, exploratory and speculative decomposition. It also discusses mapping techniques to distribute tasks across processes, characteristics of tasks, and parallel algorithm models like data-parallel, task graph, work pool, master-slave, and producer-consumer. Finally, it briefly introduces GPU computing and references.