Fixed Ctv bug on shared memory machines.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Fri, 16 Jan 1998 18:03:00 +0000 (18:03 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Fri, 16 Jan 1998 18:03:00 +0000 (18:03 +0000)
Made latencyBWtest conformant with Converse.
Added high resolution timers to Origin2000.
Removed starvation from Origin Pthreads version.

src/arch/origin-pthreads/conv-mach.csh
src/arch/origin-pthreads/conv-mach.h
src/arch/origin-pthreads/machine.c
src/arch/origin2000/conv-mach.h
src/arch/origin2000/machine.c
src/conv-core/convcore.c
src/conv-core/converse.h

index f2f9b6d330e83e685167e309ff2b72e53ceb4e6a..40e5a33e0f4cf74e238e9c4c13e15c026b1c51af 100755 (executable)
 ############################################################################
 
 set CMK_CPP_CHARM='/usr/lib/cpp '
-set CMK_CPP_C='cc -E -64 '
+set CMK_CPP_C='cc -E -64 -D_SGI_MP_SOURCE '
 set CMK_LDRO='ld -r -o'
 set CMK_LDRO_WORKS=0
-set CMK_CC='cc  -64 '
-set CMK_CC_RELIABLE='cc  -64 '
-set CMK_CC_FASTEST='cc  -64 '
-set CMK_CXX='CC -64 '
-set CMK_CXXPP='CC -E -64 '
+set CMK_CC='cc  -64 -D_SGI_MP_SOURCE '
+set CMK_CC_RELIABLE='cc  -64 -D_SGI_MP_SOURCE '
+set CMK_CC_FASTEST='cc  -64 -D_SGI_MP_SOURCE '
+set CMK_CXX='CC -64 -D_SGI_MP_SOURCE '
+set CMK_CXXPP='CC -E -64 -D_SGI_MP_SOURCE '
 set CMK_CF77=''
 set CMK_C_DEBUG='-g'
 set CMK_C_OPTIMIZE='-O'
 set CMK_CXX_DEBUG='-g'
 set CMK_CXX_OPTIMIZE='-O'
-set CMK_LD='cc -64 '
-set CMK_LDXX='CC -64 '
+set CMK_LD='cc -64 -D_SGI_MP_SOURCE '
+set CMK_LDXX='CC -64 -D_SGI_MP_SOURCE '
 set CMK_LD77=''
 set CMK_M4='m4'
 set CMK_SUF='o'
index 9e882380cdeb7f4da69cb8d84c6c8172f70e6faa..fcdbb6ef0faaf2164987cf8d443bc0b350d43fa9 100644 (file)
@@ -8,7 +8,13 @@
  ***************************************************************************
  *
  * $Log$
- * Revision 1.2  1997-12-22 21:58:04  jyelon
+ * Revision 1.3  1998-01-16 18:03:07  milind
+ * Fixed Ctv bug on shared memory machines.
+ * Made latencyBWtest conformant with Converse.
+ * Added high resolution timers to Origin2000.
+ * Removed starvation from Origin Pthreads version.
+ *
+ * Revision 1.2  1997/12/22 21:58:04  jyelon
  * Changed LDB initialization scheme.
  *
  * Revision 1.1  1997/11/26 19:13:59  milind
 
 #define CMK_MACHINE_NAME                                   "origin-pthreads"
 
-#define CMK_MALLOC_USE_GNU_MALLOC                          0
-#define CMK_MALLOC_USE_OS_BUILTIN                          1
+#define CMK_MALLOC_USE_GNU_MALLOC                          1
+#define CMK_MALLOC_USE_OS_BUILTIN                          0
 
 #define CMK_MEMORY_PAGESIZE                                8192
 #define CMK_MEMORY_PROTECTABLE                             0
 
 #define CMK_TIMER_USE_GETRUSAGE                            0
 #define CMK_TIMER_USE_SPECIAL                              0
-#define CMK_TIMER_USE_TIMES                                1
+#define CMK_TIMER_USE_TIMES                                0
 
 #define CMK_VECTOR_SEND_USES_COMMON_CODE                   1
 #define CMK_VECTOR_SEND_USES_SPECIAL_CODE                  0
index 8c088a8618587e784364f6c616f8fb87b488c9e5..95e33a8211f736d2cf31583ea3e245bc3263abd5 100644 (file)
@@ -1,6 +1,7 @@
 #include <errno.h>
 #include <pthread.h>
 #include <sched.h>
+#include <time.h>
 
 #define _POSIX1C
 #define _NO_ANSIMODE
@@ -19,6 +20,8 @@ extern void FIFO_EnQueue(void *, void *);
 
 typedef struct {
   pthread_mutex_t mutex;
+  pthread_cond_t cond;
+  int waiting;
   void     **blk;
   unsigned int blk_len;
   unsigned int first;
@@ -201,6 +204,8 @@ void ConverseInit(int argc, char **argv, CmiStartFn fn, int usched, int initret)
 
 static void neighbour_init(int);
 
+void CmiTimerInit(void);
+
 static void *threadInit(void *arg)
 {
   USER_PARAMETERS *usrparam;
@@ -209,8 +214,8 @@ static void *threadInit(void *arg)
 
   pthread_setspecific(perThreadKey, (void *) usrparam->mype);
 
-  ConverseCommonInit(usrparam->argv);
   CthInit(usrparam->argv);
+  ConverseCommonInit(usrparam->argv);
   neighbour_init(CmiMyPe());
   CpvInitialize(void*, CmiLocalQueue);
   CpvAccess(CmiLocalQueue) = (void *) FIFO_Create();
@@ -237,6 +242,15 @@ void CmiDeclareArgs(void)
 
 void CmiNotifyIdle()
 {
+  McQueue *queue = MsgQueue[CmiMyPe()];
+  pthread_mutex_lock(&(queue->mutex));
+  if(!queue->len){
+    queue->waiting++;
+    pthread_cond_wait(&(queue->cond), &(queue->mutex));
+    queue->waiting--;
+  }
+  pthread_mutex_unlock(&(queue->mutex));
+  return;
 }
 
 void *CmiGetNonLocal()
@@ -442,6 +456,8 @@ McQueue * McQueueCreate(void)
 
   queue = (McQueue *) CmiAlloc(sizeof(McQueue));
   pthread_mutex_init(&(queue->mutex), (pthread_mutexattr_t *) 0);
+  pthread_cond_init(&(queue->cond), (pthread_condattr_t *) 0);
+  queue->waiting = 0;
   queue->blk = AllocBlock(BLK_LEN);
   queue->blk_len = BLK_LEN;
   queue->first = 0;
@@ -466,6 +482,9 @@ void McQueueAddToBack(McQueue *queue, void *element)
   queue->blk[(queue->first+queue->len++)%queue->blk_len] = element;
   if(queue->len>queue->maxlen)
     queue->maxlen = queue->len;
+  if(queue->waiting) {
+    pthread_cond_broadcast(&(queue->cond));
+  }
   pthread_mutex_unlock(&(queue->mutex));
 }
 
@@ -482,3 +501,48 @@ void * McQueueRemoveFromFront(McQueue *queue)
   pthread_mutex_unlock(&(queue->mutex));
   return element;
 }
+
+/* Timer Routines */
+
+
+CpvStaticDeclare(double,inittime_wallclock);
+CpvStaticDeclare(double,inittime_virtual);
+
+void CmiTimerInit(void)
+{
+  struct timespec temp;
+  CpvInitialize(double, inittime_wallclock);
+  CpvInitialize(double, inittime_virtual);
+  clock_gettime(CLOCK_SGI_CYCLE, &temp);
+  CpvAccess(inittime_wallclock) = (double) temp.tv_sec +
+                                 1e-9 * temp.tv_nsec;
+  CpvAccess(inittime_virtual) = CpvAccess(inittime_wallclock);
+}
+
+double CmiWallTimer(void)
+{
+  struct timespec temp;
+  double currenttime;
+
+  clock_gettime(CLOCK_SGI_CYCLE, &temp);
+  currenttime = (double) temp.tv_sec +
+                1e-9 * temp.tv_nsec;
+  return (currenttime - CpvAccess(inittime_wallclock));
+}
+
+double CmiCpuTimer(void)
+{
+  struct timespec temp;
+  double currenttime;
+
+  clock_gettime(CLOCK_SGI_CYCLE, &temp);
+  currenttime = (double) temp.tv_sec +
+                1e-9 * temp.tv_nsec;
+  return (currenttime - CpvAccess(inittime_virtual));
+}
+
+double CmiTimer(void)
+{
+  return CmiCpuTimer();
+}
+
index 023595276bc2935e539b5eaeeec3820f8ad908e1..d8756d75b96f6cc8dec29d72a65554a196775494 100644 (file)
@@ -8,7 +8,13 @@
  ***************************************************************************
  *
  * $Log$
- * Revision 1.7  1998-01-13 17:03:37  milind
+ * Revision 1.8  1998-01-16 18:03:12  milind
+ * Fixed Ctv bug on shared memory machines.
+ * Made latencyBWtest conformant with Converse.
+ * Added high resolution timers to Origin2000.
+ * Removed starvation from Origin Pthreads version.
+ *
+ * Revision 1.7  1998/01/13 17:03:37  milind
  * Made charm++ to compile and run with Solaris 2.6.
  * In particular, changed INTBITS to CINTBITS, and handled EALREADY.
  *
 
 #define CMK_TIMER_USE_GETRUSAGE                            0
 #define CMK_TIMER_USE_SPECIAL                              0
-#define CMK_TIMER_USE_TIMES                                1
+#define CMK_TIMER_USE_TIMES                                0
 
 #define CMK_VECTOR_SEND_USES_COMMON_CODE                   1
 #define CMK_VECTOR_SEND_USES_SPECIAL_CODE                  0
index 00a4f6803a0739bea5e6e9c6837021cd728f269b..3c12807df6e83abb437c451dc0c1da1eba235f33 100644 (file)
@@ -6,6 +6,7 @@
 #include <ulocks.h>
 #include <math.h>
 #include "converse.h"
+#include <time.h>
 
 usptr_t *arena;
 static barrier_t *barr;
@@ -152,6 +153,8 @@ void ConverseInit(int argc, char **argv, CmiStartFn fn, int usched, int initret)
 
 static void neighbour_init(int);
 
+void CmiTimerInit(void);
+
 static void threadInit(void *arg)
 {
   USER_PARAMETERS *usrparam;
@@ -479,3 +482,48 @@ void * McQueueRemoveFromFront(McQueue *queue)
   }
   return localmsg;
 }
