c++: MPI communicator as global variable

后端 未结 3 1247
鱼传尺愫
鱼传尺愫 2021-01-13 14:47

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

3条回答
  •  暖寄归人
    2021-01-13 15:18

    1. 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.

    2. 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).

    3. 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.

提交回复
热议问题