786743f932c57796a511ad5b99b7d000b885aa97
[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 #define MIN_DEBUG_LEVEL 4
28 // #define DEBUGM
29 #include "Debug.h"
30
31 Compute::Compute(ComputeID c) : gbisPhase(1),basePriority(0), cid(c),
32         localWorkMsg(new (PRIORITY_SIZE) LocalWorkMsg) { 
33   gbisPhasePriority[0] = 0;
34   gbisPhasePriority[1] = 0;
35   gbisPhasePriority[2] = 0;
36   doAtomUpdate = false;
37   computeType = ComputeMap::Object()->type(c);
38   ldObjHandle.id.id[0] = -1;
39 }
40
41 Compute::~Compute() {
42   delete localWorkMsg;
43 }
44
45 void Compute::enqueueWork() {
46   if (!this) { DebugM(4,"This Compute is NULL!!!\n"); }
47   if ( ! noWork() ) {
48     //gbisPhase = 1; //first phase - this should already be 1
49     WorkDistrib::messageEnqueueWork(this);  // should be in ComputeMgr?
50   } else {
51     //don't enqueue work
52   }
53 }
54
55
56 //---------------------------------------------------------------------
57 // Signal from patch or proxy that data is ready.
58 // When all Patches and Proxies needed by this Compute object
59 // have checked-in, we are ready to enqueueWork()
60 //---------------------------------------------------------------------
61 void Compute::patchReady(PatchID patchID, int doneMigration, int seq) { 
62   if (doneMigration) { // If any patch has done migration - we must remap
63     doAtomUpdate = true; 
64   }
65
66   if (numPatches <= 0) {
67       DebugM(5,"Compute::patchReady("<<patchID<<")-call not valid!\n");
68   } else {
69     if (! --patchReadyCounter) {
70       patchReadyCounter = numPatches;
71       //gbisPhase = 1;
72       sequenceNumber = seq;  // breaks CUDA priority if done earlier
73       if (doAtomUpdate) {
74         atomUpdate();
75         doAtomUpdate = false;
76       }
77       enqueueWork();
78     }
79   }
80 }
81
82 void Compute::gbisP2PatchReady(PatchID pid, int seq) {
83
84   if (! --patchReadyCounter) {
85     patchReadyCounter = numPatches;
86     //gbisPhase = 2;
87     sequenceNumber = seq;
88     enqueueWork();
89   }
90 }
91
92 void Compute::gbisP3PatchReady(PatchID pid, int seq) {
93   if (! --patchReadyCounter) {
94     patchReadyCounter = numPatches;
95     //gbisPhase = 3;
96     sequenceNumber = seq;
97     enqueueWork();
98   }
99 }
100
101
102 int Compute::noWork() {
103   return 0;
104 }
105
106 void Compute::doWork() {
107     DebugM(5,"Default Compute::doWork() called.\n");
108 }
109
110 void Compute::finishPatch(int) {
111     DebugM(5,"Default Compute::finishPatch() called.\n");
112 }
113