intmain(int argc, char ** argv) { int rank, size, i; int buffer[10]; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm comm = MPI_COMM_WORLD; MPI_Comm_rank(comm, &rank); MPI_Comm_size(comm, &size); fprintf(stderr, "size = %d\n", size);
if (size < 2) { fprintf(stderr, "Please run with two processes.\n"); fflush(stderr); MPI_Finalize(); return0; } elseif(rank == 0) { for (i = 0; i < 10; ++i) { buffer[i] = -1; } MPI_Recv(buffer, 10, MPI_INT, 1, 123, comm, &status);
// Check. for (i = 0; i < 10; ++i) { if (buffer[i] != i) { fprintf(stderr, "Error: buffer[%d]=%d but is expected to be %d\n", i, buffer[i], i); } }
for (i = 0; i < 10; ++i) { fprintf(stderr, "buffer[%d]=%d but is expected to be %d\n", i, buffer[i], i); } fflush(stderr); } elseif (rank == 1) { for (i = 0; i < 10; ++i) { buffer[i] = i; }
MPI_Rsend(buffer, 10, MPI_INT, 0, 123, comm); }
MPI_Finalize();
return0; }
编译后能够在两个进程中正确运行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[zjshao@master ch02]$ mpicc rsendrecv.c -o rsendrecv.x [zjshao@master ch02]$ mpiexec -n 2 -host node01 rsendrecv.x size = 2 size = 2 buffer[0]=0 but is expected to be 0 buffer[1]=1 but is expected to be 1 buffer[2]=2 but is expected to be 2 buffer[3]=3 but is expected to be 3 buffer[4]=4 but is expected to be 4 buffer[5]=5 but is expected to be 5 buffer[6]=6 but is expected to be 6 buffer[7]=7 but is expected to be 7 buffer[8]=8 but is expected to be 8 buffer[9]=9 but is expected to be 9 [zjshao@master ch02]$
// Check. for (i = 0; i < 10; ++i) { if (buffer[i] != i) { fprintf(stderr, "Error: buffer[%d]=%d but is expected to be %d\n", i, buffer[i], i); } }
for (i = 0; i < 10; ++i) { fprintf(stderr, "buffer[%d]=%d but is expected to be %d\n", i, buffer[i], i); } fflush(stderr); } elseif (rank == 1) { for (i = 0; i < 10; ++i) { buffer[i] = i; }
=================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = PID 10073 RUNNING AT node01 = EXIT CODE: 11 = CLEANING UP REMAINING PROCESSES = YOU CAN IGNORE THE BELOW CLEANUP MESSAGES =================================================================================== YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11) This typically refers to a problem with your application. Please see the FAQ page for debugging suggestions [zjshao@master ch02]$