00001
00005 #ifndef _ENVELOPE_PATH_H
00006 #define _ENVELOPE_PATH_H
00007
00008 #include "pup.h"
00009 #include "charm.h"
00010
00011
00012
00013 #if USE_CRITICAL_PATH_HEADER_ARRAY
00014
00015
00016
00017
00018
00019
00020
00021 extern envelope * currentlyExecutingMsg;
00022 extern bool thisMethodSentAMessage;
00023 extern double timeEntryMethodStarted;
00024
00025
00026
00027
00028
00029 extern void resetPECriticalPath();
00030 extern void printPECriticalPath();
00031 extern void registerTerminalEntryMethod();
00032
00033
00034
00035
00036 extern void resetCricitalPathDetection();
00037
00038
00039 extern void resetThisEntryPath();
00040
00041
00042
00043 #endif
00044
00045
00047 #define numEpIdxs 150
00048 #define numArrayIds 20
00049
00056 class PathHistory {
00057 private:
00058 int epIdxCount[numEpIdxs];
00059 int arrayIdxCount[numArrayIds];
00060 double totalTime;
00061
00062 public:
00063
00064 const int* getEpIdxCount(){
00065 return epIdxCount;
00066 }
00067
00068 const int* getArrayIdxCount(){
00069 return arrayIdxCount;
00070 }
00071
00072 int getEpIdxCount(int i) const {
00073 return epIdxCount[i];
00074 }
00075
00076 int getArrayIdxCount(int i) const {
00077 return arrayIdxCount[i];
00078 }
00079
00080
00081 double getTotalTime() const{
00082 return totalTime;
00083 }
00084
00085
00086 PathHistory(){
00087 reset();
00088 }
00089
00090 void pup(PUP::er &p) {
00091 for(int i=0;i<numEpIdxs;i++)
00092 p|epIdxCount[i];
00093 for(int i=0;i<numArrayIds;i++)
00094 p|arrayIdxCount[i];
00095 p | totalTime;
00096 }
00097
00098 double getTime(){
00099 return totalTime;
00100 }
00101
00102 void reset(){
00103
00104
00105 totalTime = 0.0;
00106
00107 for(int i=0;i<numEpIdxs;i++){
00108 epIdxCount[i] = 0;
00109 }
00110 for(int i=0;i<numArrayIds;i++){
00111 arrayIdxCount[i]=0;
00112 }
00113 }
00114
00115 int updateMax(const PathHistory & other){
00116 if(other.totalTime > totalTime){
00117
00118
00119
00120 totalTime = other.totalTime;
00121 for(int i=0;i<numEpIdxs;i++){
00122 epIdxCount[i] = other.epIdxCount[i];
00123 }
00124 for(int i=0;i<numArrayIds;i++){
00125 arrayIdxCount[i]=other.arrayIdxCount[i];
00126 }
00127 return 1;
00128 }
00129 return 0;
00130 }
00131
00132
00133 void print() const {
00134 CkPrintf("Critical Path Time=%lf : ", (double)totalTime);
00135 for(int i=0;i<numEpIdxs;i++){
00136 if(epIdxCount[i]>0){
00137 CkPrintf("EP %d count=%d : ", i, (int)epIdxCount[i]);
00138 }
00139 }
00140 for(int i=0;i<numArrayIds;i++){
00141 if(arrayIdxCount[i]>0){
00142 CkPrintf("Array %d count=%d : ", i, (int)arrayIdxCount[i]);
00143 }
00144 }
00145 CkPrintf("\n");
00146 }
00147
00149 void printHTMLToString(char* buf) const {
00150 buf[0] = '\0';
00151
00152 sprintf(buf+strlen(buf), "Path Time=%lf<br>", (double)totalTime);
00153 for(int i=0;i<numEpIdxs;i++){
00154 if(epIdxCount[i]>0){
00155 sprintf(buf+strlen(buf),"EP %d count=%d<br>", i, (int)epIdxCount[i]);
00156 }
00157 }
00158 for(int i=0;i<numArrayIds;i++){
00159 if(arrayIdxCount[i]>0){
00160 sprintf(buf+strlen(buf), "Array %d count=%d<br>", i, (int)arrayIdxCount[i]);
00161 }
00162 }
00163 }
00164
00165 void incrementTotalTime(double time){
00166 totalTime += time;
00167 }
00168
00169
00170 #if USE_CRITICAL_PATH_HEADER_ARRAY
00171 void createPath(PathHistory *parentPath){
00172
00173 thisMethodSentAMessage = true;
00174 double timeNow = CmiWallTimer();
00175
00176 if(parentPath != NULL){
00177
00178 totalTime = parentPath->totalTime + (timeNow-timeEntryMethodStarted);
00179
00180 for(int i=0;i<numEpIdxs;i++){
00181 epIdxCount[i] = parentPath->epIdxCount[i];
00182 }
00183 for(int i=0;i<numArrayIds;i++){
00184 arrayIdxCount[i] = parentPath->arrayIdxCount[i];
00185 }
00186
00187 }
00188 else {
00189 totalTime = 0.0;
00190
00191 for(int i=0;i<numEpIdxs;i++){
00192 epIdxCount[i] = 0;
00193 }
00194 for(int i=0;i<numArrayIds;i++){
00195 arrayIdxCount[i]=0;
00196 }
00197 }
00198
00199 }
00200 #endif
00201
00202 void incrementEpIdxCount(int ep){
00203 epIdxCount[ep]++;
00204 }
00205
00206 void incrementArrayIdxCount(int arr){
00207 arrayIdxCount[arr]++;
00208 }
00209
00210 };
00211
00212
00213 #endif