When you use mpirun -np 3 . /foo, MPI creates 3 processes for your program, each running on a separate core. Even if your system has multiple cores, MPI may assign multiple processes to cores on the same CPU, not necessarily on different CPUs. Each core is like a mini-processor that can handle tasks independently. For example, if you have 1 CPU with 4 cores, you could run up to 4 tasks concurrently on those cores. With -np 3, MPI distributes your processes across available cores, but not necessarily on different CPUs.