5 #define N (1024 * 1024 * 1)
7 int main(int argc, char* argv[])
10 struct timeval start, end;
14 MPI_Init(&argc, &argv);
16 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
17 MPI_Comm_size(MPI_COMM_WORLD, &size);
18 MPI_Get_processor_name(hostname, &hostname_len);
20 // Allocate a 1 MiB buffer
21 char* buffer = malloc(sizeof(char) * N);
23 // Communicate along the ring
25 gettimeofday(&start, NULL);
26 printf("Rank %d (running on '%s'): sending the message rank %d\n", rank, hostname, 1);
27 MPI_Send(buffer, N, MPI_BYTE, 1, 1, MPI_COMM_WORLD);
28 MPI_Recv(buffer, N, MPI_BYTE, size - 1, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
29 printf("Rank %d (running on '%s'): received the message from rank %d\n", rank, hostname, size - 1);
30 gettimeofday(&end, NULL);
31 printf("%f\n", (end.tv_sec * 1000000.0 + end.tv_usec - start.tv_sec * 1000000.0 - start.tv_usec) / 1000000.0);
34 MPI_Recv(buffer, N, MPI_BYTE, rank - 1, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
35 printf("Rank %d (running on '%s'): receive the message and sending it to rank %d\n", rank, hostname,
37 MPI_Send(buffer, N, MPI_BYTE, (rank + 1) % size, 1, MPI_COMM_WORLD);