⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c.orig

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 ORIG
字号:
/* $Header: /home/harrison/c/tcgmsg/ipcv4.0/RCS/test.c,v 1.1 91/12/06 17:27:41 harrison Exp Locker: harrison $ */#include <stdio.h>#if !defined(SEQUENT) && !defined(CONVEX)#include <memory.h>#endif#include "sndrcv.h"#include "evlog.h"extern char *memalign();#if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX)extern void *malloc();#elseextern char *malloc();#endifextern unsigned char CheckByte();extern double DRAND48_();#if defined(SUN)extern char *sprintf();#endif#ifdef IPSC#define bzero(A,N) memset((A), 0, (N))#endifstatic void TestGlobals(){#define MAXLENG 256*1024  double *dtest;  long *itest;  long len;  long me = NODEID_(), nproc = NNODES_(), from=NNODES_()-1;  long itype=3+MSGINT, dtype=4+MSGDBL;  if (me == 0) {    (void) printf("Global test ... test brodcast, igop and dgop\n----------\n\n");    (void) fflush(stdout);  }  if (!(dtest = (double *) malloc((unsigned) (MAXLENG*sizeof(double)))))    Error("TestGlobals: failed to allocated dtest", (long) MAXLENG);  if (!(itest = (long *) malloc((unsigned) (MAXLENG*sizeof(long)))))    Error("TestGlobals: failed to allocated itest", (long) MAXLENG);  for (len=1; len<MAXLENG; len*=2) {    long ilen = len*sizeof(long);    long dlen = len*sizeof(double);    long i;        if (me == 0) {      printf("Test length = %d ... ", len);      fflush(stdout);    }    /* Test broadcast */    if (me == (nproc-1)) {      for (i=0; i<len; i++) {	itest[i] = i;	dtest[i] = (double) itest[i];      }    }    else {      for (i=0; i<len; i++) {	itest[i] = 0;	dtest[i] = 0.0;      }    }    BRDCST_(&itype, (char *) itest, &ilen, &from);    BRDCST_(&dtype, (char *) dtest, &dlen, &from);        for (i=0; i<len; i++)      if (itest[i] != i || dtest[i] != (double) i)	Error("TestGlobal: broadcast failed", (long) i);    if (me == 0) {      printf("broadcast OK ...");      fflush(stdout);    }    /* Test global sum */    for (i=0; i<len; i++) {      itest[i] = i*me;      dtest[i] = (double) itest[i];    }    IGOP_(&itype, itest, &len, "+");    DGOP_(&dtype, dtest, &len, "+");    for (i=0; i<len; i++) {      long iresult = i*nproc*(nproc-1)/2;      if (itest[i] != iresult || dtest[i] != (double) iresult)	Error("TestGlobals: global sum failed", (long) i);    }    if (me == 0) {      printf("global sums OK\n");      fflush(stdout);    }  }        free((char *) itest);  free((char *) dtest);}  static void Hello()/*  Everyone says hi to everyone else*/{  char buf[30];  long lenbuf = sizeof buf;  long type=19 | MSGCHR;  long node, kode, nodefrom, lenmes;  long sync = 1;  if (NODEID_() == 0) {    (void) printf("Hello test ... show network integrity\n----------\n\n");    (void) fflush(stdout);  }  for (node = 0; node<NNODES_(); node++) {    if (node == NODEID_()) {      for (kode = 0; kode<NNODES_(); kode++) {	(void) sprintf(buf, "Hello to %ld from %ld", kode, NODEID_());	if (node != kode)	  SND_(&type, buf, &lenbuf, &kode, &sync);      }    }    else {      RCV_(&type, buf, &lenbuf, &lenmes, &node, &nodefrom, &sync);      (void) printf("me=%ld, from=%ld: %s\n",NODEID_(), node, buf);      (void) fflush(stdout);    }  }}static void RandList(lo, hi, list, n)     long lo, hi, *list, n;/*  Fill list with n random integers between lo & hi inclusively*/{  long i, ran;  double dran;  for (i=0; i<n; i++) {    dran = DRAND48_();    ran = lo + (long) (dran * (double) (hi-lo+1));    if (ran < lo)      ran = lo;    if (ran > hi)      ran = hi;    list[i] = ran;  }}void Stress()/*  Stress the system by passing messages between a ranomly selected  list of nodes*/{  long me = NODEID_();  long nproc = NNODES_();  long type, lenbuf, node, lenmes, nodefrom, i, j, from, to;  long *list_i, *list_j, *list_n;#define N_LEN 11  static long len[N_LEN] = {0,1,2,4,8,4095,4096,4097,16367,16368,16369};  char *buf1, *buf2;  long n_stress, mod;  long sync = 1;  from = 0;  lenbuf = sizeof(long);  if (me == 0) {    (void) printf("Stress test ... randomly exchange messages\n-----------");    (void) printf("\n\nInput no. of messages: ");    (void) fflush(stdout);    if (scanf("%ld",&n_stress) != 1)      Error("Stress: error reading n_stress",(long) -1);    if ( (n_stress <= 0) || (n_stress > 100000) )      n_stress = 100;  }  type = 13 | MSGINT;  BRDCST_(&type, (char *) &n_stress, &lenbuf, &from);  type++;  lenbuf = n_stress * sizeof(long);  if ( (list_i = (long *) memalign(sizeof(long), (unsigned) lenbuf))      == (long *) NULL )    Error("Stress: failed to allocate list_i",n_stress);  if ( (list_j = (long *) memalign(sizeof(long), (unsigned) lenbuf))      == (long *) NULL )    Error("Stress: failed to allocate list_j",n_stress);  if ( (list_n = (long *) memalign(sizeof(long), (unsigned) lenbuf))      == (long *) NULL )    Error("Stress: failed to allocate list_n",n_stress);  if ( (buf1 = malloc((unsigned) 16376)) == (char *) NULL )    Error("Stress: failed to allocate buf1", (long) 16376);  if ( (buf2 = malloc((unsigned) 16376)) == (char *) NULL )    Error("Stress: failed to allocate buf2", (long) 16376);  if (me == 0) { /* Make random list of node pairs and message lengths */    RandList((long) 0, (long) (NNODES_()-1), list_i, n_stress);    RandList((long) 0, (long) (NNODES_()-1), list_j, n_stress);    RandList((long) 0, (long) (N_LEN-1), list_n, n_stress);    for (i=0; i<n_stress; i++)      list_n[i] = len[list_n[i]];  }  node = 0;  BRDCST_(&type, (char *) list_i, &lenbuf, &node);  type++;  BRDCST_(&type, (char *) list_j, &lenbuf, &node);  type++;  BRDCST_(&type, (char *) list_n, &lenbuf, &node);  type++;  type = 8;  for (j=0; j<16370; j++)    buf1[j] = (char) (j%127);  j = 0;  mod = (n_stress-1)/10 + 1;  for (i=0; i < n_stress; i++) {    from   = list_i[i];    to     = list_j[i];    lenbuf = list_n[i];    type++;        if ( (from < 0) || (from >= nproc) )      Error("Stress: from is out of range", from);    if ( (to < 0) || (to >= nproc) )      Error("Stress: to is out of range", to);    if (from == to)      continue;    if ( (me == 0) && (j%mod == 0) ) {      (void) printf("Stress: test=%ld: from=%ld, to=%ld, len=%ld\n",		    i, from, to, lenbuf);      (void) fflush(stdout);    }    j++;    if (from == me)      SND_(&type, buf1, &lenbuf, &to, &sync);    else if (to == me) {      (void) bzero(buf2, (int) lenbuf);    /* Initialize the receive buffer */      buf2[lenbuf] = '+';      RCV_(&type, buf2, &lenbuf, &lenmes, &from, &nodefrom, &sync);      if (buf2[lenbuf] != '+')	Error("Stress: overran buffer on receive",lenbuf);      if (CheckByte((unsigned char *) buf1, lenbuf) != 	  CheckByte((unsigned char *) buf2, lenbuf))	Error("Stress: invalid checksum on receive",lenbuf);      if (lenmes != lenbuf)	Error("Stress: invalid message length on receive",lenbuf);    }  }  (void) free(buf2);  (void) free(buf1);  (void) free((char *) list_n);  (void) free((char *) list_j);  (void) free((char *) list_i);}void RingTest()  /* Time passing a message round a ring */{  long me = NODEID_();  long type = 4;  long left = (me + NNODES_() - 1) % NNODES_();  long right = (me + 1) % NNODES_();  char *buf, *buf2;  unsigned char sum, sum2;  long lenbuf, lenmes, nodefrom;  double start, used, rate;  long max_len;  long i;  long sync = 1;  i = 0;  lenbuf = sizeof(long);  if (me == 0) {    (void) printf("Ring test ... time network performance\n---------\n\n");    (void) printf("Input maximum message size: ");    (void) fflush(stdout);    if (scanf("%ld", &max_len) != 1)      Error("RingTest: error reading max_len",(long) -1);    if ( (max_len <= 0) || (max_len >= 4*1024*1024) )      max_len = 256*1024;  }  type = 4 | MSGINT;  BRDCST_(&type, (char *) &max_len, &lenbuf, &i);  if ( (buf = malloc((unsigned) max_len)) == (char *) NULL)    Error("failed to allocate buf",max_len);  if (me == 0) {    if ( (buf2 = malloc((unsigned) max_len)) == (char *) NULL)      Error("failed to allocate buf2",max_len);        for (i=0; i<max_len; i++)      buf[i] = (char) (i%127);  }  type = 5;  lenbuf = 1;  while (lenbuf <= max_len) {    int nloops = 10 + 1000/lenbuf;    int loop = nloops;    if (me == 0) {      sum = CheckByte((unsigned char *) buf, lenbuf);      (void) bzero(buf2, (int) lenbuf);      start = TCGTIME_();      while (loop--) {        SND_(&type, buf, &lenbuf, &left, &sync);        RCV_(&type, buf2, &lenbuf, &lenmes, &right, &nodefrom, &sync);      }      used = TCGTIME_() - start;      sum2 = CheckByte((unsigned char *) buf2, lenbuf);      if (used > 0)        rate = 1.0e-6 * (double) (NNODES_() * lenbuf) / (double) used;      else        rate = 0.0;      rate = rate * nloops;      printf("len=%6ld bytes, nloop=%4ld, used=%8.4f s, rate=%8.4f Mb/s (0x%x, 0x%x)\n",	     lenbuf, nloops, used, rate, sum, sum2);      (void) fflush(stdout);    }    else {      while (loop--) {        RCV_(&type, buf, &lenbuf, &lenmes, &right, &nodefrom, &sync);        SND_(&type, buf, &lenbuf, &left, &sync);      }    }    lenbuf *= 2;  }  if (me == 0)    (void) free(buf2);  (void) free(buf);}void RcvAnyTest()  /* Test receiveing a message from any node */{  long me = NODEID_();  long type = 337 | MSGINT;  char buf[8];  long i, j, node, lenbuf, lenmes, nodefrom, receiver, n_msg;  long sync = 1;  lenbuf = sizeof(long);  if (me == 0) {    (void) printf("RCV any test ... check is working!\n-----------\n\n");    (void) printf("Input node to receive : ");    (void) fflush(stdout);    if (scanf("%ld", &receiver) != 1)      Error("RcvAnyTest: error reading receiver",(long) -1);    if ( (receiver < 0) || (receiver >= NNODES_()) )      receiver = NNODES_()-1;    (void) printf("Input number of messages : ");    (void) fflush(stdout);    if (scanf("%ld", &n_msg) != 1)      Error("RcvAnyTest: error reading n_msg",(long) -1);    if ( (n_msg <= 0) || (n_msg > 10) )      n_msg = 5;  }    node = 0;  BRDCST_(&type, (char *) &receiver, &lenbuf, &node);  type++;  BRDCST_(&type, (char *) &n_msg, &lenbuf, &node);  type++;  lenbuf = 0;    type = 321;  for (i=0; i<n_msg; i++) {    if (me == receiver) {      for (j = 0; j<NNODES_(); j++)	if (j !=  me) {	  node = -1;	  RCV_(&type, buf, &lenbuf, &lenmes, &node, &nodefrom, &sync);	  (void) printf("RcvAnyTest: message received from %ld\n",nodefrom);	  (void) fflush(stdout);	}    }    else      SND_(&type, buf, &lenbuf, &receiver, &sync);  }}void NextValueTest()  /* Test the load balancing mechanism */{  long nproc = NNODES_();  long me = NODEID_();  long type = 51 | MSGINT;  long i, node, lenbuf, n_val, next;  long ngot, ntimes;  double start, used, rate;  lenbuf = sizeof(long);  if (me == 0) {    (void) printf("Next value test ... time overhead!\n---------------\n\n");    (void) printf("Input iteration count : ");    (void) fflush(stdout);    if (scanf("%ld", &n_val) != 1)      Error("NextValueTest: error reading n_val",(long) -1);    if ( (n_val < 0) || (n_val >= 10000) )      n_val = 100;  }  node = 0;  BRDCST_(&type, (char *) &n_val, &lenbuf, &node);  /* Loop thru a few values to visually show it is working */  next = -1;  for (i=0; i<10; i++) {    if (i > next)      next = NXTVAL_(&nproc);          if (i == next) {      (void) printf("node %ld got value %ld\n",me, i);      (void) fflush(stdout);    }  }  nproc = -nproc;  next = NXTVAL_(&nproc);  nproc = -nproc;  /* Now time it for real .. twice*/  for (ntimes=0; ntimes<2; ntimes++) {	if (me == 0)	  start = TCGTIME_();	next = -1;	ngot = 0;	for (i=0; i<n_val; i++) {	  if (i > next)		next = NXTVAL_(&nproc);	  if (i == next)		ngot++;	}		nproc = -nproc;	next = NXTVAL_(&nproc);	nproc = -nproc;	if (me == 0) {	  used =  TCGTIME_() - start;	  rate = used / ngot;	  (void) printf("node 0: From %ld busy iters did %ld, used=%fs per call\n",			n_val, ngot, rate);	  (void) fflush(stdout);	}        type++;	SYNCH_(&type);  }}void ToggleDebug(){  static long on = 0;  long me = NODEID_();  long type = 666 | MSGINT;  long lenbuf = sizeof(long);  long from=0;  long node;  if (me == 0) {    (void) printf("\nInput node to debug (-1 = all) : ");    (void) fflush(stdout);    if (scanf("%ld", &node) != 1)      Error("ToggleDebug: error reading node",(long) -1);  }  BRDCST_(&type, (char *) &node, &lenbuf, &from);  if ((node < 0) || (node == me)) {    on = (on + 1)%2;    SETDBG_(&on);  }}int main(argc, argv)    int argc;    char **argv;{  long type;  long lenbuf;  long node, opt;    PBEGIN_(argc, argv);  (void) printf("In process %ld\n", NODEID_());  (void) fflush(stdout);  /* Read user input for action */  lenbuf = sizeof(long);  node = 0;  while (1) {    (void) fflush(stdout);    if (NODEID_() == 0)       (void) sleep(1);    type = 999;    SYNCH_(&type);    (void) sleep(1);    if (NODEID_() == 0) {    again:      (void) printf("\n\0=quit, 1=Ring, 2=Stress, 3=Hello, 4=RcvAny, 5=NxtVal, 6=Global, 7=Debug: ");      (void) fflush(stdout);      if (scanf("%ld", &opt) != 1)	Error("test: input of option failed",(long) -1);      (void) printf("\n");      (void) fflush(stdout);      if ( (opt < 0) || (opt > 7) )	goto again;    }    type = 2 | MSGINT;    BRDCST_(&type, (char *) &opt, &lenbuf, &node);    switch (opt) {    case 0:      if (NODEID_() == 0)	STATS_();      PEND_();      return 0;/*    break; */    case 1:      RingTest();      break;      case 2:      Stress();      break;    case 3:      Hello();      break;    case 4:      RcvAnyTest();      break;    case 5:      NextValueTest();      break;    case 6:      TestGlobals();      break;    case 7:      ToggleDebug();      break;    default:      Error("test: invalid option", opt);      break;    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -