This document provides an overview of writing OpenMP programs on multi-core machines. It discusses:
1) Why OpenMP is useful for parallel programming and its main components like compiler directives and library routines.
2) Elements of OpenMP like parallel regions, work sharing constructs, data scoping, and synchronization methods.
3) Achieving scalable speedup through techniques like breaking data dependencies, avoiding synchronization overheads, and improving data locality with cache and page placement.