Import Geant4 10.4.0 source tree
This commit is contained in:
@@ -4,17 +4,12 @@
|
||||
#ifndef tools_mpi_wrmpi
|
||||
#define tools_mpi_wrmpi
|
||||
|
||||
#ifdef TOOLS_USE_NATIVE_MPI
|
||||
#include <mpi.h>
|
||||
#else
|
||||
#include "dummy_mpi.h"
|
||||
#endif
|
||||
#include "wait_buffer"
|
||||
|
||||
#include <tools/impi>
|
||||
#include <tools/vdata>
|
||||
#include <tools/realloc>
|
||||
#include <tools/mnmx>
|
||||
#include <ostream>
|
||||
|
||||
#ifdef TOOLS_MEM
|
||||
#include <tools/mem>
|
||||
@@ -53,6 +48,36 @@ protected:
|
||||
return s_v;
|
||||
}
|
||||
public: //inlib::mpi::impi
|
||||
virtual bool pack(char a_val) {
|
||||
tools::uint32 sz = tools::uint32(sizeof(char));
|
||||
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
|
||||
if(::MPI_Pack(&a_val,1,MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Pack(char) failed." << std::endl;
|
||||
return false;
|
||||
}
|
||||
m_pos += sz;
|
||||
return true;
|
||||
}
|
||||
virtual bool pack(short a_val) {
|
||||
tools::uint32 sz = tools::uint32(sizeof(short));
|
||||
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
|
||||
if(::MPI_Pack(&a_val,1,MPI_SHORT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Pack(short) failed." << std::endl;
|
||||
return false;
|
||||
}
|
||||
m_pos += sz;
|
||||
return true;
|
||||
}
|
||||
virtual bool pack(int a_val) {
|
||||
tools::uint32 sz = tools::uint32(sizeof(int));
|
||||
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
|
||||
if(::MPI_Pack(&a_val,1,MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Pack(int) failed." << std::endl;
|
||||
return false;
|
||||
}
|
||||
m_pos += sz;
|
||||
return true;
|
||||
}
|
||||
virtual bool pack(unsigned int a_val) {
|
||||
tools::uint32 sz = tools::uint32(sizeof(unsigned int));
|
||||
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
|
||||
@@ -83,6 +108,16 @@ public: //inlib::mpi::impi
|
||||
m_pos += sz;
|
||||
return true;
|
||||
}
|
||||
virtual bool pack(float a_val) {
|
||||
tools::uint32 sz = tools::uint32(sizeof(float));
|
||||
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
|
||||
if(::MPI_Pack(&a_val,1,MPI_FLOAT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Pack(float) failed." << std::endl;
|
||||
return false;
|
||||
}
|
||||
m_pos += sz;
|
||||
return true;
|
||||
}
|
||||
virtual bool pack(double a_val) {
|
||||
tools::uint32 sz = tools::uint32(sizeof(double));
|
||||
if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
|
||||
@@ -197,6 +232,30 @@ public: //inlib::mpi::impi
|
||||
return true;
|
||||
}
|
||||
public: //inlib::mpi::impi
|
||||
virtual bool unpack(char& a_val) {
|
||||
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_CHAR,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Unpack(char) failed." << std::endl;
|
||||
a_val = 0;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
virtual bool unpack(short& a_val) {
|
||||
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_SHORT,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Unpack(short) failed." << std::endl;
|
||||
a_val = 0;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
virtual bool unpack(int& a_val) {
|
||||
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_INT,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Unpack(int) failed." << std::endl;
|
||||
a_val = 0;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
virtual bool unpack(unsigned int& a_val) {
|
||||
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_UNSIGNED,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Unpack(unsigned int) failed." << std::endl;
|
||||
@@ -221,6 +280,14 @@ public: //inlib::mpi::impi
|
||||
}
|
||||
return true;
|
||||
}
|
||||
virtual bool unpack(float& a_val) {
|
||||
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_FLOAT,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Unpack(float) failed." << std::endl;
|
||||
a_val = 0;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
virtual bool unpack(double& a_val) {
|
||||
if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_DOUBLE,m_comm)!=MPI_SUCCESS) {
|
||||
m_out << "tools::mpi::wrmpi : MPI_Unpack(double) failed." << std::endl;
|
||||
@@ -330,6 +397,28 @@ public: //inlib::mpi::impi
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool wait_buffer(int a_rank,int a_src,int a_tag,int& a_probe_src,bool a_verbose = false) {
|
||||
int buffer_size = 0;
|
||||
char* _buffer = 0;
|
||||
if (!mpi::wait_buffer(m_out,a_rank,a_src,a_tag,m_comm,buffer_size,_buffer,a_probe_src,a_verbose)) {
|
||||
m_out << "tools::mpi::wrmpi::wait_buffer : failed for rank " << a_rank << " and source " << a_src <<"." << std::endl;
|
||||
return false;
|
||||
}
|
||||
// we take ownership of buffer :
|
||||
delete [] m_buffer;
|
||||
m_size = buffer_size;
|
||||
m_buffer = _buffer;
|
||||
m_max = m_buffer+m_size;
|
||||
m_pos = m_buffer;
|
||||
m_ipos = 0; //IMPORTANT
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool wait_buffer(int a_rank,int a_tag,int& a_probe_src,bool a_verbose = false) {
|
||||
return wait_buffer(a_rank,MPI_ANY_SOURCE,a_tag,a_probe_src,a_verbose);
|
||||
}
|
||||
|
||||
public:
|
||||
wrmpi(std::ostream& a_out,const MPI_Comm& a_comm,tools::uint32 a_size = 128) // we expect a_size!=0
|
||||
:m_out(a_out)
|
||||
|
||||
Reference in New Issue
Block a user