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
>

Reply via email to