Add support for Charm++'s change to use 64 bit ID for load balancing
[namd.git] / src / Compute.C
1 /**
2 ***  Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 by
3 ***  The Board of Trustees of the University of Illinois.
4 ***  All rights reserved.
5 **/
6
7 /*
8    Top of Compute hierarchy.  
9    enqueueWork() - delivers Compute object itself to queue up for doWork()
10    doWork() - called by work queue
11 */
12
13 #include "main.h"
14 #include "charm++.h"
15
16 #include "WorkDistrib.decl.h"
17 #include "WorkDistrib.h"
18
19 #include "NamdTypes.h"
20 #include "Box.h"
21 #include "OwnerBox.h"
22
23 #include "Node.h"
24 #include "Compute.h"
25 #include "Priorities.h"
26
27 #include "LdbCoordinator.h"
28
29 #define MIN_DEBUG_LEVEL 4
30 // #define DEBUGM
31 #include "Debug.h"
32
33 Compute::Compute(ComputeID c) : gbisPhase(1),basePriority(0), cid(c),
34         localWorkMsg(new (PRIORITY_SIZE) LocalWorkMsg) { 
35   gbisPhasePriority[0] = 0;
36   gbisPhasePriority[1] = 0;
37   gbisPhasePriority[2] = 0;
38   doAtomUpdate = false;
39   computeType = ComputeMap::Object()->type(c);
40   LdbIdField(ldObjHandle.id, 0) = 0;
41 }
42
43 Compute::~Compute() {
44   delete localWorkMsg;
45 }
46
47 void Compute::enqueueWork() {
48   if (!this) { DebugM(4,"This Compute is NULL!!!\n"); }
49   if ( ! noWork() ) {
50     //gbisPhase = 1; //first phase - this should already be 1
51     WorkDistrib::messageEnqueueWork(this);  // should be in ComputeMgr?
52   } else {
53     //don't enqueue work
54   }
55 }
56
57
58 //---------------------------------------------------------------------
59 // Signal from patch or proxy that data is ready.
60 // When all Patches and Proxies needed by this Compute object
61 // have checked-in, we are ready to enqueueWork()
62 //---------------------------------------------------------------------
63 void Compute::patchReady(PatchID patchID, int doneMigration, int seq) { 
64   if (doneMigration) { // If any patch has done migration - we must remap
65     doAtomUpdate = true; 
66   }
67
68   if (numPatches <= 0) {
69       DebugM(5,"Compute::patchReady("<<patchID<<")-call not valid!\n");
70   } else {
71     if (! --patchReadyCounter) {
72       patchReadyCounter = numPatches;
73       //gbisPhase = 1;
74       sequenceNumber = seq;  // breaks CUDA priority if done earlier
75       if (doAtomUpdate) {
76         atomUpdate();
77         doAtomUpdate = false;
78       }
79       enqueueWork();
80     }
81   }
82 }
83
84 void Compute::gbisP2PatchReady(PatchID pid, int seq) {
85
86   if (! --patchReadyCounter) {
87     patchReadyCounter = numPatches;
88     //gbisPhase = 2;
89     sequenceNumber = seq;
90     enqueueWork();
91   }
92 }
93
94 void Compute::gbisP3PatchReady(PatchID pid, int seq) {
95   if (! --patchReadyCounter) {
96     patchReadyCounter = numPatches;
97     //gbisPhase = 3;
98     sequenceNumber = seq;
99     enqueueWork();
100   }
101 }
102
103
104 int Compute::noWork() {
105   return 0;
106 }
107
108 void Compute::doWork() {
109     DebugM(5,"Default Compute::doWork() called.\n");
110 }
111
112 void Compute::finishPatch(int) {
113     DebugM(5,"Default Compute::finishPatch() called.\n");
114 }
115