arch/ncube2/machine.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * $Source: /cvsroot/charm/src/arch/ncube2/machine.c,v $
00003  * $Author: gioachin $
00004  * $Date: 2004-10-06 01:28:55 $
00005  * $Revision: 2.28 $
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  * Abort function:
00035  *
00036  ************************************************************************/
00037 
00038 void CmiAbort(const char *message)
00039 {
00040   CmiError(message);
00041   exit(1);
00042 }
00043 
00044 /**************************  TIMER FUNCTIONS **************************/
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 /********************* MESSAGE RECEIVE FUNCTIONS ******************/
00082 
00083 void *CmiGetNonLocal()
00084 {
00085         void *env;
00086         int  msglength;
00087 
00088         type = MSG_TYPE;
00089         source = -1;  /* dont care */
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 /********************* MESSAGE SEND FUNCTIONS ******************/
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)   /* same as sync send for ncube */
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 /*********************** BROADCAST FUNCTIONS **********************/
00165 
00166 
00167 void CmiSyncBroadcastFn(size, msg)      /* ALL_EXCEPT_ME  */
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)    /* ALL_EXCEPT_ME  */
00181 int size;
00182 char * msg;
00183 {
00184 /* Same as sync broadcast for now */
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 /************************** SETUP ***********************************/
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 

Generated on Sun Jun 29 13:29:05 2008 for Charm++ by  doxygen 1.5.1