+
+/* Timer Routines */
+
+
+CpvStaticDeclare(double,inittime_wallclock);
+CpvStaticDeclare(double,inittime_virtual);
+
+void CmiTimerInit(void)
+{
+  struct timespec temp;
+  CpvInitialize(double, inittime_wallclock);
+  CpvInitialize(double, inittime_virtual);
+  clock_gettime(CLOCK_SGI_CYCLE, &temp);
+  CpvAccess(inittime_wallclock) = (double) temp.tv_sec +
+                                 1e-9 * temp.tv_nsec;
+  CpvAccess(inittime_virtual) = CpvAccess(inittime_wallclock);
+}
+
+double CmiWallTimer(void)
+{
+  struct timespec temp;
+  double currenttime;
+
+  clock_gettime(CLOCK_SGI_CYCLE, &temp);
+  currenttime = (double) temp.tv_sec +
+                1e-9 * temp.tv_nsec;
+  return (currenttime - CpvAccess(inittime_wallclock));
+}
+
+double CmiCpuTimer(void)
+{
+  struct timespec temp;
+  double currenttime;
+
+  clock_gettime(CLOCK_SGI_CYCLE, &temp);
+  currenttime = (double) temp.tv_sec +
+                1e-9 * temp.tv_nsec;
+  return (currenttime - CpvAccess(inittime_virtual));
+}
+
+double CmiTimer(void)
+{
+  return CmiCpuTimer();
+}
+
index 5ab7356c0e64befd4b33462658a9e410417146dc..f68d4ff4543de6af24ca058d0bcdad76817b4af3 100644 (file)
@@ -249,16 +249,19 @@ static void CmiHandlerInit()
 
 #if CMK_TIMER_USE_TIMES
 
