GPPブロードキャストフォールトトレランステスト
1960 ワード
GPPでのブロードキャストはフォールトトレランスであり,すなわち,ブロードキャストの過程において,いくつかのプロセスを強制的に殺すと,ブロードキャストは依然として影響を受けない.フォールトトレランス機能を検証するには、次のテストプログラムを作成します.
プログラムはカウンタを使用してブロードキャストのフォールトトレランス設計を検証します.すなわち、パケット損失は発生しません.
テストの結果、強制的にプロセスを殺すと、ブロードキャストが停止し、実行を続行できないことが分かった.これはGPPにおけるブロードキャストがフォールトトレランス設計においてまだバグがあることを示している.
/*
* main.cpp
*
* Created on: Apr 9, 2013
* Author: lichao
*/
#include "gpp.h"
#include <cstdlib>
class Packet : public GPP::Serializable
{
public:
Packet()
{
_buf = NULL;
_size = 0;
}
Packet(char * buf,int size)
{
_buf = (char *) malloc(size);
memcpy(_buf,buf,size);
_size = size;
}
virtual ~Packet()
{
if(!_buf)
{
free(_buf);
_buf = NULL;
}
}
void writeObject(GPP::DataStream& out)
{
out << _size;
out.writeRawData(_buf,_size);
}
void readObject(GPP::DataStream& in)
{
in >> _size;
_buf = (char *)malloc(_size);
in.readRawData(_buf,_size);
}
private:
char * _buf;
int _size;
};
class Handler : public GPP::BcastHandler<Packet>
{
public:
Handler(){}
virtual ~Handler()
{
}
void handle(GPP::SharedPtr<Packet>& obj)
{
counter++;
GPP::Log::Info("Received data for %5d.",counter);
fflush(stdout);
}
static int getCounter()
{
return counter;
}
private:
static int counter;
};
int Handler::counter = 0;
int main(int argc,char *argv[])
{
GPP::Init();
GPP::Comm::RegisterHandler(99,new Handler());
int size;
char * buf;
int rank = GPP::Comm::GetRank();
if(rank == 0)
{
size = 1 << 25;
buf = (char *)malloc(size);
Packet * p = new Packet(buf,size);
int loops = 100;
while(loops--)
{
int rc = GPP::Comm::Bcast(p,99);
if(rc < 0)
{
GPP::Log::Error(GPP::StrErr(rc));
fflush(stdout);
}
}
delete p;
}
GPP::MPI_Barrier(100);
GPP::Log::Trace("Counter is %5d
",Handler::getCounter());
GPP::Finalize();
return 0;
}
プログラムはカウンタを使用してブロードキャストのフォールトトレランス設計を検証します.すなわち、パケット損失は発生しません.
テストの結果、強制的にプロセスを殺すと、ブロードキャストが停止し、実行を続行できないことが分かった.これはGPPにおけるブロードキャストがフォールトトレランス設計においてまだバグがあることを示している.