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