Most users find parallel programming difficult for at least four reasons.
Deciding how to choose between models often requires a sophisticated understanding of the application, its underlying algorithms, the expressiveness of the language used, and effects of the system software and hardware architecture of the parallel machine. Unfortunately, this choice is complicated by the fact that not all parallel computing abstractions are equally well supported in existing programming systems. Third, program analysis tools for parallel programming are either not generally available, not particularly useful, or not integrated into a complete programming environment. These languages invoke parallel operations via compiler transformations and calls to runtime system routines. Users gain programmability, since they specify parallelism abstractly and rely on the compiler to generate task and data mapping code, and portability, since the system can be retargeted to new platforms.