17 #define MIN_DEBUG_LEVEL 4 42 delete [] computePtrs;
48 int computeCount = nComputes;
49 for (
int i=0; i<nComputes; i++) {
52 if (! (computePtrs[i]->cid == i)) {
53 DebugM(4,
"ComputeID("<<computePtrs[i]->cid<<
") != ComputeID(" 58 DebugM(4,
"Compute Count = " << computeCount <<
"\n");
63 DebugM(4,
"Packing ComputeMap\n");
65 msg->
put(nComputes,computeData.begin());
70 DebugM(4,
"Unpacking ComputeMap\n");
73 if ( old && old != nComputes ) {
74 NAMD_bug(
"number of computes in new ComputeMap has changed!\n");
76 computeData.resize(nComputes);
77 msg->
get(nComputes,computeData.begin());
81 if ( ! computePtrs ) {
82 computePtrs =
new Compute*[nComputes];
83 memset(computePtrs, 0, nComputes*
sizeof(
Compute*));
88 if ( ! computePtrs )
NAMD_bug(
"ComputeMap::extendPtrs() 1");
90 nComputes = computeData.size();
91 if ( nComputes > oldN ) {
92 Compute **oldPtrs = computePtrs;
93 computePtrs =
new Compute*[nComputes];
94 memcpy(computePtrs, oldPtrs, oldN*
sizeof(
Compute*));
95 memset(computePtrs+oldN, 0, (nComputes-oldN)*
sizeof(
Compute*));
103 return computeData[cid].numPids;
109 return computeData[cid].pids[i].pid;
114 return computeData[cid].pids[i].trans;
121 return computeData[cid].type;
129 return computeData[cid].partition;
136 return computeData[cid].numPartitions;
144 computeData.resize(500);
145 computeData.resize(0);
156 NAMD_bug(
"ComputeMap::storeCompute called with maxPids > numPidsAllocated");
163 computeData.resize(nComputes);
165 computeData[cid].node=inode;
167 computeData[cid].type =
type;
171 computeData[cid].numPids = 0;
173 #if defined(NAMD_MIC) 176 computeData[cid].directToDevice = 0;
185 const int cid = computeData.size();
186 computeData.resize(cid+1);
188 computeData[cid] = computeData[src];
190 computeData[cid].node = -1;
198 computeData[cid].pids[computeData[cid].numPids].pid=
pid;
199 computeData[cid].pids[computeData[cid].numPids].trans=
trans;
200 computeData[cid].numPids++;
206 DebugM(2,
"---------------------------------------");
207 DebugM(2,
"---------------------------------------\n");
209 DebugM(2,
"nComputes = " << nComputes <<
'\n');
210 DebugM(2,
"nAllocated = " << nComputes <<
'\n');
211 for(
int i=0; i < nComputes; i++)
213 DebugM(2,
"Compute " << i <<
'\n');
214 DebugM(2,
" node = " << computeData[i].
node <<
'\n');
216 for(
int j=0; j < computeData[i].numPids; j++)
222 DebugM(2,
"\n---------------------------------------");
223 DebugM(2,
"---------------------------------------\n");
227 #ifdef MEM_OPT_VERSION 228 const char *fname =
"computeMap.opt";
230 const char *fname =
"computeMap.orig";
233 FILE *ofp = fopen(fname,
"w");
234 fprintf(ofp,
"---------------------------------------");
235 fprintf(ofp,
"---------------------------------------\n");
237 fprintf(ofp,
"nComputes = %d\n", nComputes);
238 fprintf(ofp,
"nAllocated = %d\n", nComputes);
239 for(
int i=0; i < nComputes; i++)
241 fprintf(ofp,
"Compute %d\n", i);
242 fprintf(ofp,
" node = %d\n",computeData[i].
node);
243 fprintf(ofp,
" numPids = %d\n",computeData[i].
numPids);
244 fprintf(ofp,
" type = %d\n",computeData[i].
type);
245 for(
int j=0; j < computeData[i].numPids; j++)
247 fprintf(ofp,
"%d ",computeData[i].pids[j].
pid);
251 fprintf(ofp,
"\n---------------------------------------");
252 fprintf(ofp,
"---------------------------------------\n");
262 static int count = 0;
264 sprintf(f,
"%s.%d", fname, count++);
265 FILE *fp = fopen(f,
"w");
266 CmiAssert(fp != NULL);
267 fprintf(fp,
"%d\n", nComputes);
268 for(
int i=0; i < nComputes; i++)
270 fprintf(fp,
"%d\n", computeData[i].
node);
273 CkPrintf(
"ComputeMap has been stored in %s.\n", f);
278 FILE *fp = fopen(fname,
"r");
279 CmiAssert(fp != NULL);
281 fscanf(fp,
"%d\n", &n);
282 CmiAssert(n == nComputes);
283 for(
int i=0; i < nComputes; i++)
285 fscanf(fp,
"%d\n", &computeData[i].
node);
291 #if defined(NAMD_MIC) 293 void ComputeMap::setDirectToDevice(
const ComputeID cid,
const int d) {
294 if (cid < 0 || cid >= nComputes) {
295 NAMD_bug(
"ComputeMap::setDirectToDevice() called with an invalid cid value");
297 computeData[cid].directToDevice = ((d == 0) ? (0) : (1));
300 int ComputeMap::directToDevice(
const ComputeID cid)
const {
301 if (cid < 0 || cid >= nComputes) {
302 NAMD_bug(
"ComputeMap::directToDevice() called with an invalid cid value");
304 return computeData[cid].directToDevice;
307 #endif // defined(NAMD_MIC)
void saveComputeMap(const char *fname)
static void partition(int *order, const FullAtom *atoms, int begin, int end)
void loadComputeMap(const char *fname)
MIStream * get(char &data)
ComputeID storeCompute(int node, int maxPids, ComputeType type, int partition=-1, int numPartitions=0)
void printComputeMap(void)
void NAMD_bug(const char *err_msg)
ComputeType type(ComputeID cid)
int numPartitions(ComputeID cid)
int partition(ComputeID cid)
static ComputeMap * Instance()
void newPid(ComputeID cid, int pid, int trans=13)
ComputeID cloneCompute(ComputeID src, int partition)
int numPids(ComputeID cid)
MOStream * put(char data)
int pid(ComputeID cid, int i)
int trans(ComputeID cid, int i)
void unpack(MIStream *msg)