-static double  clocktick;
-static int     inittime_wallclock;
-static int     inittime_virtual;
+CpvStaticDeclare(double, clocktick);
+CpvStaticDeclare(int,inittime_wallclock);
+CpvStaticDeclare(int,inittime_virtual);
 
 void CmiTimerInit()
 {
   struct tms temp;
-  inittime_wallclock = times(&temp);
-  inittime_virtual = temp.tms_utime + temp.tms_stime;
-  clocktick = 1.0 / (sysconf(_SC_CLK_TCK));
+  CpvInitialize(double, clocktick);
+  CpvInitialize(int, inittime_wallclock);
+  CpvInitialize(int, inittime_virtual);
+  CpvAccess(inittime_wallclock) = times(&temp);
+  CpvAccess(inittime_virtual) = temp.tms_utime + temp.tms_stime;
+  CpvAccess(clocktick) = 1.0 / (sysconf(_SC_CLK_TCK));
 }
 
 double CmiWallTimer()
@@ -268,7 +271,7 @@ double CmiWallTimer()
   int now;
 
   now = times(&temp);
-  currenttime = (now - inittime_wallclock) * clocktick;
+  currenttime = (now - CpvAccess(inittime_wallclock)) * CpvAccess(clocktick);
   return (currenttime);
 }
 
