Programming a parallel machine is a complex task that requires different parts of the program to cooperate by making the best use of distributed resources. Providing models for efficient programming helps programmers to abstract from low-level hardware constraints to focus on writing efficient and easy-to-maintain programs.