There are different ways to think about parallel programs - parallelization can occur on multiple different levels, and different types of parallelism can function in parallel with each other! Classical examples would be threads (which communicate through shared memory, requiring locality and shared memory), processes (which synchronize through messages over some medium, whether that be a network or a pipe), or data parallel structures (which must execute the same function on collections rather than code itself).
There are different ways to think about parallel programs - parallelization can occur on multiple different levels, and different types of parallelism can function in parallel with each other! Classical examples would be threads (which communicate through shared memory, requiring locality and shared memory), processes (which synchronize through messages over some medium, whether that be a network or a pipe), or data parallel structures (which must execute the same function on collections rather than code itself).