Commit b9d08707 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Use MPI_Init_thread instead of MPI_Init

This allows the user to set the required thread level. Initializing MPI
with threading support is needed when MPI functions are called from
multiple threads. All common MPI libraries seem to provide this feature.
parent 65e1cc9e
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -142,10 +142,42 @@ class MpiCommunicator
         return true;
      }

      static void Init(int& argc, char**& argv )
      static void Init( int& argc, char**& argv, int required_thread_level = MPI_THREAD_SINGLE )
      {
#ifdef HAVE_MPI
         MPI_Init( &argc, &argv );
         switch( required_thread_level ) {
            case MPI_THREAD_SINGLE:
            case MPI_THREAD_FUNNELED:
            case MPI_THREAD_SERIALIZED:
            case MPI_THREAD_MULTIPLE:
               break;
            default:
               printf("ERROR: invalid argument for the 'required' thread level support: %d\n", required_thread_level);
               MPI_Abort(MPI_COMM_WORLD, 1);
         }

         int provided;
         MPI_Init_thread( &argc, &argv, required_thread_level, &provided );
         if( provided < required_thread_level ) {
            const char* level = "";
            switch( required_thread_level ) {
               case MPI_THREAD_SINGLE:
                  level = "MPI_THREAD_SINGLE";
                  break;
               case MPI_THREAD_FUNNELED:
                  level = "MPI_THREAD_FUNNELED";
                  break;
               case MPI_THREAD_SERIALIZED:
                  level = "MPI_THREAD_SERIALIZED";
                  break;
               case MPI_THREAD_MULTIPLE:
                  level = "MPI_THREAD_MULTIPLE";
                  break;
            }
            printf("ERROR: The MPI library does not have the required level of thread support: %s\n", level);
            MPI_Abort(MPI_COMM_WORLD, 1);
         }

         selectGPU();
#endif

+8 −0
Original line number Diff line number Diff line
@@ -25,4 +25,12 @@ enum MPI_Op {
   MPI_MINLOC,
   MPI_MAXLOC,
};

// MPI_Init_thread constants
enum {
  MPI_THREAD_SINGLE,
  MPI_THREAD_FUNNELED,
  MPI_THREAD_SERIALIZED,
  MPI_THREAD_MULTIPLE
};
#endif