I run several times of the program, the results are as the same as before. Could you tell me your MPICH version and compiling parameters? The version of my MPICH is 3.1.3, I compile it as$ mpirun --versionHYDRA build details:Version: 3.1.3Release Date: Wed Oct 8 09:37:19 CDT 2014CC: gcc -fPICCXX: g++F77: gfortranF90: gfortranConfigure options: '--disable-option-checking' '--prefix=/usr/local/mpich3' '--with-device=ch3:nemesis' 'CFLAGS=-fPIC -O2' '--disable-fortran' '--cache-file=/dev/null' '--srcdir=.' 'CC=gcc' 'LDFLAGS= ' 'LIBS=-lpthread ' 'CPPFLAGS= -I/home/valder/Downloads/Software/mpi/mpich-3.1.3/src/mpl/include -I/home/valder/Downloads/Software/mpi/mpich-3.1.3/src/mpl/include -I/home/valder/Downloads/Software/mpi/mpich-3.1.3/src/openpa/src -I/home/valder/Downloads/Software/mpi/mpich-3.1.3/src/openpa/src -D_REENTRANT -I/home/valder/Downloads/Software/mpi/mpich-3.1.3/src/mpi/romio/include'Process Manager: pmiLaunchers available: ssh rsh fork slurm ll lsf sge manual persistTopology libraries available: hwlocResource management kernels available: user slurm ll lsf sge pbs cobaltCheckpointing libraries available:Demux engines available: poll selectthe whole program is=========#include "mpi.h"#include <stdio.h>#include <stdlib.h>#include <sys/time.h>typedef unsigned char byte;int main(int argc, char *argv[]){int rank,size;byte buf[10][10];MPI_Request req[10];MPI_Status stat[10];int outcount;int array_of_indices[10];int i;int complete = 0;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();}=========I compile it as$ mpicc -o tests testsome.cand run as$ mpirun -n 2 ./testsAt 2014-10-20 09:02:39, "Junchao Zhang" <jczhang@mcs.anl.gov> wrote:
I think it is random. For example, I ran your code and its output was:post recvpost sendrank 0 10 index 0rank 0 completerank 1 1 index 0rank 1 9 index 1rank 1 complete--Junchao ZhangOn Sun, Oct 19, 2014 at 9:48 AM, myself <chcdlf@126.com> wrote: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
_______________________________________________
discuss mailing list discuss@mpich.org
To manage subscription options or unsubscribe:
https://lists.mpich.org/mailman/listinfo/discuss