@@ -280,7 +283,7 @@ double CmiCpuTimer()
 
   times(&temp);
   now = temp.tms_stime + temp.tms_utime;
-  currenttime = (now - inittime_virtual) * clocktick;
+  currenttime = (now - CpvAccess(inittime_virtual)) * CpvAccess(clocktick);
   return (currenttime);
 }
 
@@ -293,17 +296,19 @@ double CmiTimer()
 
 #if CMK_TIMER_USE_GETRUSAGE
 
-static double inittime_wallclock;
-static double inittime_virtual;
+CpvStaticDeclare(double, inittime_wallclock);
+CpvStaticDeclare(double, inittime_virtual);
 
 void CmiTimerInit()
 {
   struct timeval tv;
   struct rusage ru;
+  CpvInitialize(double, inittime_wallclock);
+  CpvInitialize(double, inittime_virtual);
   gettimeofday(&tv,0);
-  inittime_wallclock = (tv.tv_sec * 1.0) + (tv.tv_usec*0.000001);
+  CpvAccess(inittime_wallclock) = (tv.tv_sec * 1.0) + (tv.tv_usec*0.000001);
   getrusage(0, &ru); 
-  inittime_virtual =
+  CpvAccess(inittime_virtual) =
     (ru.ru_utime.tv_sec * 1.0)+(ru.ru_utime.tv_usec * 0.000001) +
     (ru.ru_stime.tv_sec * 1.0)+(ru.ru_stime.tv_usec * 0.000001);
 }
@@ -317,7 +322,7 @@ double CmiCpuTimer()
   currenttime =
     (ru.ru_utime.tv_sec * 1.0)+(ru.ru_utime.tv_usec * 0.000001) +
     (ru.ru_stime.tv_sec * 1.0)+(ru.ru_stime.tv_usec * 0.000001);
-  return currenttime - inittime_virtual;
+  return currenttime - CpvAccess(inittime_virtual);
 }
 
 double CmiWallTimer()
@@ -327,7 +332,7 @@ double CmiWallTimer()
 
   gettimeofday(&tv,0);
   currenttime = (tv.tv_sec * 1.0) + (tv.tv_usec * 0.000001);
-  return currenttime - inittime_wallclock;
+  return currenttime - CpvAccess(inittime_wallclock);
 }
 
 double CmiTimer()
index ee983557fde9f5c2714a8b7f5504808861c1b496..f24579553ee694ef6056eef65b8fce267da2a9b0 100644 (file)
  * REVISION HISTORY:
  *
  * $Log$
- * Revision 2.76  1997-12-10 21:01:06  jyelon
+ * Revision 2.77  1998-01-16 18:03:02  milind
+ * Fixed Ctv bug on shared memory machines.
+ * Made latencyBWtest conformant with Converse.
+ * Added high resolution timers to Origin2000.
+ * Removed starvation from Origin Pthreads version.
+ *
+ * Revision 2.76  1997/12/10 21:01:06  jyelon
  * *** empty log message ***
  *
  * Revision 2.75  1997/11/26 19:17:24  milind
@@ -578,7 +584,7 @@ extern int CthRegister CMK_PROTO((int));
 #define CtvStaticDeclare(t,v)   typedef t CtvType##v; CsvStaticDeclare(int,CtvOffs##v);
 #define CtvExtern(t,v)          typedef t CtvType##v; CsvExtern(int,CtvOffs##v);
 #define CtvAccess(v)            (*((CtvType##v *)(CthCpvAccess(CthData)+CsvAccess(CtvOffs##v))))
-#define CtvInitialize(t,v)      if (CmiMyRank()==0) (CsvAccess(CtvOffs##v)=CthRegister(sizeof(CtvType##v)));
+#define CtvInitialize(t,v)      (CsvAccess(CtvOffs##v)=CthRegister(sizeof(CtvType##v)));
 
 /************************************************************************
  *