[mpich-discuss] Killed by Signal 9!!!!???
Gholamreza Sobhaninejad
grsobhani at gmail.com
Mon Jul 28 09:27:33 CDT 2008
Hi,
Thanks for your answer.
I solved the problem. And now it is working perfectly.
Best regards,
Reza
On Mon, Jul 28, 2008 at 10:24 PM, Burlen Loring
<burlen.loring at kitware.com>wrote:
> Hi,
> In my experience a number of things could cause this. e.g. I have seen this
> if I run out of memory. The kernel steps in and kills the process. There
> might be some info in dmesg, have you looked? Might be something entirely
> different as well, such as too many open files. There are a bunch of
> settings you can tweak take a look at your environment settings via ulimit
> -a.
> Burlen
>
> Gholamreza Sobhaninejad wrote:
>
>> Dear All,
>>
>> Hi,
>> 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 'shapeset'
>> is small. But when I increase number of CPU, and Shapeset size , I get the
>> following error message:
>>
>> "rank 0 in job 12 localhost.localdomain_60694 caused collective abort
>> of all ranks
>> exit status of rank 0: killed by signal 9 "
>>
>> I have a master process which works on Rank 0 and Slaves which are working
>> on Other ranks.
>> 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.
>> Sorry the code is little bit long.
>>
>> I really appreciate your help. I need some advices. I am working on
>> Linux-Fedora with dual core cpu.
>>
>> Sincerely,
>>
>> --
>> Gholamreza Sobhaninejad(Reza)
>> PhD candidate, University of Tokyo
>> Earthquake Research Institute
>> Tel: 090-9807-2477
>>
>>
>> This is a code that I am trying to run it:
>> ------------------------------------------------------------------------
>> head.h :
>> #include <mpi.h>
>> #include <stdio.h>
>> #include <cstdlib>
>> #include <iostream>
>> #include <string>
>> #include <sstream>
>> #include <fstream>
>> #include <vector>
>> #include <time.h>
>>
>> using namespace std;
>>
>> const char delim = ' ';
>>
>> #include "Node.h"
>> #include "Shape.h"
>>
>> #include "MPI_Process.h"
>>
>> ------------------------------------------------------------------------
>> Node.h
>> #ifndef _NODE_H_
>> #define _NODE_H_
>>
>> static const string Node_head="<\\Node>";
>> static const string Node_tail="<Node\\>";
>>
>> class Node
>> {
>>
>> public:
>> int id;
>> double x,y,z;
>> ///---- Constructur, Destructor, Copy Constructor
>>
>> Node():x(0),y(0),z(0),id(0) {}
>> ~Node() {}
>> Node(int ID, double X=0, double Y=0, double Z=0) {id = ID; x=X; y=Y;
>> z=Z;}
>> Node(const Node& anode) {id=anode.id <http://anode.id>; x=anode.x; y=
>> anode.y; z=anode.z;}
>>
>>
>> //---- Mutator and Accessors
>> void SetID(int ID) {id = ID;}
>> void Set(int ID, double X=0, double Y=0, double Z=0) {id = ID; x=X;
>> y=Y; z=Z;}
>>
>> Node Get() {return *this;}
>>
>>
>>
>>
>> //---- Serialization and De serialization
>> void Serialize(stringstream& out)
>> {
>> out << delim << Node_head << delim << this->id << delim << this->x
>> << delim
>> << this->y << delim << this->z << delim <<Node_tail << '\n';
>> }
>>
>> void DeSerialize(stringstream& in)
>> {
>> string tmp;
>>
>> in >> tmp >> this->id >>this->x >> this->y >> this->z >>tmp;
>>
>> }
>>
>>
>> };
>>
>> #endif
>>
>> ---------------------------------------------------------------------------------------------
>> MPI_Process.h :
>> #ifndef _MPI_PROCESS_H_
>> #define _MPI_PROCESS_H_
>>
>> ///---- Message Passing Tags
>>
>> #define WORKTAG 1
>> #define LENTAG 3
>> #define DIETAG 2
>> #define SLAVE_GET_LENGTH 4
>> #define SLAVE_WORK_FINISH 5
>>
>> class MPI_Process
>> {
>> private:
>> int* source_ID;
>> int* current_ID;
>> int* num_Process ;
>> int* length ;
>>
>> MPI::Status status;
>>
>> void Probe_Message_Length();
>>
>> public:
>> MPI_Process(void);
>> ~MPI_Process(void);
>>
>> void Kill_Process(int rank);
>>
>> //-- Set & Get
>>
>> void Set_Num_Proc(int i);
>> int Get_Num_Proc();
>>
>> void Set_SourceID(int i);
>> int Get_SourceID();
>>
>> void Set_CurrentID(int i);
>> int Get_CurrentID();
>>
>> int Send_Serializable_Object ( void* Object ,
>> int rank ,
>> void (*pt2function)(void*
>> Object,stringstream& stream)
>> );
>>
>> int Recieve_Serializable_Object ( void* Object,
>> void (*pt2function)(void*
>> Object,stringstream& stream)
>> );
>>
>> };
>>
>>
>> #endif
>>
>> ----------------------------------------------------------------------------------
>> Shape.h :
>>
>> #ifndef _SHAPE_H_
>> #define _SHAPE_H_
>>
>>
>> static const string Shape_head="<\\Shape>";
>> static const string Shape_tail="<Shape\\>";
>>
>> string Int2Str(int num);
>>
>>
>> class Shape
>> {
>> public :
>> int id;
>> vector<Node> nodeset;
>>
>> Shape() : id(0) {}
>> ~Shape() {nodeset.clear();}
>>
>> Shape(const Shape& aShape);
>>
>> void SetID(int ID) {id = ID;}
>> void MakeShape();
>> void Serialize(stringstream& out);
>> void DeSerialize(stringstream& in);
>>
>> void Write2File()
>> {
>> stringstream ss;
>>
>> ofstream out( ("Shape" + Int2Str(this->id)+".shp").c_str());
>> this->Serialize(ss);
>> out.write(ss.str().c_str(), ss.str().size());
>> out.close();
>> ss.clear();
>> }
>>
>>
>> static void Wrapper_To_MPI_SEND (void* Object, stringstream& out);
>>
>> static void Wrapper_To_MPI_RECIVE (void* Object, stringstream& in);
>> };
>>
>> #endif
>>
>> -------------------------------------------------------------------------------------------
>> MPI_Process.cpp :
>>
>> #include "head.h"
>> #include <string.h>
>> MPI_Process::MPI_Process(void){}
>>
>> MPI_Process::~MPI_Process(void){}
>>
>> void MPI_Process::Set_Num_Proc(int i)
>> {
>> this->num_Process = new int;
>> *this->num_Process = i;
>> }
>>
>> int MPI_Process::Get_Num_Proc()
>> {
>> return *this->num_Process;
>> }
>>
>> void MPI_Process::Set_SourceID(int i)
>> {
>> this->source_ID = new int;
>> *this->source_ID = i;
>> }
>>
>> int MPI_Process::Get_SourceID()
>> {
>> return *this->source_ID;
>> }
>>
>> void MPI_Process::Set_CurrentID(int i)
>> {
>> this->current_ID = new int;
>> *this->current_ID = i;
>> }
>>
>> void MPI_Process::Probe_Message_Length()
>> {
>> MPI::COMM_WORLD.Probe(*this->source_ID,WORKTAG,this->status);
>> this->length = new int(status.Get_count(MPI::CHAR) );
>> }
>>
>>
>> int MPI_Process::Send_Serializable_Object(void* Object, int rank, void
>> (*pt2function)(void* Object,stringstream& stream))
>> {
>> stringstream * stream;
>> char* buffer;
>> int message_length;
>> stream = new stringstream();
>> //-- Serialize pt2function(Object,*stream);
>> message_length = stream->str().length();
>> buffer = new char[message_length];
>>
>> strcpy(buffer,stream->str().c_str());
>>
>> MPI::COMM_WORLD.Send(buffer,message_length,MPI::CHAR,rank,WORKTAG);
>> delete stream;
>> delete[] buffer;
>> return message_length ;
>> }
>>
>> int MPI_Process::Recieve_Serializable_Object(void* Object, void
>> (*pt2function)(void* Object,stringstream& stream))
>> { stringstream * stream;
>> char* buffer;
>>
>> this->Probe_Message_Length();
>> buffer = new char[ *this->length ];
>> if(*this->length == 1 ) cout << buffer <<endl;
>>
>>
>>
>> MPI::COMM_WORLD.Recv(buffer,*this->length,MPI::CHAR, 0 ,WORKTAG);
>> if(buffer[0] =='0')
>> {
>> delete stream;
>> delete[] buffer;
>> return 0;
>> }
>> else
>> {
>> stream = new stringstream();
>> stream->str(buffer);
>>
>> pt2function(Object,*stream);
>>
>> stream->clear();
>> delete stream;
>> delete[] buffer;
>> return *this->length;
>> }
>>
>> }
>>
>> void MPI_Process::Kill_Process(int rank)
>> {
>> char *buffer;
>> buffer = new char[1];
>> buffer[0]='0';
>> cout << "Process No: " << rank << "is killed" << '\n';
>> MPI::COMM_WORLD.Send(&buffer,1,MPI::CHAR,rank,WORKTAG);
>> delete[] buffer;
>>
>> //MPI::COMM_WORLD.Sendrecv(&buffer,1,MPI::CHAR,rank,WORKTAG,&tmp,1,MPI::INT,rank,WORKTAG);
>> }
>>
>> ----------------------------------------------------------------------------------------------------------------------
>> Shape.h :
>> #include "head.h"
>>
>>
>> Shape::Shape(const Shape& aShape)
>> {
>> /*this->id = aShape.id;
>> for(vector<Node>::iterator i=aShape.nodeset.begin() ;
>> i!=aShape.nodeset.end(); i++)
>> this->nodeset.push_back(*i);*/
>> }
>> string Int2Str(int num)
>> {
>> stringstream ss;
>> ss << num;
>> return ss.str();
>> }
>>
>> void Shape::MakeShape()
>> {
>> Node n;
>> for(register int i=0;i<10;i++)
>> {
>> //n.Set(i,0.01*i,1.0*i,2.0*i);
>> n.Set(rand()%100,rand()%100,rand()%100,rand()%100);
>> this->nodeset.push_back(n);
>> }
>> }
>>
>> void Shape::Serialize(stringstream& out)
>> {
>> cout << "Start of Serialization Processes NO " <<
>> MPI::COMM_WORLD.Get_rank() <<endl;
>>
>> out << Shape_head << '\n' <<delim << this->id << delim << (int)
>> this->nodeset.size() << '\n';
>> for(vector<Node>::iterator i=this->nodeset.begin(); i!=
>> this->nodeset.end();i++)
>> i->Serialize(out);
>> out << Shape_tail <<'\n' ;
>> }
>>
>> void Shape::DeSerialize(stringstream& in)
>> {
>> cout << "Start of DeSerialization Processes NO " <<
>> MPI::COMM_WORLD.Get_rank() <<endl;
>>
>> string tmp;
>> int number_of_nodes;
>> in >> tmp >> this->id >> number_of_nodes;
>> this->nodeset.resize(number_of_nodes);
>> for(vector<Node>::iterator i=this->nodeset.begin();
>> i!=this->nodeset.end();i++)
>> i->DeSerialize(in);
>> in >> tmp; }
>>
>>
>>
>> void Shape::Wrapper_To_MPI_SEND(void* Object, stringstream& out)
>> {
>> Shape* myself = (Shape*) Object;
>> myself->Serialize(out);
>> }
>>
>>
>> void Shape::Wrapper_To_MPI_RECIVE(void *Object, std::stringstream& in)
>> {
>> Shape* myself = (Shape*) Object;
>> myself->DeSerialize(in);
>> myself->Write2File();
>> }
>>
>>
>>
>> -------------------------------------------------------------------------------------
>>
>> main.cpp :
>> #include "head.h"
>>
>>
>>
>> void Slave()
>> {
>>
>> MPI_Process *slave_process = new MPI_Process();
>> slave_process->Set_SourceID(0);
>> slave_process->Set_CurrentID(MPI::COMM_WORLD.Get_rank());
>> Shape shape;
>>
>> while(slave_process->Recieve_Serializable_Object( (void*) &shape,
>> Shape::Wrapper_To_MPI_RECIVE) != 0)
>> {
>> cout << "Slave No: " << MPI::COMM_WORLD.Get_size() << " Finished
>> Work." <<endl;
>> }
>> cout << "Slave No: " << MPI::COMM_WORLD.Get_size() << " Quit." <<endl;
>> }
>>
>> void Master(vector<Shape>& shapeset)
>> {
>> MPI_Process* master_Process = new MPI_Process();
>> int check(0),rank(1),nproc,counter(0);
>>
>> master_Process ->Set_Num_Proc(MPI::COMM_WORLD.Get_size());
>> master_Process->Set_CurrentID(0);
>> master_Process->Set_SourceID(0);
>> nproc = master_Process->Get_Num_Proc();
>> vector<Shape>::iterator i(shapeset.begin());
>> cout << shapeset.size() << endl;
>> for(counter; counter < (int) shapeset.size();counter++,rank++)
>> {
>> if(i!=shapeset.end())
>> {
>> if(rank > nproc-1) rank =1;
>> cout << "Master Send a Message with Lenght of :" <<
>> master_Process->Send_Serializable_Object((void*) &(*i) ,rank,
>> Shape::Wrapper_To_MPI_SEND)
>> << " to CPU Rank:" << rank <<endl;
>> i++;
>> }
>> }
>>
>> cout <<" Start of Turning off System!" << endl;
>>
>> for(rank=1; rank< nproc ; ++rank)
>> {
>> cout << "sending Kill Message to Proc: " << rank <<endl;
>> master_Process->Kill_Process(rank);
>> }
>> }
>>
>>
>>
>>
>>
>> int main(int argc, char ** argv)
>> {
>> srand( (int) time(NULL));
>>
>> int rank,nproc,nwork;
>>
>> //--- Start of MPI CALL
>> MPI::Status status;
>> MPI::Init(argc,argv);
>>
>> nproc=MPI::COMM_WORLD.Get_size();
>> rank = MPI::COMM_WORLD.Get_rank();
>> if(rank==0)
>> {
>> vector<Shape> shapeset;
>>
>> shapeset.resize(10000);
>> int j=0;
>> for( vector<Shape>::iterator i=shapeset.begin(); i!=shapeset.end();
>> i++, ++j)
>> i->SetID(j);
>>
>> for( vector<Shape>::iterator i=shapeset.begin(); i!=shapeset.end();
>> i++)
>> i->MakeShape();
>> cout << "Shape Initialization Finished" << endl;
>>
>> cout << "Processor NO: " << rank << " Started" <<endl;
>>
>> Master(shapeset);
>> }
>> else
>> {
>> cout << "Processor NO: " << rank << " Started" <<endl;
>> Slave();
>> }
>> MPI::Finalize();
>>
>>
>> return 0;
>> }
>>
>>
>>
>>
>
> --
> Burlen Loring
> Kitware, Inc.
> R&D Engineer
> 28 Corporate Drive
> Clifton Park, NY 12065-8662
> Phone: 518-371-3971 x137
>
>
--
Gholamreza Sobhaninejad(Reza)
PhD candidate, University of Tokyo
Earthquake Research Institute
Tel: 090-9807-2477
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich-discuss/attachments/20080728/91028093/attachment.htm>
More information about the mpich-discuss
mailing list