This document provides an introduction to instruction-level parallel (ILP) processors. It discusses how ILP processors improve performance by executing multiple instructions in parallel through techniques like pipelining and superscalar execution. It also covers dependencies between instructions like data dependencies, control dependencies, and resource dependencies that limit parallelism. The document discusses approaches for instruction scheduling used by compilers and processors to detect and resolve dependencies to expose more instruction-level parallelism. It notes that while ILP processors can provide significant speedups for scientific programs, dependencies limit speedups for general-purpose programs to around 2-4 times.