post recvpost sendrank 0 10 index 0rank 0 completerank 1 1 index 0rank 1 9 index 1rank 1 complete
Because I want to understand the behavior of MPI_Waitsome, I change the program as fellow. MPI can waitsome 10 Isend request once time, while waitsome 1 Irecv request each time. Why waitsome-Irecv can not be more than 1 as I expect?=====MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Comm_rank(MPI_COMM_WORLD, &rank);if(rank==0) {for(i =0; i< 10;i++){MPI_Isend(buf[i], 10, MPI_BYTE, 1, 123, MPI_COMM_WORLD, &req[i]);}printf("post send\n");}else {for(i=0; i< 10;i++){MPI_Irecv(buf[i], 10, MPI_BYTE, 0, 123, MPI_COMM_WORLD, &req[i]);}printf("post recv\n");}for (;;){MPI_Waitsome(10, req, &outcount, array_of_indices, stat);complete += outcount;printf("rank %d %d index %d\n", rank, outcount, array_of_indices[0]);if(complete == 10)break;}printf("rank %d complete\n", rank);MPI_Finalize();=====$ mpirun -n 2 ./testspost sendpost recvrank 0 10 index 0rank 0 completerank 1 1 index 0rank 1 1 index 1rank 1 1 index 2rank 1 1 index 3rank 1 1 index 4rank 1 1 index 5rank 1 1 index 6rank 1 1 index 7rank 1 1 index 8rank 1 1 index 9rank 1 complete
At 2014-10-19 22:36:25, "Bland, Wesley B." <wbland@anl.gov> wrote:
You need to move your waitany outside of the if statement so both ranks execute it.
Here is my test program
======
#include "mpi.h"#include <stdio.h>#include <stdlib.h>#include <sys/time.h>typedef unsigned char byte;int main(int argc, char *argv[]){MPI_Init(&argc, &argv);int rank,size;MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Comm_rank(MPI_COMM_WORLD, &rank);byte buf[10][10];MPI_Request req[10];MPI_Status stat[10];int outcount;int array_of_indices[10];int i;if(rank==0) {for(i =0; i< 10;i++){MPI_Isend(buf[i], 10, MPI_BYTE, 1, 123, MPI_COMM_WORLD, &req[i]);}printf("post send\n");MPI_Waitall(10, req, stat);printf("send over\n");}else {for(i=0; i< 10;i++){MPI_Irecv(buf[i], 10, MPI_BYTE, 0, 123, MPI_COMM_WORLD, &req[i]);}printf("post recv\n");for (i=0;i<10;i++){MPI_Waitsome(10, req, &outcount, array_of_indices, stat);printf("%d index %d\n", outcount, array_of_indices[0]);}}MPI_Finalize();}
======get the result like this======$ mpirun -n 2 ./testspost sendsend overpost recv1 index 01 index 11 index 21 index 31 index 41 index 51 index 61 index 71 index 81 index 9
======
I think I should get some completed receive connection, not just 1.
_______________________________________________
discuss mailing list discuss@mpich.org
To manage subscription options or unsubscribe:
https://lists.mpich.org/mailman/listinfo/discuss
_______________________________________________
discuss mailing list discuss@mpich.org
To manage subscription options or unsubscribe:
https://lists.mpich.org/mailman/listinfo/discuss