00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <mpi.h>
00025 #include <vector>
00026 #include <map>
00027 #include <string>
00028 #include <cassert>
00029
00030 static int rk, sz;
00031
00032 static std :: map <std :: string, int> name_to_rk;
00033
00034 static std :: vector <std :: string> rk_to_name;
00035
00036 int getNodeRank () {
00037
00038 return rk;
00039 }
00040
00041 int getNumberOfNodes () {
00042
00043 return sz;
00044 }
00045
00046 int getRankFromName (const std :: string & __name) {
00047
00048 return atoi (__name.c_str ());
00049 }
00050
00051 void initNode (int * __argc, char * * * __argv) {
00052
00053 int provided;
00054 MPI_Init_thread (__argc, __argv, MPI_THREAD_FUNNELED, & provided);
00055 assert (provided == MPI_THREAD_FUNNELED);
00056
00057
00058 MPI_Comm_rank (MPI_COMM_WORLD, & rk);
00059 MPI_Comm_size (MPI_COMM_WORLD, & sz);
00060
00061 char names [sz] [MPI_MAX_PROCESSOR_NAME];
00062 int len;
00063
00064
00065 MPI_Get_processor_name (names [0], & len);
00066 MPI_Allgather (names, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, names, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, MPI_COMM_WORLD);
00067
00068 for (int i = 0; i < sz; i ++) {
00069 rk_to_name.push_back (names [i]);
00070 name_to_rk [names [i]] = i;
00071 }
00072 }
00073