3. Introduction
Keywords: perfbook_html

#
3. Introduction

Parallel programming has earned a reputation as one of the most difficult areas a hacker can tackle. Papers and textbooks warn of the perils of deadlock, livelock, race conditions, non-determinism, Amdahl's-Law limits to scaling, and excessive realtime latencies. And these perils are quite real; we authors have accumulated uncounted years of experience dealing with them, and all of the emotional scars, grey hairs, and hair loss that go with such an experience.

However, new technologies have always been difficult to use at introduction, but have invariably become easier over time. For example, there was a time when the ability to drive a car was a rare skill, but in many developed countries, this skill is now commonplace. This dramatic change came about for two basic reasons: (1) cars became cheaper and more readily available, so that more people had the opportunity to learn to drive, and (2) cars became simpler to operate, due to automatic transmissions, automatic chokes, automatic starters, greatly improved reliability, and a host of other technological improvements.

The same is true of a host of other technologies, including computers. It is no longer necessary to operate a keypunch in order to program. Spreadsheets allow most non-programmers to get results from their computers that would have required a team of specialists a few decades ago. Perhaps the most compelling example is web-surfing and content creation, which since the early 2000s has been easily done by untrained, uneducated people using various now-commonplace social-networking tools. As recently as 1968, such content creation was a far-out research project [Eng68], described at the time as ``like a UFO landing on the White House lawn''[Gri00].

Therefore, if you wish to argue that parallel programming will remain as difficult as it is currently perceived by many to be, it is you who bears the burden of proof, keeping in mind the many centuries of counter-examples in a variety of fields of endeavor.

Subsections

- 3.1 Historic Parallel Programming Difficulties
- 3.2 Parallel Programming Goals
  - 3.2.1 Performance
  - 3.2.2 Productivity
  - 3.2.3 Generality
- 3.3 Alternatives to Parallel Programming
  - 3.3.1 Multiple Instances of a Sequential Application
  - 3.3.2 Make Use of Existing Parallel Software
  - 3.3.3 Performance Optimization
- 3.4 What Makes Parallel Programming Hard?
  - 3.4.1 Work Partitioning
  - 3.4.2 Parallel Access Control
  - 3.4.3 Resource Partitioning and Replication
  - 3.4.4 Interacting With Hardware
  - 3.4.5 Composite Capabilities
  - 3.4.6 How Do Languages and Environments Assist With These Tasks?
- 3.5 Guide to This Book
  - 3.5.1 Quick Quizzes
  - 3.5.2 Sample Source Code