Decades of experience, however, have demonstrated that creating efficient and portable parallel software is a difficult task, largely due to the diversity of current parallel computers and parallel computer models.
Some use shared-memory techniques, others use message passing.
Some take advantage of network locality, others do not. As a result of this chaotic situation, parallel application code is usually computer specific - to run the application on a different parallel computer generally requires a fundamental restructuring of the solution method. In order to make parallel computing more manageable, therefore, it would be desirable to have a unifying model for parallel computing. An acceptable unifying model should have several properties. First, it should be simple enough to allow programmers to reason about and write parallel code.