使用MPI_Sendrecv实现MPI_Allgather
MPI_Allgather函数的作用是从所有进程收集数据并将收集的数据分发到所有进程。其优点是在通信过程中,不必考虑哪个进程先发送还是先接收消息,从而可以避免消息传递过程中的死锁:
1 int main(int argc, char *argv[]) 2 { 3 int rank, size; 4 MPI_Status status; 5 int S[20], R[20]; 6 int i; 7 8 MPI_Init(&argc, &argv); 9 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 10 MPI_Comm_size(MPI_COMM_WORLD, &size); 11 12 for (i = 0; i<20; i++) 13 { 14 S[i] = (rank + 1)*(i + 1); 15 R[i] = 0; 16 } 17 for (i = 0; i<size; i++){ 18 MPI_Sendrecv(S, 4, MPI_INT, i, 123, &R[i*4], 4, MPI_INT, i, 123, MPI_COMM_WORLD, &status); 19 } 20 21 MPI_Barrier(MPI_COMM_WORLD); 22 cout << "the data on proc " << rank << " is " ; 23 for (int i = 0; i < 20; i++) { 24 cout << R[i] << " "; 25 } 26 MPI_Barrier(MPI_COMM_WORLD); 27 MPI_Finalize(); 28 return 1; 29 }
需要注意的是:发送缓冲区和接收缓冲区不能相同。