Revert "a function to return Cray XE torus dimension"
[charm.git] / src / util / CrayNid.c
1 /** \file CrayNid.c
2  *  Author: Abhinav S Bhatele
3  *  Date created: October 10th, 2007  
4  *  
5  *  This file is needed because including the cnos_mpi_os.h in a C++ leads 
6  *  to a compiler error. Hence we have defined a wrapper function here which
7  *  can be called from C++ files
8  */
9
10 #include <stdlib.h>
11 #include "converse.h"
12
13 #if CMK_CRAYXT || CMK_CRAYXE
14
15 #if XT3_TOPOLOGY
16 #include <catamount/cnos_mpi_os.h>
17 #define MAXNID 2784
18 #define TDIM 2
19
20 #else   /* if it is a XT4/5 */
21 #include <pmi.h>
22 #endif
23
24 /** \function getXTNodeID
25  *  returns nodeID corresponding to the MPI rank (possibly obtained
26  *  from CmiMyNode()/CmiNodeOf(pe)) passed to it
27  */
28 int getXTNodeID(int mpirank, int nummpiranks) {
29   int nid = -1;
30
31 #if XT3_TOPOLOGY
32   cnos_nidpid_map_t *nidpid; 
33   int ierr;
34   
35   nidpid = (cnos_nidpid_map_t *)malloc(sizeof(cnos_nidpid_map_t) * nummpiranks);
36
37   ierr = cnos_get_nidpid_map(&nidpid);
38   nid = nidpid[mpirank].nid;
39   /* free(nidpid); */
40
41 #elif CMK_HAS_PMI_GET_NID       /* if it is a XT4/5 */
42   PMI_Get_nid(mpirank, &nid);
43 #else
44 #error "Cannot get network topology information on a Cray build. Swap current module xt-mpt with xt-mpt/5.0.0 or higher and xt-asyncpe with xt-asyncpe/4.0 or higher and then rebuild"
45 #endif
46
47   return nid;
48 }
49
50 #endif /* CMK_CRAYXT */
51
52 #if XT3_TOPOLOGY || XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
53
54 #if !CMK_HAS_RCALIB
55 #error "The Cray rca library is not available. Try 'module load rca' and rebuild"
56 #endif
57
58 #include <rca_lib.h>
59
60   #if XT4_TOPOLOGY
61   #define MAXNID 14000
62   #define TDIM 4
63
64   #elif XT5_TOPOLOGY
65   #define MAXNID 22020
66   #define TDIM 12
67
68   #elif XE6_TOPOLOGY
69     /* hopper */
70   #define MAXNID 6384
71   #define TDIM 24
72   #endif
73
74 int *pid2nid;                   /* rank to node ID */
75 int nid2pid[MAXNID][TDIM];      /* node ID to rank */
76
77 /** \function getMeshCoord
78  *  wrapper function for rca_get_meshcoord
79  */
80 int getMeshCoord(int nid, int *x, int *y, int *z) {
81   rca_mesh_coord_t xyz;
82   rca_get_meshcoord(nid, &xyz);
83   *x = xyz.mesh_x;
84   *y = xyz.mesh_y;
85   *z = xyz.mesh_z;
86 }
87
88 /** \function pidtonid
89  *  finds nids for pids 1 to CmiNumPes and stores them in an array
90  *  correspondingly also creates an array for nids to pids
91  */
92 void pidtonid(int numpes) {
93 #if XT3_TOPOLOGY
94   cnos_nidpid_map_t *nidpid; 
95   int ierr, i, j, nid;
96   
97   nidpid = (cnos_nidpid_map_t *)malloc(sizeof(cnos_nidpid_map_t) * numpes);
98   pid2nid = (int *)malloc(sizeof(int) * numpes);
99
100   for(i=0; i<MAXNID; i++) {
101     nid2pid[i][0] = -1;
102     nid2pid[i][1] = -1;
103   }
104       
105   ierr = cnos_get_nidpid_map(&nidpid);
106   for(i=0; i<numpes; i++) {
107     nid = nidpid[i].nid;
108     pid2nid[i] = nid;
109     
110     /* if the first position on the node is not filled */
111     /* put it there (0) else at (1) */
112     if (nid2pid[nid][0] == -1)
113       nid2pid[nid][0] = i;
114     else
115       nid2pid[nid][1] = i;
116   }
117   /* free(nidpid); */
118
119   /* CORRECTION FOR MPICH_RANK_REORDER_METHOD */
120
121   int k = -1;
122   for(i=0; i<MAXNID; i++) {
123     if(nid2pid[i][0] != -1) {
124       nid2pid[i][0] = k++;
125       pid2nid[k] = i;
126       nid2pid[i][1] = k++;
127       pid2nid[k] = i;
128     }
129   }
130   
131 #elif XT4_TOPOLOGY || XT5_TOPOLOGY || XE6_TOPOLOGY
132   int i, l, nid;
133   pid2nid = (int *)malloc(sizeof(int) * numpes);
134
135   for(i=0; i<MAXNID; i++)
136     for(l=0; l<TDIM; l++)
137       nid2pid[i][l] = -1;
138
139   for (i=0; i<numpes; i++) {
140     PMI_Get_nid(i, &nid);
141     pid2nid[i] = nid;
142
143     l = 0;
144     while(nid2pid[nid][l] != -1)
145       l++;
146     nid2pid[nid][l] = i;
147   }
148 #endif
149 }
150
151 #endif /* XT3_TOPOLOGY || XT4_TOPOLOGY || XT5_TOPOLOGY */