// Assuming neighbors are determined via MPI_Cart_shift
MPI_Request reqs[8];
int req_cnt = 0;
// Post Receives
MPI_Irecv(recv_buf_north, nx, MPI_DOUBLE, nbr_north, 0, cart_comm, &reqs[req_cnt++]);
MPI_Irecv(recv_buf_south, nx, MPI_DOUBLE, nbr_south, 1, cart_comm, &reqs[req_cnt++]);
MPI_Irecv(recv_buf_east, ny, MPI_DOUBLE, nbr_east, 2, cart_comm, &reqs[req_cnt++]);
MPI_Irecv(recv_buf_west, ny, MPI_DOUBLE, nbr_west, 3, cart_comm, &reqs[req_cnt++]);
// Post Sends
MPI_Isend(send_buf_north, nx, MPI_DOUBLE, nbr_north, 1, cart_comm, &reqs[req_cnt++]);
MPI_Isend(send_buf_south, nx, MPI_DOUBLE, nbr_south, 0, cart_comm, &reqs[req_cnt++]);
MPI_Isend(send_buf_east, ny, MPI_DOUBLE, nbr_east, 3, cart_comm, &reqs[req_cnt++]);
MPI_Isend(send_buf_west, ny, MPI_DOUBLE, nbr_west, 2, cart_comm, &reqs[req_cnt++]);
// Do inner domain computation while communication is in flight
compute_inner_domain();
// Wait for boundaries
MPI_Waitall(req_cnt, reqs, MPI_STATUSES_IGNORE);
compute_halo_regions();