00001 #include "ckfutures.h"
00002
00003 #ifndef _IGET_FLOWCONTROL_H
00004 #define _IGET_FLOWCONTROL_H
00005
00006 #define IGET_FLOWCONTROL 0
00007 #define IGET_TOKENNUM 16
00008 #define IGET_MINTOKENNUM 1
00009
00010 #define CKFUTURE_IGET 1
00011 #define DAGGER_IGET 0
00012 #if CKFUTURE_IGET
00013 typedef CkFutureID CkIGetID;
00014 #define CkIGet CkCreateAttachedFutureSend
00015 #define CkIGetWait CkWaitReleaseFuture
00016 #elif DAGGER_IGET
00017
00018 #endif
00019
00020 #ifndef IGET_FLOWCONTROL
00021 #define IGET_FLOWCONTROL 0
00022 #endif
00023
00024 #if IGET_FLOWCONTROL
00025 #ifndef IGET_TOKENNUM
00026 #define IGET_TOKENNUM 6
00027 #endif
00028 #endif
00029
00030 extern "C" void TokenUpdatePeriodic();
00031 extern "C" int getRSS();
00032
00033 #if IGET_FLOWCONTROL==0
00034
00035 class IGetControlClass {
00036 public:
00037 int iget_request(CkIGetID fut, void *msg, int ep, CkArrayID, CkArrayIndex, void(*fptr)(CkArrayID,CkArrayIndex,void*,int,int))
00038 {return 1;}
00039 void iget_free(CthThread tid, int size) {}
00040 void iget_resend(CkIGetID) {}
00041 void iget_updateTokenNum() {}
00042 };
00043 #elif CKFUTURE_IGET
00044
00045
00046
00047
00048 #define MAXQUEUELENGTH 1024
00049
00050 template <class KEY, class OBJ>
00051 class HashQueueT {
00052 CkQ<OBJ> *TheHashQueue;
00053 CkQ<int> *TheHashTable;
00054 public:
00055 HashQueueT()
00056 {
00057 TheHashQueue = new CkQ<OBJ>();
00058 TheHashTable = new CkQ<int>(MAXQUEUELENGTH);
00059
00060
00061 for(int i=0;i<MAXQUEUELENGTH;i++)
00062 TheHashTable->insert(i,-1);
00063 }
00064 ~HashQueueT() {}
00065 OBJ deq()
00066 {
00067 if(TheHashTable->length()<=0) return NULL;
00068 OBJ e=TheHashQueue->deq();
00069
00070 return e;
00071 }
00072 void key_enq(OBJ entry, KEY key)
00073 {
00074 TheHashQueue->enq(entry);
00075
00076 }
00077 OBJ key_deq(KEY key)
00078 {
00079
00080
00081
00082 int i;
00083 for(i=0;i<TheHashQueue->length();i++)
00084 {
00085 if((*TheHashQueue)[i]->futNum==key)
00086 break;
00087 }
00088 if(i>=TheHashQueue->length()) return NULL;
00089 return TheHashQueue->remove(i);
00090 }
00091 void key_promote(KEY key)
00092 {
00093 OBJ entry=key_deq(key);
00094 TheHashQueue->insert(0,entry);
00095 }
00096 bool key_find(KEY key)
00097 {
00098
00099
00100
00101
00102 int i;
00103 for(i=0;i<TheHashQueue->length();i++)
00104 {
00105 if((*TheHashQueue)[i]->futNum==key)
00106 break;
00107 }
00108 if(i>=TheHashQueue->length()) return false;
00109 else return true;
00110
00111 }
00112 private:
00113 void updatetable(CkQ<int> *table, KEY key, int pos)
00114 {
00115 table->insert(key, pos);
00116 }
00117 int getpostable(CkQ<int> *table, KEY key)
00118 {
00119 return (*table)[(int)key];
00120 }
00121 };
00122
00123 typedef struct iget_token_struct {
00124 CkIGetID futNum;
00125 int status;
00126 void *m;
00127 int ep;
00128
00129
00130 CkArrayID aid;
00131 CkArrayIndex idx;
00132 void(*fptr)(CkArrayID,CkArrayIndex,void*,int,int);
00133 } *iget_tokenqueue_entry;
00134
00135 typedef HashQueueT<CkIGetID, iget_tokenqueue_entry> HashTokenQueue;
00136
00137 class IGetControlClass {
00138 public:
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 int iget_request(CkIGetID fut, void *msg, int ep, CkArrayID id,
00155 CkArrayIndex idx, void(*fptr)(CkArrayID,CkArrayIndex,void*,int,int),
00156 int);
00157
00158 void iget_free(int size);
00159
00160 void iget_updateTokenNum();
00161
00162
00163
00164
00165 void iget_resend(CkIGetID fut);
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 int CTH_FCFS_request(CthThread tid, int size){ return 0;}
00179 void CTH_FCFS_free(){ }
00180
00181
00182
00183
00184
00185 int PAIR_FCFS_request() {return 0;}
00186 void PAIR_FCFS_free() {}
00187
00188
00189
00190
00191 int DROP_FCFS_request() {return 0;}
00192
00193 IGetControlClass() {iget_token = IGET_TOKENNUM;iget_token_history =
00194 IGET_TOKENNUM;lastupdatetime = 0;iget_outstanding=0;IGET_UNITMESSAGE=1024;}
00195 private:
00196 HashTokenQueue queue;
00197 int iget_token;
00198 int iget_outstanding;
00199 int iget_token_history;
00200 double lastupdatetime;
00201 int IGET_UNITMESSAGE;
00202
00203
00204
00205
00206
00207
00208
00209
00210 inline void iget_tokenqueue_enqueue(CkIGetID gid,void* m,int ep, CkArrayID aid, CkArrayIndex
00211 idx, void(*fptr)(CkArrayID,CkArrayIndex,void*,int,int))
00212 {
00213 iget_tokenqueue_entry e=new iget_token_struct();
00214 e->futNum=gid; e->m=m; e->ep=ep; e->aid=aid; e->idx=idx; e->fptr=fptr; e->status=0;
00215 queue.key_enq(e,gid);
00216 }
00217
00218 inline iget_tokenqueue_entry iget_tokenqueue_dequeue() {
00219 return queue.deq();
00220 }
00221
00222 inline iget_tokenqueue_entry iget_tokenqueue_remove(CkIGetID gid)
00223 {
00224 return queue.key_deq(gid);
00225 }
00226 inline bool iget_tokenqueue_find(CkIGetID gid)
00227 {
00228 return queue.key_find(gid);
00229 }
00230 inline void iget_tokenqueue_promote(CkIGetID gid)
00231 {
00232 queue.key_promote(gid);
00233 }
00234 };
00235
00236 #endif
00237
00238 extern IGetControlClass TheIGetControlClass;
00239
00240 #endif