summaryrefslogtreecommitdiffstats
path: root/dis/Pointer
diff options
context:
space:
mode:
authorJoshua Bakita <jbakita@cs.unc.edu>2020-10-16 16:55:14 -0400
committerJoshua Bakita <jbakita@cs.unc.edu>2020-10-16 16:55:14 -0400
commit6ea9939e0610a809f6f47d13ec68df00d1ca0afc (patch)
treefe4a2eee3ddcf77e2367309dcd75a232b76dcd62 /dis/Pointer
parente9285d0cdea756a2830f0ace378e4197b36869aa (diff)
Move the DIS benchmarks up a directory and update hardcoded paths
Note that this repo does not attempt to keep a copy of the original DIS benchmark distributions. UNC real-time has another repo for that.
Diffstat (limited to 'dis/Pointer')
-rw-r--r--dis/Pointer/DISstressmarkRNG.h190
-rw-r--r--dis/Pointer/pointer.c159
2 files changed, 349 insertions, 0 deletions
diff --git a/dis/Pointer/DISstressmarkRNG.h b/dis/Pointer/DISstressmarkRNG.h
new file mode 100644
index 0000000..4aa2620
--- /dev/null
+++ b/dis/Pointer/DISstressmarkRNG.h
@@ -0,0 +1,190 @@
1#include <math.h>
2
3#define IA 16807
4#define IM 2147483647
5#define AM (1.0/IM)
6#define IQ 127773
7#define IR 2836
8#define NTAB 32
9#define NDIV (1+(IM-1)/NTAB)
10#define EPS 1.2e-7
11#define RNMX (1.0-EPS)
12
13static long iy=0;
14static long iv[NTAB];
15static long iseed;
16
17int ABS(int x){
18 if (x>= 0) return x;
19 else
20 return (-x);
21}
22
23int sign(int x){
24 if (x >= 0) return 1;
25 else
26 return (-1);
27}
28
29int MAX(int x, int y){
30 if (x>= y) return x;
31 else
32 return y;
33}
34
35int MIN(int x, int y){
36 if (x<= y) return x;
37 else
38 return y;
39}
40
41void randInit(long idum)
42{
43 long j;
44 long k;
45
46 assert (idum <= 0);
47 assert (iy == 0);
48
49 iseed = idum;
50 if (-(iseed)<1){
51 iseed = 1;
52 }
53 else {
54 iseed = -(iseed);
55 }
56 for (j=NTAB+7; j>=0; j--){
57 k = (iseed)/IQ;
58 iseed = IA*(iseed-k*IQ)-IR*k;
59 if (iseed < 0){
60 iseed += IM;
61 }
62 if (j < NTAB){
63 iv[j] = iseed;
64 }
65 }
66 iy = iv[0];
67}
68
69float randNum()
70{
71 long j;
72 long k;
73 float temp;
74
75 assert (iy != 0);
76
77 k = (iseed)/IQ;
78 iseed = IA*(iseed-k*IQ)-IR*k;
79
80 if (iseed < 0){
81 iseed += IM;
82 }
83 j = iy/NDIV;
84 iy = iv[j];
85 iv[j] = iseed;
86
87 temp = AM * iy;
88
89 if (temp > RNMX){
90 return RNMX;
91 }
92 else {
93 return temp;
94 }
95}
96
97
98float randomFloat(float lowest_float, float highest_float)
99{
100 float value;
101 float range;
102
103assert (lowest_float < highest_float);
104
105range = highest_float - lowest_float;
106value = randNum()*(highest_float - lowest_float) + lowest_float;
107assert(value >= lowest_float);
108assert(value <= highest_float);
109
110return value;
111
112}
113
114float randomNonZeroFloat(float lowest_float, float highest_float, float epsilon)
115{
116
117 double range;
118 float value;
119
120
121 assert (lowest_float < 0);
122 assert (highest_float > 0);
123 assert (epsilon > 0);
124 assert ((epsilon < -lowest_float) && (epsilon < highest_float));
125
126 range = highest_float - lowest_float;
127 value = (randNum() * range)+lowest_float;
128
129 if (ABS(value) < epsilon)
130 {
131 if (value > 0) value = value + epsilon;
132 else if (value < 0) value = value - epsilon;
133
134 }
135
136 assert (value >= lowest_float);
137 assert (value <= highest_float);
138
139 return value;
140}
141
142unsigned int randomUInt(int lowest_uint, int highest_uint)
143{
144 float range;
145 unsigned int value;
146 float temp;
147
148 range =(float)(highest_uint - lowest_uint + 1);
149 temp = randNum();
150 value =(unsigned int)( floor(temp * range) + lowest_uint);
151
152 assert (value >= lowest_uint);
153 assert (value <= highest_uint);
154
155 return value;
156}
157
158unsigned int randomNonZeroUInt(int lowest_uint, int highest_uint)
159{
160 float range;
161 unsigned int value;
162 float temp;
163
164 range =(float)(highest_uint - lowest_uint + 1);
165 value = 0;
166 while(value == 0){
167 temp = randNum();
168
169 value =(unsigned int)( floor(temp * range) + lowest_uint);
170 }
171
172 assert (value >= lowest_uint);
173 assert (value <= highest_uint);
174
175 return value;
176}
177
178int randInt(int lowest_uint, int highest_uint)
179{
180 float range;
181 int value;
182
183 range = highest_uint - lowest_uint + 1;
184 value = (int)(floor(randNum() * range) + lowest_uint);
185
186 assert (value >= lowest_uint);
187 assert (value <= highest_uint);
188
189 return value;
190}
diff --git a/dis/Pointer/pointer.c b/dis/Pointer/pointer.c
new file mode 100644
index 0000000..5671697
--- /dev/null
+++ b/dis/Pointer/pointer.c
@@ -0,0 +1,159 @@
1/*
2 * Sample code for the DIS Pointer Stressmark
3 *
4 * This source code is the completely correct source code based on
5 * the example codes provided by Atlantic Aerospace Division, Titan
6 * Systems Corporation, 2000.
7 *
8 * If you just compile and generate the executables from this source
9 * code, this code would be enough. However, if you wish to get a complete
10 * understanding of this stressmark, it is strongly suggested that you
11 * read the Benchmark Analysis and Specifications Document Version 1.0
12 * before going on since the detailed comments are given in this documents.
13 * the comments are not repeated here.
14 */
15#include <stdio.h>
16#include <time.h>
17#include <assert.h>
18#include <stdlib.h>
19#include "DISstressmarkRNG.h"
20#include "extra.h"
21
22#define MIN_FIELD_SIZE 16
23#define MAX_FIELD_SIZE (16777216*4) // Modifed from original
24#define MIN_WINDOW_SIZE 1
25#define MAX_WINDOW_SIZE 15
26#define MIN_HOP_LIMIT 1
27
28#define MAX_HOP_LIMIT 4294967295U
29
30#define MIN_SEED -2147483647
31#define MAX_SEED -1
32#define MIN_THREADS 1
33#define MAX_THREADS 256
34
35/*
36 * main()
37 */
38int main(int argc, char** argv){
39
40 unsigned int *field;
41 unsigned int f;
42 unsigned short int w;
43 unsigned int maxhops;
44 int seed;
45 unsigned int n;
46
47 clock_t startTime;
48
49 struct threadS{
50 unsigned int initial;
51 unsigned int minStop;
52 unsigned int maxStop;
53 unsigned int hops;
54 }*thread;
55
56 unsigned int l;
57 SET_UP
58
59 assert(fscanf(stdin, "%lu %u %lu %ld %u",
60 &f, &l, &maxhops, &seed, &n) == 5);
61
62 assert ((f >= MIN_FIELD_SIZE) && (f <= MAX_FIELD_SIZE));
63 w = (unsigned int) l;
64 assert ((w >= MIN_WINDOW_SIZE) && (w <= MAX_WINDOW_SIZE));
65 assert (w % 2 == 1);
66 assert (f > w);
67 assert ((maxhops >= MIN_HOP_LIMIT) && (maxhops <= MAX_HOP_LIMIT));
68 assert ((seed >= MIN_SEED) && (seed <= MAX_SEED));
69
70 assert ((n >= MIN_THREADS) && (n <= MAX_THREADS));
71 if ((thread = (struct threadS *)malloc(n*sizeof(struct threadS))) == NULL)
72 return (-1);
73
74 for (l=0; l<n; l++){
75 assert(fscanf(stdin, "%lu %lu %lu",
76 &(thread[l].initial), &(thread[l].minStop), &(thread[l].maxStop)) == 3);
77 assert ((thread[l].initial >= 0) && (thread[l].initial < f));
78 assert ((thread[l].minStop >= 0) && (thread[l].minStop < f));
79 assert ((thread[l].maxStop >= 0) && (thread[l].maxStop < f));
80 }
81
82 if ((field = (unsigned int *)malloc(f*sizeof(int))) == NULL)
83 return (-1);
84
85 randInit(seed);
86 for (l=0; l<f; l++){
87 field[l] = randInt(0, f-w);
88}
89startTime = time(NULL);
90clock();
91
92for (l=0; l<n; l++)
93{
94 START_LOOP
95 unsigned int index;
96 unsigned int minStop, maxStop;
97 unsigned int hops;
98
99 hops = 0;
100 minStop = thread[l].minStop;
101 maxStop = thread[l].maxStop;
102 index = thread[l].initial;
103 while ((hops < maxhops) &&
104 (!((index >= minStop) &&
105 (index < maxStop)))){
106
107 unsigned int ll, lll;
108 unsigned int max, min;
109 unsigned int partition;
110 unsigned int high;
111
112 partition = field[index];
113 max = MAX_FIELD_SIZE;
114 min = 0;
115 high = 0;
116
117 for (ll=0; ll<w; ll++){
118 unsigned int balance;
119 unsigned int x;
120 x = field[index+ll];
121
122 if (x > max) high++;
123 else if (x > min){ /* start else* */
124 partition = x;
125 balance = 0;
126 for (lll=ll+1; lll<w; lll++){
127 if (field[index+lll] > partition) balance++;
128 }/* end for loop */
129
130 if (balance+high == w/2) break;
131 else if (balance+high > w/2){
132 min = partition;
133 }/* end if */
134 else {
135 max = partition;
136 high++;
137 }/* end else */
138 }
139 if (min == max) break;
140 } /* end else* */
141 index = (partition+hops)%(f-w);
142 hops++;
143 }/* end loop ll */
144 thread[l].hops = hops;
145 STOP_LOOP
146} /* end while */
147
148 startTime = time(NULL) - startTime;
149
150 for (l=0; l<n; l++){
151 fprintf(stdout, "%lu hops on thread %d\n", thread[l].hops, l);
152 }
153
154 fprintf(stderr, "total time = %u seconds.\n", (unsigned int)startTime);
155 free (field);
156 free (thread);
157 WRITE_TO_FILE
158
159}