What’s Important?
•Maximizing number of processors used
•Minimizing execution time
•Minimizing the amount of work performed
•Reducing size of memory footprint
•Maximizing (minimizing) degree of data sharing
•Reducing data motion (interprocessor comm.)
•Maximizing synchroneity or asynchroneity
•Guaranteeing portability among platforms
•Balancing work load across processors
•Maximizing programming convenience
•Avoiding races, deadlocks, guaranteeing determinacy
•Better software engineering: robust, maintain, debugging