thanks Eugene for your example, it helps me a lot.I bump into one more problems lets say I have the file content as follow I have total of six files which all contain real and imaginary value. " 1.001212 1.0012121 //0th 1.001212 1.0012121 //1st 1.001212 1.0012121 //2nd 1.001212 1.0012121 //3rd 1.001212 1.0012121 //4th 1.001212 1.0012121 //5th 1.001212 1.0012121 //6th " char send_buffer[1000]; i use "mpirun -np 6 a.out" which mean i let each processor get access to one file each processor will add "0th and 2nd"(even values) (those values will be sent to root processor and save as file_even_add.dat" and also each processor will add "1st and 3rd"(odd values) (those values will be sent to root processor(here is 0) and saved as "file_odd_add.dat".
if(mpi_my_id == root) { } On Tue, Dec 23, 2008 at 3:53 PM, Eugene Loh <eugene....@sun.com> wrote: > Win Than Aung wrote: > > thanks for your reply jeff > so i tried following > > > > #include <stdio.h> > #include <mpi.h> > > int main(int argc, char **argv) { > int np, me, sbuf = -1, rbuf = -2,mbuf=1000; > int data[2]; > MPI_Init(&argc,&argv); > MPI_Comm_size(MPI_COMM_WORLD,&np); > MPI_Comm_rank(MPI_COMM_WORLD,&me); > if ( np < 2 ) MPI_Abort(MPI_COMM_WORLD,-1); > > if ( me == 1 ) MPI_Send(&sbuf,1,MPI_INT,0,344,MPI_COMM_WORLD); > if(me==2) MPI_Send( &mbuf,1,MPI_INT,0,344,MPI_COMM_WORLD); > if ( me == 0 ) { > > MPI_Recv(data,2,MPI_INT,MPI_ANY_SOURCE,344,MPI_COMM_WORLD,MPI_STATUS_IGNORE); > } > > MPI_Finalize(); > > return 0; > } > > it can successfuly receive the one sent from processor 1(me==1) but it > failed to receive the one sent from processor 2(me==2) > mpirun -np 3 hello > > There is only one receive, so it receives only one message. When you > specify the element count for the receive, you're only specifying the size > of the buffer into which the message will be received. Only after the > message has been received can you inquire how big the message actually was. > > Here is an example: > > % cat a.c > #include <stdio.h> > #include <mpi.h> > > int main(int argc, char **argv) { > int np, me, peer, value; > > MPI_Init(&argc,&argv); > MPI_Comm_size(MPI_COMM_WORLD,&np); > MPI_Comm_rank(MPI_COMM_WORLD,&me); > > value = me * me + 1; > if ( me == 0 ) { > for ( peer = 0; peer < np; peer++ ) { > if ( peer != 0 ) > MPI_Recv(&value,1,MPI_INT,peer,343,MPI_COMM_WORLD,MPI_STATUS_IGNORE); > printf("peer %d had value %d\n", peer, value); > } > } > else MPI_Send(&value,1,MPI_INT,0,343,MPI_COMM_WORLD); > > MPI_Finalize(); > > return 0; > } > % mpirun -np 3 a.out > peer 0 had value 1 > peer 1 had value 2 > peer 2 had value 5 > % > > Alternatively, > > #include <stdio.h> > #include <mpi.h> > > #define MAXNP 1024 > int main(int argc, char **argv) { > int np, me, peer, value, values[MAXNP]; > > MPI_Init(&argc,&argv); > MPI_Comm_size(MPI_COMM_WORLD,&np); > if ( np > MAXNP ) MPI_Abort(MPI_COMM_WORLD,-1); > MPI_Comm_rank(MPI_COMM_WORLD,&me); > value = me * me + 1; > > MPI_Gather(&value, 1, MPI_INT, > values, 1, MPI_INT, 0, MPI_COMM_WORLD); > > if ( me == 0 ) > for ( peer = 0; peer < np; peer++ ) > printf("peer %d had value %d\n", peer, values[peer]); > > MPI_Finalize(); > return 0; > } > % mpirun -np 3 a.out > peer 0 had value 1 > peer 1 had value 2 > peer 2 had value 5 > % > > Which is better? Up to you. The collective routines (like MPI_Gather) do > offer MPI implementors (like people developing Open MPI) the opportunity to > perform special optimizations (e.g., gather using a binary tree instead of > having the root process perform so many receives). > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users >