#include #include int main() { MPI_Init(NULL, NULL); int my_rank; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); int origin_ranks[2] = {0, 1}; int target_ranks[1] = {0}; MPI_Group world_group, origin_group, target_group; MPI_Comm_group(MPI_COMM_WORLD, &world_group); MPI_Group_incl(world_group, 2, origin_ranks, &origin_group); MPI_Group_incl(world_group, 1, target_ranks, &target_group); unsigned char *buf; MPI_Win win; if (my_rank == 0) { MPI_Win_allocate(17, sizeof(unsigned char), MPI_INFO_NULL, MPI_COMM_WORLD, &buf, &win); MPI_Win_post(origin_group, 0, win); // Expose win on rank 0 to ranks 0 and 1 } else { MPI_Win_allocate(0, sizeof(unsigned char), MPI_INFO_NULL, MPI_COMM_WORLD, &buf, &win); } MPI_Win_start(target_group, 0, win); // Access win on rank 0 MPI_Win_complete(win); // Finish access of win if (my_rank == 0) { printf("Before wait\n"); fflush(stdout); MPI_Win_wait(win); // Wait until all processes have finished accessing win printf("After wait\n"); fflush(stdout); } MPI_Barrier(MPI_COMM_WORLD); MPI_Win_free(&win); MPI_Group_free(&target_group); MPI_Group_free(&origin_group); MPI_Finalize(); }