The document provides an introduction to parallel programming concepts including shared memory and distributed memory architectures. It discusses multi-threading for shared memory systems where threads within a process share the same memory address space. The document also outlines Foster's methodology for designing parallel programs which includes partitioning work, determining communication needs, aggregating tasks, and mapping tasks to processes. OpenMP pragmas and directives are introduced for writing multi-threaded parallel programs in C using shared memory. Key concepts around scope and data access in OpenMP programs are also summarized.