fptest01.c revision 4b20b1d51ab9293abe408289e9096fbf3fa9b080
1bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 2bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * 3bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * Copyright (c) International Business Machines Corp., 2002 4bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * 5bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * This program is free software; you can redistribute it and/or modify 6bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * it under the terms of the GNU General Public License as published by 7bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * the Free Software Foundation; either version 2 of the License, or 8bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * (at your option) any later version. 9bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * 10bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * This program is distributed in the hope that it will be useful, 11bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * but WITHOUT ANY WARRANTY; without even the implied warranty of 12bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * the GNU General Public License for more details. 14bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * 15bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * You should have received a copy of the GNU General Public License 16bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * along with this program; if not, write to the Free Software 17bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew */ 19bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 20bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* Group Bull & IBM Corporation */ 214b264476cb3f10b994b39e4b61cca0594ea79279robbiew/* 11/20/2002 Port to LTP robbiew@us.ibm.com */ 222c28215423293e443469a07ae7011135d058b671Garrett Cooper/* jacky.malcles@bull.net */ 23bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* IBM Corporation */ 244b264476cb3f10b994b39e4b61cca0594ea79279robbiew/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ 25bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 26bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 27bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * fptest01.c -- Floating point test. 28bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * 29bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * It is taken from a benchmark called "barsim". 30bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * 31bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * If the computation arrives at the expected values this routine 32bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * prints a "passed" message and exits 0. If an incorrect value is 33bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * computed a "failed" message is printed and the routine exits 1. 34bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew */ 35bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 36bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <stdio.h> 37a70576c4834d89f937e46698fef4114736cce4d7robbiew#include <errno.h> 38bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <math.h> 39bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <stdlib.h> 40bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <unistd.h> 41bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <sys/types.h> 42bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <sys/stat.h> 43bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <fcntl.h> 44bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 454b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define MAGIC1 1632.796126 464b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define DIFF1 0.001 474b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define MAGIC2 0.777807 484b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define DIFF2 0.001 494b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define EVENTMX 256 50bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define BIG 1.e50 51bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define FALSE 0 52bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define TRUE 1 53bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define TRYCRIT 1 54bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define ENTERCRIT 2 55bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define LEAVECRIT 3 56bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define ATBARRIER 4 57bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define ENTERWORK 5 58bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define LEAVEWORK 6 59bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define NULLEVENT 999 60bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 61bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/** LTP Port **/ 62bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include "test.h" 63bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include "usctest.h" 64bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 65bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewchar *TCID="fptest01"; /* Test program identifier. */ 66bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint TST_TOTAL=1; /* Total number of test cases. */ 67bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewextern int Tst_count; /* Test Case counter for tst_* routines */ 68bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/**************/ 69bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 70bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint init(); 71bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint doevent(); 72bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint term(); 73bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint addevent(); 74bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble gauss(); 75bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewvoid gaussinit(); 76bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event { 774b264476cb3f10b994b39e4b61cca0594ea79279robbiew int proc; 784b264476cb3f10b994b39e4b61cca0594ea79279robbiew int type; 794b264476cb3f10b994b39e4b61cca0594ea79279robbiew double time; 804b264476cb3f10b994b39e4b61cca0594ea79279robbiew }; 81bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 82bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event eventtab[EVENTMX]; 83bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event rtrevent; 844b264476cb3f10b994b39e4b61cca0594ea79279robbiewint waiting[EVENTMX]; /* array of waiting processors */ 854b264476cb3f10b994b39e4b61cca0594ea79279robbiewint nwaiting; /* number of waiting processors */ 869e78ade7d6c596a709d0228909bd5d37a85cf4a5vapierdouble global_time; /* global clock */ 874b264476cb3f10b994b39e4b61cca0594ea79279robbiewdouble lsttime; /* time used for editing */ 884b264476cb3f10b994b39e4b61cca0594ea79279robbiewdouble dtc, dts, alpha; /* timing parameters */ 894b264476cb3f10b994b39e4b61cca0594ea79279robbiewint nproc; /* number of processors */ 904b264476cb3f10b994b39e4b61cca0594ea79279robbiewint barcnt; /* number of processors ATBARRIER */ 914b264476cb3f10b994b39e4b61cca0594ea79279robbiewint ncycle; /* number of cycles completed */ 924b264476cb3f10b994b39e4b61cca0594ea79279robbiewint ncycmax; /* number of cycles to run */ 934b264476cb3f10b994b39e4b61cca0594ea79279robbiewint critfree; /* TRUE if critical section not occupied */ 944b264476cb3f10b994b39e4b61cca0594ea79279robbiewint gcount; /* # calls to gauss */ 95bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 96bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event *nextevent(); 97bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 98bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 994b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Coopermain(int argc, char **argv) 100bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 1014b264476cb3f10b994b39e4b61cca0594ea79279robbiew struct event *ev; 102bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1034b264476cb3f10b994b39e4b61cca0594ea79279robbiew nproc = 128; 1044b264476cb3f10b994b39e4b61cca0594ea79279robbiew ncycmax = 10; 1054b264476cb3f10b994b39e4b61cca0594ea79279robbiew dtc = 0.01; 1064b264476cb3f10b994b39e4b61cca0594ea79279robbiew dts = 0.0; 1074b264476cb3f10b994b39e4b61cca0594ea79279robbiew alpha = 0.1; 108bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1094b264476cb3f10b994b39e4b61cca0594ea79279robbiew init(); 110bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 111df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper while ((ev=nextevent()) != NULL) { 1124b264476cb3f10b994b39e4b61cca0594ea79279robbiew doevent(ev); 1134b264476cb3f10b994b39e4b61cca0594ea79279robbiew } 114bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1154b264476cb3f10b994b39e4b61cca0594ea79279robbiew term(); 1164b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TPASS,"PASS"); 1174b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper tst_exit(); 118bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 119bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 120bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 1214b264476cb3f10b994b39e4b61cca0594ea79279robbiew initialize all processes to "entering work section" 122bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 123bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 124bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewinit() 125bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 1264b264476cb3f10b994b39e4b61cca0594ea79279robbiew int p; 1274b264476cb3f10b994b39e4b61cca0594ea79279robbiew double dtw, dtwsig; 128bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1294b264476cb3f10b994b39e4b61cca0594ea79279robbiew ncycle=0; 1309e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier global_time=0; 1314b264476cb3f10b994b39e4b61cca0594ea79279robbiew lsttime=0; 1324b264476cb3f10b994b39e4b61cca0594ea79279robbiew barcnt=0; 1334b264476cb3f10b994b39e4b61cca0594ea79279robbiew nwaiting=0; 1344b264476cb3f10b994b39e4b61cca0594ea79279robbiew critfree=TRUE; 135bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1364b264476cb3f10b994b39e4b61cca0594ea79279robbiew dtw=1./nproc; /* mean process work time */ 1374b264476cb3f10b994b39e4b61cca0594ea79279robbiew dtwsig=dtw*alpha; /* std deviation of work time */ 1384b264476cb3f10b994b39e4b61cca0594ea79279robbiew gaussinit(dtw,dtwsig); 139bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1404b264476cb3f10b994b39e4b61cca0594ea79279robbiew for (p=1; p<=nproc; p++) { 1414b264476cb3f10b994b39e4b61cca0594ea79279robbiew eventtab[p].type = NULLEVENT; 1424b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 143bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1444b264476cb3f10b994b39e4b61cca0594ea79279robbiew for (p=1; p<=nproc; p++) { 1459e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier addevent(ENTERWORK,p,global_time); 1464b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 147bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 1484b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 149bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 150bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 1514b264476cb3f10b994b39e4b61cca0594ea79279robbiew print edit quantities 152bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 153bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 154bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewterm() 155bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 1564b264476cb3f10b994b39e4b61cca0594ea79279robbiew double avgspd; 1574b264476cb3f10b994b39e4b61cca0594ea79279robbiew double t_total = 0.0; 1584b264476cb3f10b994b39e4b61cca0594ea79279robbiew double v; 1594b264476cb3f10b994b39e4b61cca0594ea79279robbiew int i; 1604b264476cb3f10b994b39e4b61cca0594ea79279robbiew 1614b264476cb3f10b994b39e4b61cca0594ea79279robbiew for (i=0; i < nproc; i++) 1624b264476cb3f10b994b39e4b61cca0594ea79279robbiew t_total += eventtab[i].time; 1634b264476cb3f10b994b39e4b61cca0594ea79279robbiew 1649e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier avgspd=ncycle/global_time; 1654b264476cb3f10b994b39e4b61cca0594ea79279robbiew 1664b264476cb3f10b994b39e4b61cca0594ea79279robbiew v = t_total - MAGIC1; 1674b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (v < 0.0) 1684b264476cb3f10b994b39e4b61cca0594ea79279robbiew v *= -1.0; 1694b264476cb3f10b994b39e4b61cca0594ea79279robbiew 1704b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (v > DIFF1) { 1714b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TFAIL,"FAIL"); 1724b264476cb3f10b994b39e4b61cca0594ea79279robbiew v = t_total - MAGIC1; 1734b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TINFO,"t_total = %.15f\n", t_total); 1744b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TINFO,"expected %.15f\n", MAGIC1); 1754b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TINFO,"diff = %.15f\n", v); 1764b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper tst_exit(); 1774b264476cb3f10b994b39e4b61cca0594ea79279robbiew } 1784b264476cb3f10b994b39e4b61cca0594ea79279robbiew 1794b264476cb3f10b994b39e4b61cca0594ea79279robbiew v = avgspd - MAGIC2; 1804b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (v < 0.0) 1814b264476cb3f10b994b39e4b61cca0594ea79279robbiew v *= -1.0; 1824b264476cb3f10b994b39e4b61cca0594ea79279robbiew 1834b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (v > DIFF2) { 1844b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TFAIL,"FAIL"); 1854b264476cb3f10b994b39e4b61cca0594ea79279robbiew v = avgspd - MAGIC2; 1864b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TINFO,"avgspd = %.15f\n", avgspd); 1874b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TINFO,"expected %.15f\n", MAGIC2); 1884b264476cb3f10b994b39e4b61cca0594ea79279robbiew tst_resm(TINFO,"diff = %.15f\n", v); 1894b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper tst_exit(); 1904b264476cb3f10b994b39e4b61cca0594ea79279robbiew } 1914b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 192bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 193bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 1944b264476cb3f10b994b39e4b61cca0594ea79279robbiew add an event to the event queue 195bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 196bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 1974b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooperaddevent(int type,int proc, double t) 198bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 1994b264476cb3f10b994b39e4b61cca0594ea79279robbiew int i; 2004b264476cb3f10b994b39e4b61cca0594ea79279robbiew int ok=FALSE; 2014b264476cb3f10b994b39e4b61cca0594ea79279robbiew 2024b264476cb3f10b994b39e4b61cca0594ea79279robbiew for (i=1; i<=nproc; i++) { 2034b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (eventtab[i].type==NULLEVENT) { 2044b264476cb3f10b994b39e4b61cca0594ea79279robbiew eventtab[i].type=type; 2054b264476cb3f10b994b39e4b61cca0594ea79279robbiew eventtab[i].proc=proc; 2064b264476cb3f10b994b39e4b61cca0594ea79279robbiew eventtab[i].time=t; 2074b264476cb3f10b994b39e4b61cca0594ea79279robbiew ok=TRUE; 2084b264476cb3f10b994b39e4b61cca0594ea79279robbiew break; 2094b264476cb3f10b994b39e4b61cca0594ea79279robbiew } 2104b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 2112c28215423293e443469a07ae7011135d058b671Garrett Cooper if (ok) 2124b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 2134b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper else 2144b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper tst_brkm(TBROK, NULL, "No room for event"); 2154b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 216bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 217bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 2184b264476cb3f10b994b39e4b61cca0594ea79279robbiew get earliest event in event queue 219bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 220bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event *nextevent() 221bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2224b264476cb3f10b994b39e4b61cca0594ea79279robbiew double mintime=BIG; 2234b264476cb3f10b994b39e4b61cca0594ea79279robbiew int imin=0; 2244b264476cb3f10b994b39e4b61cca0594ea79279robbiew int i; 225bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 2264b264476cb3f10b994b39e4b61cca0594ea79279robbiew for (i=1; i<=nproc; i++) { 2274b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper if (eventtab[i].type != NULLEVENT && 2284b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper eventtab[i].time<mintime) { 2294b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper imin=i; 2304b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper mintime=eventtab[i].time; 2314b264476cb3f10b994b39e4b61cca0594ea79279robbiew } 2324b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 2332c28215423293e443469a07ae7011135d058b671Garrett Cooper 2344b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (imin) { 2354b264476cb3f10b994b39e4b61cca0594ea79279robbiew rtrevent.type = eventtab[imin].type; 2364b264476cb3f10b994b39e4b61cca0594ea79279robbiew rtrevent.proc = eventtab[imin].proc; 2374b264476cb3f10b994b39e4b61cca0594ea79279robbiew rtrevent.time = eventtab[imin].time; 2384b264476cb3f10b994b39e4b61cca0594ea79279robbiew eventtab[imin].type=NULLEVENT; 2394b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(&rtrevent); 2404b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } else 2414b264476cb3f10b994b39e4b61cca0594ea79279robbiew return((struct event *)NULL); 242bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 243bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 2444b264476cb3f10b994b39e4b61cca0594ea79279robbiew add a processor to the waiting queue 245bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 246bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 247bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewaddwaiting(p) 248bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint p; 249bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2504b264476cb3f10b994b39e4b61cca0594ea79279robbiew waiting[++nwaiting]=p; 2514b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 252bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 253bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 2544b264476cb3f10b994b39e4b61cca0594ea79279robbiew remove the next processor from the waiting queue 255bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 256bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 257bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewgetwaiting() 258bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2594b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (nwaiting) 2604b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(waiting[nwaiting--]); 2614b264476cb3f10b994b39e4b61cca0594ea79279robbiew else 2624b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 263bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 264bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble dtcrit() 265bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2664b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(dtc); 267bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 268bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble dtspinoff() 269bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2704b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(dts); 271bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 272bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble dtwork() 273bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2744b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(gauss()); 275bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 276bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* 2774b264476cb3f10b994b39e4b61cca0594ea79279robbiew take the action prescribed by 'ev', update the clock, and 2784b264476cb3f10b994b39e4b61cca0594ea79279robbiew generate any subsequent events 279bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/ 280bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint 281bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdoevent(ev) 282bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event *ev; 283bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 2844b264476cb3f10b994b39e4b61cca0594ea79279robbiew double nxttime; 2854b264476cb3f10b994b39e4b61cca0594ea79279robbiew int i, p, proc; 2864b264476cb3f10b994b39e4b61cca0594ea79279robbiew 2879e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier global_time = ev->time; 2884b264476cb3f10b994b39e4b61cca0594ea79279robbiew proc = ev->proc; 2894b264476cb3f10b994b39e4b61cca0594ea79279robbiew 2904b264476cb3f10b994b39e4b61cca0594ea79279robbiew switch (ev->type) { 2914b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper case TRYCRIT: 2924b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper if (critfree==TRUE) 2934b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(ENTERCRIT,proc,global_time); 2944b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper else 2954b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addwaiting(proc); 2964b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 2974b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper case ENTERCRIT: 2984b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper critfree = FALSE; 2994b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper nxttime=global_time+dtcrit(); 3004b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(LEAVECRIT,proc,nxttime); 3014b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 3024b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper case LEAVECRIT: 3034b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper critfree = TRUE; 3044b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(ATBARRIER,proc,global_time); 3054b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper if ((p=getwaiting())!=0) { 3064b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper nxttime=global_time; 3074b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(ENTERCRIT,p,nxttime); 3084b264476cb3f10b994b39e4b61cca0594ea79279robbiew } 3094b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 3104b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper case ATBARRIER: 3114b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper barcnt++; 3124b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper if (barcnt==nproc) { 3134b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper nxttime=global_time; 3144b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper for (i=1; i<=nproc; i++) { 3154b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper nxttime+=dtspinoff(); 3164b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(ENTERWORK,i,nxttime); 3174b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 3184b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper barcnt=0; 3194b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper ncycle++; 3204b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 3214b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 3224b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper case ENTERWORK: 3234b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper nxttime=global_time+dtwork(); 3244b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper if (ncycle<ncycmax) 3254b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(LEAVEWORK,proc,nxttime); 3264b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 3274b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper case LEAVEWORK: 3284b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper addevent(TRYCRIT,proc,global_time); 3294b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 3304b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper default: 3314b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper tst_brkm(TBROK, NULL, "Illegal event"); 3324b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper break; 3334b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 3344b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(0); 335bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 336bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 337bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic int alternator=1; 338bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double mean; 339bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double stdev; 340bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double u1,u2; 341bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double twopi; 342bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew 3434b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Coopervoid gaussinit(double m, double s) 344bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 3454b264476cb3f10b994b39e4b61cca0594ea79279robbiew mean=m; 3464b264476cb3f10b994b39e4b61cca0594ea79279robbiew stdev=s; 3474b264476cb3f10b994b39e4b61cca0594ea79279robbiew twopi=2.*acos((double)-1.0); 3484b264476cb3f10b994b39e4b61cca0594ea79279robbiew u1 = twopi / 400.0; 3494b264476cb3f10b994b39e4b61cca0594ea79279robbiew u2 = twopi / 500.0; 350bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew} 3512c28215423293e443469a07ae7011135d058b671Garrett Cooper 352bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble gauss() 353bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{ 3544b264476cb3f10b994b39e4b61cca0594ea79279robbiew double x1,x2; 3554b264476cb3f10b994b39e4b61cca0594ea79279robbiew 3564b264476cb3f10b994b39e4b61cca0594ea79279robbiew gcount++; 3574b264476cb3f10b994b39e4b61cca0594ea79279robbiew 3584b264476cb3f10b994b39e4b61cca0594ea79279robbiew u1 += u2; 3594b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (u1 > 0.99) 3604b264476cb3f10b994b39e4b61cca0594ea79279robbiew u1 = twopi / 500.0; 3614b264476cb3f10b994b39e4b61cca0594ea79279robbiew u2 += u1; 3624b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (u2 > 0.99) 3634b264476cb3f10b994b39e4b61cca0594ea79279robbiew u2 = twopi / 400.0; 3644b264476cb3f10b994b39e4b61cca0594ea79279robbiew 3654b264476cb3f10b994b39e4b61cca0594ea79279robbiew if (alternator==1) { 3664b264476cb3f10b994b39e4b61cca0594ea79279robbiew alternator = -1; 3674b264476cb3f10b994b39e4b61cca0594ea79279robbiew x1 = sqrt(-2.0*log(u1))*cos(twopi*u2); 3684b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(mean + stdev*x1); 3694b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } else { 3704b264476cb3f10b994b39e4b61cca0594ea79279robbiew alternator = 1; 3714b264476cb3f10b994b39e4b61cca0594ea79279robbiew x2 = sqrt(-2.0*log(u1))*sin(twopi*u2); 3724b264476cb3f10b994b39e4b61cca0594ea79279robbiew return(mean + stdev*x2); 3734b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper } 3744b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper} 375