Programming parallel computers can be done with shared memory or distributed memory models. Shared memory is easier since it has a single address space, while distributed memory requires managing multiple address spaces and remote data access. The dominant programming model is Single Program Multiple Data (SPMD) where the same code runs on all processors. OpenMP is used for shared memory and MPI is used for distributed memory. They involve directives/calls for parallelization and inter-processor communication. Multi-tiered systems can be programmed with MPI and OpenMP together or MPI alone.