<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7036.0">
<TITLE>RE: [mpich-discuss] Problem in sending vector &lt;string&gt; by MPI c++</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2><BR>
&gt;&gt; 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.<BR>
&gt;&gt; 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 ...<BR>
<BR>
std::string::c_str() would be the right way to convert a C++ string to a C string.<BR>
<BR>
-jayesh<BR>
<BR>
-----Original Message-----<BR>
From: mpich-discuss-bounces@mcs.anl.gov [<A HREF="mailto:mpich-discuss-bounces@mcs.anl.gov">mailto:mpich-discuss-bounces@mcs.anl.gov</A>] On Behalf Of Dorian Krause<BR>
Sent: Thursday, August 13, 2009 3:30 AM<BR>
To: mpich-discuss@mcs.anl.gov<BR>
Subject: Re: [mpich-discuss] Problem in sending vector &lt;string&gt; by MPI c++<BR>
<BR>
Hi,<BR>
<BR>
there are some issues:<BR>
<BR>
* 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.<BR>
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 ...<BR>
<BR>
* 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<BR>
<BR>
* the reserve(3) calll just increases the *capacity* not the size. I think you want to use resize(3) here, right?<BR>
<BR>
* 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!<BR>
<BR>
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:<BR>
<A HREF="http://www.boost.org/doc/libs/1_39_0/doc/html/mpi.html">http://www.boost.org/doc/libs/1_39_0/doc/html/mpi.html</A><BR>
<BR>
Dorian<BR>
<BR>
Vineet Pratap (Vampaier) wrote:<BR>
&gt; Hello can somebody help me to sending it................<BR>
&gt;<BR>
&gt; #include &lt;iostream&gt;<BR>
&gt; #include &lt;vector&gt;<BR>
&gt; #include &lt;string&gt;<BR>
&gt; #include&quot;mpi.h&quot;<BR>
&gt; using namespace std;<BR>
&gt;<BR>
&gt; main(int argc, char *argv[])<BR>
&gt; {<BR>
&gt;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI::Status status;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI::Init(argc,argv);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int myrank = MPI::COMM_WORLD.Get_rank();<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int numprocs = MPI::COMM_WORLD.Get_size();<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Datatype strtype;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //int blocklen=16;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //MPI_Aint disp[3]={0,16,32};<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Type_contiguous(16,MPI::CHAR,&amp;strtype);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Type_commit(&amp;strtype);<BR>
&gt;&nbsp;&nbsp;&nbsp; vector&lt;string&gt; SS;<BR>
&gt;&nbsp; if(myrank == 0){<BR>
&gt;&nbsp;&nbsp;&nbsp; SS.push_back(&quot;The number is 10&quot;);<BR>
&gt;&nbsp;&nbsp;&nbsp; SS.push_back(&quot;The number is 20&quot;);<BR>
&gt;&nbsp;&nbsp;&nbsp; SS.push_back(&quot;The number is 30&quot;);<BR>
&gt;<BR>
&gt;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;At root Node: &quot; &lt;&lt; endl;<BR>
&gt;<BR>
&gt;&nbsp;&nbsp;&nbsp; int ii;<BR>
&gt;&nbsp;&nbsp;&nbsp; for(ii=0; ii &lt; SS.size(); ii++)<BR>
&gt;&nbsp;&nbsp;&nbsp; {<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; SS[ii] &lt;&lt; endl;<BR>
&gt;&nbsp;&nbsp;&nbsp; }<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //MPI_Type_contiguous(16,MPI::CHAR,strtype);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI::COMM_WORLD.Send(&amp;SS[0],3,strtype, 1, 1);&nbsp; } else{<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SS.reserve(3);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI::COMM_WORLD.Recv(&amp;SS[0],3,strtype,0,1);<BR>
&gt;&nbsp;&nbsp;&nbsp; int ii;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;At worker Node: &quot; &lt;&lt; endl;<BR>
&gt;&nbsp;&nbsp;&nbsp; for(ii=0; ii &lt; SS.size(); ii++)<BR>
&gt;&nbsp;&nbsp;&nbsp; {<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; SS[ii] &lt;&lt; endl;<BR>
&gt;&nbsp;&nbsp;&nbsp; }<BR>
&gt;&nbsp; }<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI::Finalize();<BR>
&gt; }<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt; Now My&nbsp; O/P is:<BR>
&gt; $ mpicxx vecDemo.cpp -o vDemo.out -DMPICH_IGNORE_CXX_SEEK $ mpirun -np<BR>
&gt; 2 ./vDemo.out At root Node:<BR>
&gt; The number is 10<BR>
&gt; The number is 20<BR>
&gt; The number is 30<BR>
&gt; At worker Node:<BR>
&gt; $<BR>
&gt;<BR>
&gt; BUT i want O/P like.......<BR>
&gt; $ mpirun -np 2 ./vDemo.out<BR>
&gt; At root Node:<BR>
&gt; The number is 10<BR>
&gt; The number is 20<BR>
&gt; The number is 30<BR>
&gt; At worker Node:<BR>
&gt; The number is 10<BR>
&gt; The number is 20<BR>
&gt; The number is 30<BR>
&gt; $<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>