This book helps to find: Concurrency in a program - how to help programmers "think parallel"? Scheduling tasks at the right granularity onto the processors of a parallel machine. The data locality problem: associating data with tasks and doing it in a way that our target audience will be able to use correctly. Scalability support in hardware: bandwidth and latencies to memory plus interconnects between processing elements. Scalability support in software: libraries, scalable algorithms, and adaptive run times to map high level software onto platform details. Synchronization constructs (and protocols) that enable programmers write programs free from deadlock and race conditions. Tools, API's and methodologies to support the debugging process. Error recovery and support for fault tolerance. Support for good software engineering practices: compos ability, incremental parallelism, and code reuse. Support for portable performance. What are the right models (or abstractions) so programmers can write code once and expect it to execute well on the important parallel platforms?