<div dir="ltr">Dear All,<br><br>Hi, <br>This is a prototype program which I am going to implement it in another program. I want to send objects. The program works very well when &#39;shapeset&#39; is small. But when I increase number of CPU, and Shapeset size , I get the following error message:<br>
<br>&quot;rank 0 in job 12&nbsp; localhost.localdomain_60694&nbsp;&nbsp; caused collective abort of all ranks<br>&nbsp; exit status of rank 0: killed by signal 9 &quot;<br><br>I have a master process which works on Rank 0 and Slaves which are working on Other ranks. <br>
Master serialize (write all the information in a char buffer) a Shape object and send it through MPI::Send. Slaves are reciving the Objects and Deserialize it and call a function pointer to operate on the object. <br>Sorry the code is little bit long.<br>
<br>I really appreciate your help. I need some advices. I am working on Linux-Fedora with dual core cpu. <br><br>Sincerely,<br><br>-- <br>Gholamreza Sobhaninejad(Reza)<br>PhD candidate, University of Tokyo<br>Earthquake Research Institute<br>
Tel: 090-9807-2477<br><br><br>This is a code that I am trying to run it:<br>------------------------------------------------------------------------ <br>head.h :<br>#include &lt;mpi.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;cstdlib&gt;<br>
#include &lt;iostream&gt;<br>#include &lt;string&gt;<br>#include &lt;sstream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;vector&gt;<br>#include &lt;time.h&gt;<br><br>using namespace std;<br><br>const char delim = &#39; &#39;;<br>
<br>#include &quot;Node.h&quot;<br>#include &quot;Shape.h&quot;<br><br>#include &quot;MPI_Process.h&quot;<br><br>------------------------------------------------------------------------<br>Node.h<br>#ifndef _NODE_H_<br>#define _NODE_H_<br>
<br>static const string Node_head=&quot;&lt;\\Node&gt;&quot;;<br>static const string Node_tail=&quot;&lt;Node\\&gt;&quot;;<br><br>class Node<br>{<br><br>public:<br>&nbsp;&nbsp;&nbsp; int id;<br>&nbsp;&nbsp;&nbsp; double x,y,z;<br>&nbsp;&nbsp;&nbsp; ///---- Constructur, Destructor, Copy Constructor<br>
<br>&nbsp;&nbsp;&nbsp; Node():x(0),y(0),z(0),id(0) {}<br>&nbsp;&nbsp;&nbsp; ~Node() {}<br>&nbsp;&nbsp;&nbsp; Node(int ID, double X=0, double Y=0, double Z=0) {id = ID; x=X; y=Y; z=Z;}<br>&nbsp;&nbsp;&nbsp; Node(const Node&amp; anode) {id=<a href="http://anode.id">anode.id</a>; x=anode.x; y= anode.y; z=anode.z;}<br>
<br>&nbsp;&nbsp;&nbsp; //---- Mutator and Accessors<br>&nbsp;&nbsp;&nbsp; void SetID(int ID) {id = ID;}<br>&nbsp;&nbsp;&nbsp; void Set(int ID, double X=0, double Y=0, double Z=0) {id = ID; x=X; y=Y; z=Z;}<br><br>&nbsp;&nbsp;&nbsp; Node Get() {return *this;}<br><br><br><br><br>&nbsp;&nbsp;&nbsp; //---- Serialization and De serialization <br>
&nbsp;&nbsp;&nbsp; void Serialize(stringstream&amp; out)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out &lt;&lt; delim &lt;&lt; Node_head &lt;&lt; delim &lt;&lt; this-&gt;id &lt;&lt; delim &lt;&lt; this-&gt;x &lt;&lt; delim<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;&lt; this-&gt;y &lt;&lt; delim &lt;&lt; this-&gt;z &lt;&lt; delim &lt;&lt;Node_tail &lt;&lt; &#39;\n&#39;;<br>
&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; void DeSerialize(stringstream&amp; in)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string tmp;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; in &gt;&gt; tmp &gt;&gt; this-&gt;id &gt;&gt;this-&gt;x &gt;&gt; this-&gt;y &gt;&gt; this-&gt;z &gt;&gt;tmp;<br><br>&nbsp;&nbsp;&nbsp; }<br>
<br><br>};<br><br>#endif<br>---------------------------------------------------------------------------------------------<br>MPI_Process.h :<br>#ifndef _MPI_PROCESS_H_<br>#define _MPI_PROCESS_H_<br><br>///---- Message Passing Tags<br>
<br>#define WORKTAG 1<br>#define LENTAG&nbsp; 3<br>#define DIETAG 2<br>#define SLAVE_GET_LENGTH 4<br>#define SLAVE_WORK_FINISH 5<br><br>class MPI_Process<br>{<br>private:<br>&nbsp;&nbsp;&nbsp; int* source_ID;<br>&nbsp;&nbsp;&nbsp; int* current_ID;<br>&nbsp;&nbsp;&nbsp; int* num_Process ;<br>
&nbsp;&nbsp;&nbsp; int* length ;<br><br>&nbsp;&nbsp;&nbsp; MPI::Status status;<br><br>&nbsp;&nbsp;&nbsp; void Probe_Message_Length();<br><br>public:<br>&nbsp;&nbsp;&nbsp; MPI_Process(void);<br>&nbsp;&nbsp;&nbsp; ~MPI_Process(void);<br><br>&nbsp;&nbsp;&nbsp; void Kill_Process(int rank);<br><br>&nbsp;&nbsp;&nbsp; //-- Set &amp; Get<br>
<br>&nbsp;&nbsp;&nbsp; void Set_Num_Proc(int i);<br>&nbsp;&nbsp;&nbsp; int&nbsp; Get_Num_Proc();<br><br>&nbsp;&nbsp;&nbsp; void Set_SourceID(int i);<br>&nbsp;&nbsp;&nbsp; int Get_SourceID();<br><br>&nbsp;&nbsp;&nbsp; void Set_CurrentID(int i);<br>&nbsp;&nbsp;&nbsp; int&nbsp; Get_CurrentID();<br><br>&nbsp;&nbsp;&nbsp; int Send_Serializable_Object&nbsp;&nbsp;&nbsp; &nbsp;( void* Object , <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; int&nbsp; rank&nbsp;&nbsp;&nbsp; , <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; void (*pt2function)(void* Object,stringstream&amp; stream)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; );<br><br>&nbsp;&nbsp;&nbsp; int Recieve_Serializable_Object&nbsp; ( void* Object,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; void (*pt2function)(void* Object,stringstream&amp; stream)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;);<br><br>};<br><br><br>#endif<br>----------------------------------------------------------------------------------<br>
Shape.h :<br><br>#ifndef _SHAPE_H_<br>#define _SHAPE_H_<br><br><br>static const string Shape_head=&quot;&lt;\\Shape&gt;&quot;;<br>static const string Shape_tail=&quot;&lt;Shape\\&gt;&quot;;<br><br>string&nbsp;&nbsp;&nbsp; Int2Str(int num);<br>
<br><br>class Shape<br>{<br>public : <br>&nbsp;&nbsp;&nbsp; int id;<br>&nbsp;&nbsp;&nbsp; vector&lt;Node&gt; nodeset;<br><br>&nbsp;&nbsp;&nbsp; Shape() : id(0) {}<br>&nbsp;&nbsp;&nbsp; ~Shape() {nodeset.clear();}<br><br>&nbsp;&nbsp;&nbsp; Shape(const Shape&amp; aShape);<br><br>&nbsp;&nbsp;&nbsp; void SetID(int ID) {id = ID;}<br>
&nbsp;&nbsp;&nbsp; void MakeShape();<br>&nbsp;&nbsp;&nbsp; void Serialize(stringstream&amp; out);<br>&nbsp;&nbsp;&nbsp; void DeSerialize(stringstream&amp; in);<br><br>&nbsp;&nbsp;&nbsp; void Write2File()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stringstream ss;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ofstream out( (&quot;Shape&quot; + Int2Str(this-&gt;id)+&quot;.shp&quot;).c_str());<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this-&gt;Serialize(ss);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.write(ss.str().c_str(), ss.str().size());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ss.clear();<br>&nbsp;&nbsp;&nbsp; }<br><br><br>&nbsp;&nbsp;&nbsp; static void Wrapper_To_MPI_SEND (void* Object, stringstream&amp; out);<br>
<br>&nbsp;&nbsp;&nbsp; static void Wrapper_To_MPI_RECIVE (void* Object, stringstream&amp; in);<br>&nbsp;&nbsp;&nbsp; <br>};<br><br>#endif<br>-------------------------------------------------------------------------------------------<br>MPI_Process.cpp :<br>
<br clear="all">#include &quot;head.h&quot;<br>#include &lt;string.h&gt;<br>MPI_Process::MPI_Process(void){}<br><br>MPI_Process::~MPI_Process(void){}<br><br>void MPI_Process::Set_Num_Proc(int i)<br>{<br>&nbsp;&nbsp;&nbsp; this-&gt;num_Process = new int;<br>
&nbsp;&nbsp;&nbsp; *this-&gt;num_Process = i;<br>}<br><br>int MPI_Process::Get_Num_Proc()<br>{<br>&nbsp;&nbsp;&nbsp; return *this-&gt;num_Process;<br>}<br><br>void MPI_Process::Set_SourceID(int i)<br>{<br>&nbsp;&nbsp;&nbsp; &nbsp;this-&gt;source_ID&nbsp; = new int;<br>&nbsp;&nbsp;&nbsp; &nbsp;*this-&gt;source_ID = i;<br>
}<br><br>int MPI_Process::Get_SourceID()<br>{<br>&nbsp;&nbsp;&nbsp; return *this-&gt;source_ID;<br>}<br><br>void MPI_Process::Set_CurrentID(int i)<br>{<br>&nbsp;&nbsp;&nbsp; this-&gt;current_ID = new int; <br>&nbsp;&nbsp;&nbsp; *this-&gt;current_ID = i;<br>}<br><br>
void MPI_Process::Probe_Message_Length()<br>{<br>&nbsp;&nbsp;&nbsp; MPI::COMM_WORLD.Probe(*this-&gt;source_ID,WORKTAG,this-&gt;status);<br>&nbsp;&nbsp;&nbsp; this-&gt;length = new int(status.Get_count(MPI::CHAR) );<br>}<br><br><br>int MPI_Process::Send_Serializable_Object(void* Object, int rank, void (*pt2function)(void* Object,stringstream&amp; stream))<br>
{<br>&nbsp;&nbsp;&nbsp; stringstream * stream;<br>&nbsp;&nbsp;&nbsp; char* buffer; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int message_length;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; stream = new stringstream(); <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //-- Serialize&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; pt2function(Object,*stream);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; message_length = stream-&gt;str().length();<br>
&nbsp;&nbsp;&nbsp; buffer = new char[message_length];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; strcpy(buffer,stream-&gt;str().c_str());<br><br>&nbsp;&nbsp;&nbsp; MPI::COMM_WORLD.Send(buffer,message_length,MPI::CHAR,rank,WORKTAG);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete stream;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] buffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message_length ;<br>}<br><br>int MPI_Process::Recieve_Serializable_Object(void* Object, void (*pt2function)(void* Object,stringstream&amp; stream))<br>{&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; stringstream * stream;<br>
&nbsp;&nbsp;&nbsp; char* buffer; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; this-&gt;Probe_Message_Length();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; buffer = new char[ *this-&gt;length ];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(*this-&gt;length == 1 ) cout &lt;&lt; buffer &lt;&lt;endl;<br><br>
<br><br>&nbsp;&nbsp;&nbsp; MPI::COMM_WORLD.Recv(buffer,*this-&gt;length,MPI::CHAR, 0 ,WORKTAG);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(buffer[0] ==&#39;0&#39;) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete stream;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] buffer;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stream = new stringstream();&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stream-&gt;str(buffer);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pt2function(Object,*stream);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stream-&gt;clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete stream;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] buffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return *this-&gt;length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>void MPI_Process::Kill_Process(int rank)<br>{<br>&nbsp;&nbsp;&nbsp; char *buffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer = new char[1];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer[0]=&#39;0&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Process No: &quot; &lt;&lt; rank &lt;&lt; &quot;is killed&quot; &lt;&lt; &#39;\n&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI::COMM_WORLD.Send(&amp;buffer,1,MPI::CHAR,rank,WORKTAG);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] buffer;<br>&nbsp;&nbsp;&nbsp; //MPI::COMM_WORLD.Sendrecv(&amp;buffer,1,MPI::CHAR,rank,WORKTAG,&amp;tmp,1,MPI::INT,rank,WORKTAG);<br>}<br>----------------------------------------------------------------------------------------------------------------------<br>
Shape.h :<br>#include &quot;head.h&quot;<br><br><br>Shape::Shape(const Shape&amp; aShape)<br>{<br>&nbsp;&nbsp;&nbsp; /*this-&gt;id = aShape.id;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for(vector&lt;Node&gt;::iterator i=aShape.nodeset.begin() ; i!=aShape.nodeset.end(); i++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this-&gt;nodeset.push_back(*i);*/<br>}<br>string&nbsp;&nbsp;&nbsp; Int2Str(int num)<br>{<br>&nbsp;&nbsp;&nbsp; stringstream ss;<br>&nbsp;&nbsp;&nbsp; ss &lt;&lt; num;<br>&nbsp;&nbsp;&nbsp; return ss.str();<br>}<br><br>void Shape::MakeShape()<br>{<br>&nbsp;&nbsp;&nbsp; Node n;<br>&nbsp;&nbsp;&nbsp; for(register int i=0;i&lt;10;i++) <br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //n.Set(i,0.01*i,1.0*i,2.0*i);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; n.Set(rand()%100,rand()%100,rand()%100,rand()%100);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this-&gt;nodeset.push_back(n);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>void Shape::Serialize(stringstream&amp; out)<br>
{<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Start of Serialization Processes NO &quot; &lt;&lt; MPI::COMM_WORLD.Get_rank()&nbsp;&nbsp;&nbsp; &lt;&lt;endl;<br><br>&nbsp;&nbsp;&nbsp; out &lt;&lt; Shape_head &lt;&lt; &#39;\n&#39; &lt;&lt;delim &lt;&lt; this-&gt;id &lt;&lt; delim &lt;&lt; (int) this-&gt;nodeset.size() &lt;&lt; &#39;\n&#39;;<br>
&nbsp;&nbsp;&nbsp; for(vector&lt;Node&gt;::iterator i=this-&gt;nodeset.begin(); i!= this-&gt;nodeset.end();i++) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i-&gt;Serialize(out);<br>&nbsp;&nbsp;&nbsp; out &lt;&lt; Shape_tail&nbsp; &lt;&lt;&#39;\n&#39; ;<br>}<br><br>void Shape::DeSerialize(stringstream&amp; in)<br>
{<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Start of DeSerialization Processes NO &quot; &lt;&lt; MPI::COMM_WORLD.Get_rank()&nbsp;&nbsp;&nbsp; &lt;&lt;endl;<br><br>&nbsp;&nbsp;&nbsp; string tmp;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; number_of_nodes;<br>&nbsp;&nbsp;&nbsp; in &gt;&gt; tmp &gt;&gt; this-&gt;id &gt;&gt; number_of_nodes;<br>
&nbsp;&nbsp;&nbsp; this-&gt;nodeset.resize(number_of_nodes);<br>&nbsp;&nbsp;&nbsp; for(vector&lt;Node&gt;::iterator i=this-&gt;nodeset.begin(); i!=this-&gt;nodeset.end();i++) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i-&gt;DeSerialize(in);<br>&nbsp;&nbsp;&nbsp; in &gt;&gt; tmp;&nbsp;&nbsp;&nbsp; <br>}<br><br><br>
<br>void Shape::Wrapper_To_MPI_SEND(void* Object, stringstream&amp; out)<br>{<br>&nbsp;&nbsp;&nbsp; Shape* myself = (Shape*) Object;<br>&nbsp;&nbsp;&nbsp; myself-&gt;Serialize(out);<br>}<br><br><br>void Shape::Wrapper_To_MPI_RECIVE(void *Object, std::stringstream&amp; in)<br>
{<br>&nbsp;&nbsp;&nbsp; Shape* myself = (Shape*) Object;<br>&nbsp;&nbsp;&nbsp; myself-&gt;DeSerialize(in);<br>&nbsp;&nbsp;&nbsp; myself-&gt;Write2File();<br>}<br><br><br>-------------------------------------------------------------------------------------<br><br>main.cpp :<br>
#include &quot;head.h&quot;<br><br><br><br>void Slave()<br>{<br><br>&nbsp;&nbsp;&nbsp; MPI_Process *slave_process = new MPI_Process();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; slave_process-&gt;Set_SourceID(0);<br>&nbsp;&nbsp;&nbsp; slave_process-&gt;Set_CurrentID(MPI::COMM_WORLD.Get_rank());<br>
&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; Shape shape;<br><br>&nbsp;&nbsp;&nbsp; while(slave_process-&gt;Recieve_Serializable_Object( (void*) &amp;shape, Shape::Wrapper_To_MPI_RECIVE)&nbsp; != 0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Slave No: &quot; &lt;&lt; MPI::COMM_WORLD.Get_size() &lt;&lt; &quot; Finished Work.&quot; &lt;&lt;endl; <br>
&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Slave No: &quot; &lt;&lt; MPI::COMM_WORLD.Get_size() &lt;&lt; &quot; Quit.&quot; &lt;&lt;endl; <br>}<br><br>&nbsp;void Master(vector&lt;Shape&gt;&amp; shapeset)<br>{<br>&nbsp;&nbsp;&nbsp; MPI_Process* master_Process = new MPI_Process();<br>
&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; int check(0),rank(1),nproc,counter(0);<br><br>&nbsp;&nbsp;&nbsp; master_Process -&gt;Set_Num_Proc(MPI::COMM_WORLD.Get_size());<br>&nbsp;&nbsp;&nbsp; master_Process-&gt;Set_CurrentID(0);<br>&nbsp;&nbsp;&nbsp; master_Process-&gt;Set_SourceID(0);<br>&nbsp;&nbsp;&nbsp; nproc = master_Process-&gt;Get_Num_Proc();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;Shape&gt;::iterator i(shapeset.begin());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; shapeset.size() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for(counter; counter &lt; (int) shapeset.size();counter++,rank++)<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i!=shapeset.end()) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(rank &gt; nproc-1) rank =1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Master Send a Message with Lenght of :&quot; &lt;&lt; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; master_Process-&gt;Send_Serializable_Object((void*) &amp;(*i) ,rank, Shape::Wrapper_To_MPI_SEND) <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;&lt; &quot; to CPU Rank:&quot; &lt;&lt; rank &lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; cout &lt;&lt;&quot; Start of Turning off System!&quot; &lt;&lt; endl;<br><br>&nbsp;&nbsp;&nbsp; for(rank=1; rank&lt; nproc ;&nbsp; ++rank)<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;sending Kill Message to Proc: &quot; &lt;&lt; rank &lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; master_Process-&gt;Kill_Process(rank);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br><br><br><br><br>int main(int argc, char ** argv)<br>
{<br>&nbsp;&nbsp;&nbsp; srand( (int) time(NULL));<br>&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; int rank,nproc,nwork;<br><br>&nbsp;&nbsp;&nbsp; //--- Start of MPI CALL<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; MPI::Status status;<br>&nbsp;&nbsp;&nbsp; MPI::Init(argc,argv);<br><br>&nbsp;&nbsp;&nbsp; nproc=MPI::COMM_WORLD.Get_size();<br>
&nbsp;&nbsp;&nbsp; rank = MPI::COMM_WORLD.Get_rank();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(rank==0) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vector&lt;Shape&gt; shapeset;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; shapeset.resize(10000);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int j=0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for( vector&lt;Shape&gt;::iterator i=shapeset.begin(); i!=shapeset.end(); i++, ++j)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i-&gt;SetID(j);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for( vector&lt;Shape&gt;::iterator i=shapeset.begin(); i!=shapeset.end(); i++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i-&gt;MakeShape();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Shape Initialization Finished&quot; &lt;&lt; endl;<br>
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Processor NO:&nbsp; &quot; &lt;&lt; rank &lt;&lt; &quot; Started&quot; &lt;&lt;endl;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Master(shapeset);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Processor NO:&nbsp; &quot; &lt;&lt; rank &lt;&lt; &quot; Started&quot; &lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Slave();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; MPI::Finalize();<br><br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br><br><br>
</div>