I need the MPI world communicator to be accessible in functions/class member functions. But by design/convention, MPI environments and communicators are always defined and
For boost mpi, the default constructed (i.e., empty initializer) communicator corresponds to MPI_COMM_WORLD
, so you could simply define another
mpi::communicator world;
inside your function use it as if it is the one you defined outside.
MPI_INIT
is called when constructing mpi::environment
. So as long as this is placed in the beginning of the of your main program, you are free to define a global mpi::communicator
somewhere else. It is not necessary to use a pointer. (Actually you can even place MPI_INIT
somewhere else as well, see below).
For bare-bones MPI, I have tested that calling MPI_INIT
elsewhere besides the main is also allowed. For example, you can define the following wrapper for a global worker in a header file,
class MpiWorker_t
{
public:
int NumberOfWorkers, WorkerId, NameLen;
char HostName[MPI_MAX_PROCESSOR_NAME];
MpiWorker_t()
{
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD,&NumberOfWorkers);
MPI_Comm_rank(MPI_COMM_WORLD,&WorkerId);
MPI_Get_processor_name(HostName, &NameLen);
}
~MpiWorker_t()
{
MPI_Finalize();
}
}
extern MpiWorker_t GlobalWorker;
and in the source file, define a global instance at any place outside main()
:
MpiWorker_t GlobalWorker;
The construction and destruction of the global variable should be able to take care of MPI
initialization and finalization, before and after any MPI
function call.