Scatter distributes data from rank 0 to all processes; gather collects from all back to rank 0. Both split work efficiently instead of using loops.
if (rank == 0) for (int i = 0; i < size; i++) MPI_Send(&data[i * chunk], chunk, MPI_INT, i, 0, MPI_COMM_WORLD); else MPI_Recv(local, chunk, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
This serialises all N sends on rank 0. MPI_Scatter expresses the same pattern as a single collective call that all processes participate in simultaneously, dividing a root's buffer into equal-sized chunks and delivering one to each process including the root itself. MPI_Gather is the inverse: each process sends a chunk back and root assembles the result.
int send_buf[size]; // root fills this int recv_val; MPI_Scatter(send_buf, 1, MPI_INT, &recv_val, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Scatterv and MPI_Gatherv are the variable-length variants, where each process sends or receives a different number of elements. They take a counts array and a displacements array, so chunks do not need to be equal in size or contiguous in the root's buffer. This is the right tool for distributing irregular domain decompositions where the workload per process is not uniform.