00001
00002
00003
00004
00005
00006
00007
00013
00014 #include <stdio.h>
00015 #include "converse.h"
00016
00017 #define MSG_TYPE 1
00018
00019 #define FLIPBIT(node,bitnumber) (node ^ (1 << bitnumber))
00020
00021
00022 CpvDeclare(int, Cmi_mype);
00023 CpvDeclare(int, Cmi_numpes);
00024 CpvDeclare(void*, CmiLocalQueue);
00025
00026 static int Cmi_dim;
00027
00028 static int process, host, cflag, source, type;
00029 static double uclockinitvalue;
00030 extern double amicclk();
00031
00032
00033
00034
00035
00036
00037
00038 void CmiAbort(const char *message)
00039 {
00040 CmiError(message);
00041 exit(1);
00042 }
00043
00044
00045
00046 double CmiTimer()
00047 {
00048 return ( (amicclk() - uclockinitvalue) / 1000000.0 );
00049 }
00050
00051 double CmiWallTimer()
00052 {
00053 return ( (amicclk() - uclockinitvalue) / 1000000.0 );
00054 }
00055
00056 double CmiCpuTimer()
00057 {
00058 return ( (amicclk() - uclockinitvalue) / 1000000.0 );
00059 }
00060
00061 static void CmiTimerInit()
00062 {
00063 uclockinitvalue = amicclk();
00064 }
00065
00066 int CmiAsyncMsgSent(c)
00067 CmiCommHandle c ;
00068 {
00069 return 1;
00070 }
00071
00072
00073 void CmiReleaseCommHandle(c)
00074 CmiCommHandle c ;
00075 {
00076 }
00077
00078
00079
00080
00081
00082
00083 void *CmiGetNonLocal()
00084 {
00085 void *env;
00086 int msglength;
00087
00088 type = MSG_TYPE;
00089 source = -1;
00090
00091 if ( (msglength = ntest(&source, &type)) > 0)
00092 {
00093 env = (void *) CmiAlloc(msglength);
00094 if (env == 0)
00095 CmiPrintf("*** ERROR *** Memory Allocation Failed.\n");
00096 CmiSyncReceive(msglength, env);
00097 return env;
00098 }
00099 else
00100 return 0;
00101 }
00102
00103 void CmiNotifyIdle()
00104 {
00105 #if CMK_WHEN_PROCESSOR_IDLE_USLEEP
00106 tv.tv_sec=0; tv.tv_usec=5000;
00107 select(0,0,0,0,&tv);
00108 #endif
00109 }
00110
00111 CmiSyncReceive(size, buffer)
00112 int size;
00113 char *buffer;
00114 {
00115 nread(buffer, size, &source, &type, &cflag);
00116 }
00117
00118
00119
00120
00121 void CmiSyncSendFn(destPE, size, msg)
00122 int destPE;
00123 int size;
00124 char * msg;
00125 {
00126 char *temp;
00127 if (CpvAccess(Cmi_mype) == destPE)
00128 {
00129 temp = (char *)CmiAlloc(size) ;
00130 memcpy(temp, msg, size) ;
00131 CdsFifo_Enqueue(CpvAccess(CmiLocalQueue), temp);
00132 }
00133 else
00134 nwrite(msg, size, destPE, MSG_TYPE, &cflag);
00135 CQdCreate(CpvAccess(cQdState), 1);
00136 }
00137
00138
00139 CmiCommHandle CmiAsyncSendFn(destPE, size, msg)
00140 int destPE;
00141 int size;
00142 char * msg;
00143 {
00144 nwrite(msg, size, destPE, MSG_TYPE, &cflag);
00145 CQdCreate(CpvAccess(cQdState), 1);
00146 return 0 ;
00147 }
00148
00149
00150 void CmiFreeSendFn(destPE, size, msg)
00151 int destPE, size;
00152 char *msg;
00153 {
00154 if (CpvAccess(Cmi_mype) == destPE)
00155 CdsFifo_Enqueue(CpvAccess(CmiLocalQueue), msg);
00156 else
00157 {
00158 nwrite(msg, size, destPE, MSG_TYPE, &cflag);
00159 CmiFree(msg);
00160 }
00161 CQdCreate(CpvAccess(cQdState), 1);
00162 }
00163
00164
00165
00166
00167 void CmiSyncBroadcastFn(size, msg)
00168 int size;
00169 char * msg;
00170 {
00171 int i;
00172
00173 for (i=0; i<CpvAccess(Cmi_numpes); i++)
00174 if (i != CpvAccess(Cmi_mype))
00175 nwrite(msg, size, i, MSG_TYPE, &cflag);
00176 CQdCreate(CpvAccess(cQdState), CpvAccess(Cmi_numpes)-1);
00177 }
00178
00179
00180 CmiCommHandle CmiAsyncBroadcastFn(size, msg)
00181 int size;
00182 char * msg;
00183 {
00184
00185 int i;
00186
00187 for (i=0; i<CpvAccess(Cmi_numpes); i++)
00188 if (i != CpvAccess(Cmi_mype))
00189 nwrite(msg, size, i, MSG_TYPE, &cflag);
00190 CQdCreate(CpvAccess(cQdState), CpvAccess(Cmi_numpes)-1);
00191 return 0 ;
00192 }
00193
00194 void CmiFreeBroadcastFn(size, msg)
00195 int size;
00196 char *msg;
00197 {
00198 CmiSyncBroadcastFn(size,msg);
00199 CmiFree(msg);
00200 }
00201
00202 void CmiSyncBroadcastAllFn(size, msg)
00203 int size;
00204 char * msg;
00205 {
00206 int dest = 0xffff;
00207 nwrite(msg, size, dest, MSG_TYPE, &cflag);
00208 CQdCreate(CpvAccess(cQdState), CpvAccess(Cmi_numpes));
00209 }
00210
00211
00212 CmiCommHandle CmiAsyncBroadcastAllFn(size, msg)
00213 int size;
00214 char * msg;
00215 {
00216 int dest = 0xffff;
00217 nwrite(msg, size, dest, MSG_TYPE, &cflag);
00218 CQdCreate(CpvAccess(cQdState), CpvAccess(Cmi_numpes));
00219 return 0 ;
00220 }
00221
00222 void CmiFreeBroadcastAllFn(size, msg)
00223 int size;
00224 char * msg;
00225 {
00226 int dest = 0xffff;
00227 nwrite(msg, size, dest, MSG_TYPE, &cflag);
00228 CQdCreate(CpvAccess(cQdState), CpvAccess(Cmi_numpes));
00229 CmiFree(msg) ;
00230 }
00231
00232
00233
00234
00235
00236
00237
00238 void ConverseExit()
00239 {
00240 ConverseCommonExit();
00241 exit(0);
00242 }
00243
00244 void ConverseInit(argc, argv, fn, usched, initret)
00245 int argc;
00246 char *argv[];
00247 CmiStartFn fn;
00248 int usched, initret;
00249 {
00250 CpvInitialize(int, Cmi_mype);
00251 CpvInitialize(int, Cmi_numpes);
00252 CpvInitialize(void*, CmiLocalQueue);
00253 whoami(&CpvAccess(Cmi_mype), &process, &host, &Cmi_dim);
00254 CpvAccess(Cmi_numpes) = (1 << Cmi_dim) ;
00255 CpvAccess(CmiLocalQueue)= CdsFifo_Create();
00256 CmiSpanTreeInit();
00257 CmiTimerInit();
00258 CthInit(argv);
00259 ConverseCommonInit(argv);
00260 if (initret==0) {
00261 fn(argc, argv);
00262 if (usched==0) CsdScheduler(-1);
00263 ConverseExit();
00264 }
00265 }
00266