[mpich-discuss] Problem in sending vector <string> by MPI c++

Jayesh Krishna jayesh at mcs.anl.gov
Thu Aug 13 09:05:11 CDT 2009


 
>> when you send char* (strings) then make sure that you either add the
trailing '\0' at the other end or that you send it with the string (i.e. 
>> change the 16 to 17 (if I counted correctly)). I don't know how
std::string handles the lenght calculation but they might use the trailing
zero ...

std::string::c_str() would be the right way to convert a C++ string to a C
string.

-jayesh

-----Original Message-----
From: mpich-discuss-bounces at mcs.anl.gov
[mailto:mpich-discuss-bounces at mcs.anl.gov] On Behalf Of Dorian Krause
Sent: Thursday, August 13, 2009 3:30 AM
To: mpich-discuss at mcs.anl.gov
Subject: Re: [mpich-discuss] Problem in sending vector <string> by MPI c++

Hi,

there are some issues:

* when you send char* (strings) then make sure that you either add the
trailing '\0' at the other end or that you send it with the string (i.e. 
change the 16 to 17 (if I counted correctly)). I don't know how
std::string handles the lenght calculation but they might use the trailing
zero ...

* You can't send the three vectors ad once using one send call in this way
since the data will typically (in your case certainly) not be contiguous
in memory. You could create a new derived datatype of Type MPI_Type_struct
which (based on the strtype) allows you to send all three ad once

* the reserve(3) calll just increases the *capacity* not the size. I think
you want to use resize(3) here, right?

* Make sure that receiver side always has enough memory allocated. The
strings stored in the vector are of the size given to them by the default
constructor which is 0 in this case!

Note that boost has some convenient wrappers around MPI which replaces the
C++ bindings (which are deprecated in MPI 2.2) and allows you to send stl
datatypes in an easy fashion: 
http://www.boost.org/doc/libs/1_39_0/doc/html/mpi.html

Dorian

Vineet Pratap (Vampaier) wrote:
> Hello can somebody help me to sending it................
>
> #include <iostream>
> #include <vector>
> #include <string>
> #include"mpi.h"
> using namespace std;
>
> main(int argc, char *argv[])
> {
>
>         MPI::Status status;
>         MPI::Init(argc,argv);
>         int myrank = MPI::COMM_WORLD.Get_rank();
>         int numprocs = MPI::COMM_WORLD.Get_size();
>         MPI_Datatype strtype;
>         //int blocklen=16;
>         //MPI_Aint disp[3]={0,16,32};
>         MPI_Type_contiguous(16,MPI::CHAR,&strtype);
>         MPI_Type_commit(&strtype);
>    vector<string> SS;
>  if(myrank == 0){
>    SS.push_back("The number is 10");
>    SS.push_back("The number is 20");
>    SS.push_back("The number is 30");
>
>    cout << "At root Node: " << endl;
>
>    int ii;
>    for(ii=0; ii < SS.size(); ii++)
>    {
>       cout << SS[ii] << endl;
>    }
>         //MPI_Type_contiguous(16,MPI::CHAR,strtype);
>         MPI::COMM_WORLD.Send(&SS[0],3,strtype, 1, 1);  } else{
>         SS.reserve(3);
>         MPI::COMM_WORLD.Recv(&SS[0],3,strtype,0,1);
>    int ii;
>          cout << "At worker Node: " << endl;
>    for(ii=0; ii < SS.size(); ii++)
>    {
>       cout << SS[ii] << endl;
>    }
>  }
>         MPI::Finalize();
> }
>
>
>
> Now My  O/P is:
> $ mpicxx vecDemo.cpp -o vDemo.out -DMPICH_IGNORE_CXX_SEEK $ mpirun -np 
> 2 ./vDemo.out At root Node:
> The number is 10
> The number is 20
> The number is 30
> At worker Node:
> $
>
> BUT i want O/P like.......
> $ mpirun -np 2 ./vDemo.out
> At root Node:
> The number is 10
> The number is 20
> The number is 30
> At worker Node:
> The number is 10
> The number is 20
> The number is 30
> $

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich-discuss/attachments/20090813/7af1ad2d/attachment.htm>


More information about the mpich-discuss mailing list