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