summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoshua Bakita <jbakita@cs.unc.edu>2020-10-19 01:30:29 -0400
committerJoshua Bakita <jbakita@cs.unc.edu>2020-10-19 01:30:29 -0400
commit47ced4e96bbb782b9e780e8f2cfc637b2c21ff44 (patch)
treee0d2a0f28145ba21312c8d96442228d4b7219ff7
parenta71fc97fd262e1b5770f827047ea60bbaf38d9a2 (diff)
Enable internal DIS job looping and port to new extra.h API
Changes to DIS code: - field, pointer, transitive, and update's random initialization steps moved the main job loop (so that they run on fresh state each job). - Moved free() calls outside of the job loop in matrix - Removed loose clock() call in pointer Misc fixes: - Added input file for neighborhood - Log status before, rather than after, printing in gen_input.py
-rw-r--r--dis/Field/field.c78
-rwxr-xr-xdis/Matrix/ver2/matrix.c40
-rw-r--r--dis/Neighborhood/neighborhood.c14
-rw-r--r--dis/Pointer/pointer.c121
-rw-r--r--dis/Transitive/transitive.c57
-rw-r--r--dis/Update/update.c107
-rwxr-xr-xdis/gen_input.py2
-rw-r--r--dis/inputs/Neighborhood/test1.in1
8 files changed, 211 insertions, 209 deletions
diff --git a/dis/Field/field.c b/dis/Field/field.c
index 248f779..900d47b 100644
--- a/dis/Field/field.c
+++ b/dis/Field/field.c
@@ -86,55 +86,55 @@ int main(int argc, char **argv) {
86 return (-1); 86 return (-1);
87 87
88 randInit(seed); 88 randInit(seed);
89 for (l = 0; l < f; l++) {
90 field[l] = randInt(MIN_TOKEN_VALUE, MAX_TOKEN_VALUE);
91 }
92 89
93 startTime = time(NULL); 90 for_each_job {
94 START_LOOP 91 for (l = 0; l < f; l++) {
92 field[l] = randInt(MIN_TOKEN_VALUE, MAX_TOKEN_VALUE);
93 }
95 94
96 for (l = 0; l < n; l++) { 95 startTime = time(NULL);
97 unsigned int index;
98 96
99 token[l].subfields = 0; 97 for (l = 0; l < n; l++) {
100 token[l].stat[0].count = 0; 98 unsigned int index;
101 token[l].stat[0].sum = 0;
102 token[l].stat[0].min = MAX_TOKEN_VALUE;
103 99
104 index = 0; 100 token[l].subfields = 0;
105 while ((index < f) && (token[l].subfields < MAX_SUBFIELDS)) { 101 token[l].stat[0].count = 0;
106 unsigned char offset; 102 token[l].stat[0].sum = 0;
107 offset = 0; 103 token[l].stat[0].min = MAX_TOKEN_VALUE;
108 while ((field[index + offset] == token[l].delimiter[offset]) &&
109 (offset < token[l].length)) {
110 offset++;
111 }
112 104
113 if (offset == token[l].length) { 105 index = 0;
114 for (offset = 0; offset < token[l].length; offset++) { 106 while ((index < f) && (token[l].subfields < MAX_SUBFIELDS)) {
115 field[index + offset] = (field[index + offset] + 107 unsigned char offset;
116 field[(index + offset + mod_offset) % f]) % 108 offset = 0;
117 (MAX_TOKEN_VALUE + 1); 109 while ((field[index + offset] == token[l].delimiter[offset]) &&
110 (offset < token[l].length)) {
111 offset++;
118 } 112 }
119 index += token[l].length - 1;
120 token[l].subfields++;
121 token[l].stat[token[l].subfields].count = 0;
122 token[l].stat[token[l].subfields].sum = 0;
123 token[l].stat[token[l].subfields].min = MAX_TOKEN_VALUE;
124 }
125 113
126 else { 114 if (offset == token[l].length) {
127 token[l].stat[token[l].subfields].count++; 115 for (offset = 0; offset < token[l].length; offset++) {
128 token[l].stat[token[l].subfields].sum += field[index]; 116 field[index + offset] = (field[index + offset] +
129 if (token[l].stat[token[l].subfields].min > field[index]) 117 field[(index + offset + mod_offset) % f]) %
130 token[l].stat[token[l].subfields].min = field[index]; 118 (MAX_TOKEN_VALUE + 1);
119 }
120 index += token[l].length - 1;
121 token[l].subfields++;
122 token[l].stat[token[l].subfields].count = 0;
123 token[l].stat[token[l].subfields].sum = 0;
124 token[l].stat[token[l].subfields].min = MAX_TOKEN_VALUE;
125 }
126
127 else {
128 token[l].stat[token[l].subfields].count++;
129 token[l].stat[token[l].subfields].sum += field[index];
130 if (token[l].stat[token[l].subfields].min > field[index])
131 token[l].stat[token[l].subfields].min = field[index];
132 }
133 index++;
131 } 134 }
132 index++; 135 token[l].subfields++;
133 } 136 }
134 token[l].subfields++;
135 } 137 }
136
137 STOP_LOOP
138 endTime = time(NULL); 138 endTime = time(NULL);
139 139
140 volatile int sumAll = 0; 140 volatile int sumAll = 0;
diff --git a/dis/Matrix/ver2/matrix.c b/dis/Matrix/ver2/matrix.c
index 2b075fb..5162579 100755
--- a/dis/Matrix/ver2/matrix.c
+++ b/dis/Matrix/ver2/matrix.c
@@ -407,13 +407,6 @@ void biConjugateGradient(double *value, int *col_ind, int *row_start,
407 *actualError = error; 407 *actualError = error;
408 *actualIteration = iteration; 408 *actualIteration = iteration;
409 409
410 free(tmpVector1);
411 free(tmpVector2);
412 free(tmpVector3);
413
414 free(vectorR);
415 free(vectorP);
416
417 return; 410 return;
418} 411}
419 412
@@ -525,27 +518,34 @@ int main(int argc, char **argv) {
525 518
526 randInit(seed); 519 randInit(seed);
527 520
528 START_LOOP 521 for_each_job {
529 initMatrix(matrixA, dim, numberNonzero); 522 initMatrix(matrixA, dim, numberNonzero);
530 523
531 create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); 524 create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero);
532 525
533 initVector(vectorB, dim); 526 initVector(vectorB, dim);
534 zeroVector(vectorX, dim); 527 zeroVector(vectorX, dim);
535 528
536 beginTime = time(NULL); 529 beginTime = time(NULL);
537 530
538 actualError = 0; 531 actualError = 0;
539 actualIteration = 0; 532 actualIteration = 0;
540 533
541 biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, 534 biConjugateGradient(value, col_ind, row_start, vectorB, vectorX,
542 errorTolerance, maxIterations, &actualError, 535 errorTolerance, maxIterations, &actualError,
543 &actualIteration, dim, vectorP, vectorR, nextVectorR, 536 &actualIteration, dim, vectorP, vectorR, nextVectorR,
544 tmpVector1, tmpVector2, tmpVector3); 537 tmpVector1, tmpVector2, tmpVector3);
545 538
546 STOP_LOOP 539 }
547 endTime = time(NULL); 540 endTime = time(NULL);
548 541
542 free(tmpVector1);
543 free(tmpVector2);
544 free(tmpVector3);
545
546 free(vectorR);
547 free(vectorP);
548
549 sum = 0; 549 sum = 0;
550 for (k = 1; k < dim; k++) { 550 for (k = 1; k < dim; k++) {
551 sum += sum + *(vectorX + k); 551 sum += sum + *(vectorX + k);
diff --git a/dis/Neighborhood/neighborhood.c b/dis/Neighborhood/neighborhood.c
index 614b8e8..2d401d3 100644
--- a/dis/Neighborhood/neighborhood.c
+++ b/dis/Neighborhood/neighborhood.c
@@ -63,14 +63,14 @@ int main(int argc, char **argv) {
63 image = malloc(sizeof(Pixel) * dimension * dimension); 63 image = malloc(sizeof(Pixel) * dimension * dimension);
64 assert(image != NULL); 64 assert(image != NULL);
65 65
66 beginTime = time(NULL); 66 for_each_job {
67 START_LOOP 67 beginTime = time(NULL);
68 createImage(image, dimension, maxPixel, numberLines, minThickness, 68 createImage(image, dimension, maxPixel, numberLines, minThickness,
69 maxThickness); 69 maxThickness);
70 70
71 neighborhoodCalculation(image, dimension, distanceShort, distanceLong, 71 neighborhoodCalculation(image, dimension, distanceShort, distanceLong,
72 &values, maxPixel); 72 &values, maxPixel);
73 STOP_LOOP 73 }
74 endTime = time(NULL); 74 endTime = time(NULL);
75 WRITE_TO_FILE 75 WRITE_TO_FILE
76 76
diff --git a/dis/Pointer/pointer.c b/dis/Pointer/pointer.c
index 3f3eefb..d97f276 100644
--- a/dis/Pointer/pointer.c
+++ b/dis/Pointer/pointer.c
@@ -82,68 +82,67 @@ int main(int argc, char **argv) {
82 return (-1); 82 return (-1);
83 83
84 randInit(seed); 84 randInit(seed);
85 for (l = 0; l < f; l++) { 85 for_each_job {
86 field[l] = randInt(0, f - w); 86 for (l = 0; l < f; l++) {
87 } 87 field[l] = randInt(0, f - w);
88 startTime = time(NULL); 88 }
89 clock(); 89 startTime = time(NULL);
90 90
91 START_LOOP 91 for (l = 0; l < n; l++) {
92 for (l = 0; l < n; l++) { 92 unsigned int index;
93 unsigned int index; 93 unsigned int minStop, maxStop;
94 unsigned int minStop, maxStop; 94 unsigned int hops;
95 unsigned int hops; 95
96 96 hops = 0;
97 hops = 0; 97 minStop = thread[l].minStop;
98 minStop = thread[l].minStop; 98 maxStop = thread[l].maxStop;
99 maxStop = thread[l].maxStop; 99 index = thread[l].initial;
100 index = thread[l].initial; 100 while ((hops < maxhops) && (!((index >= minStop) && (index < maxStop)))) {
101 while ((hops < maxhops) && (!((index >= minStop) && (index < maxStop)))) { 101
102 102 unsigned int ll, lll;
103 unsigned int ll, lll; 103 unsigned int max, min;
104 unsigned int max, min; 104 unsigned int partition;
105 unsigned int partition; 105 unsigned int high;
106 unsigned int high; 106
107 107 partition = field[index];
108 partition = field[index]; 108 max = MAX_FIELD_SIZE;
109 max = MAX_FIELD_SIZE; 109 min = 0;
110 min = 0; 110 high = 0;
111 high = 0; 111
112 112 for (ll = 0; ll < w; ll++) {
113 for (ll = 0; ll < w; ll++) { 113 unsigned int balance;
114 unsigned int balance; 114 unsigned int x;
115 unsigned int x; 115 x = field[index + ll];
116 x = field[index + ll]; 116
117 117 if (x > max)
118 if (x > max)
119 high++;
120 else if (x > min) { /* start else* */
121 partition = x;
122 balance = 0;
123 for (lll = ll + 1; lll < w; lll++) {
124 if (field[index + lll] > partition)
125 balance++;
126 } /* end for loop */
127
128 if (balance + high == w / 2)
129 break;
130 else if (balance + high > w / 2) {
131 min = partition;
132 } /* end if */
133 else {
134 max = partition;
135 high++; 118 high++;
136 } /* end else */ 119 else if (x > min) { /* start else* */
137 } 120 partition = x;
138 if (min == max) 121 balance = 0;
139 break; 122 for (lll = ll + 1; lll < w; lll++) {
140 } /* end else* */ 123 if (field[index + lll] > partition)
141 index = (partition + hops) % (f - w); 124 balance++;
142 hops++; 125 } /* end for loop */
143 } /* end loop ll */ 126
144 thread[l].hops = hops; 127 if (balance + high == w / 2)
145 } /* end while */ 128 break;
146 STOP_LOOP 129 else if (balance + high > w / 2) {
130 min = partition;
131 } /* end if */
132 else {
133 max = partition;
134 high++;
135 } /* end else */
136 }
137 if (min == max)
138 break;
139 } /* end else* */
140 index = (partition + hops) % (f - w);
141 hops++;
142 } /* end loop ll */
143 thread[l].hops = hops;
144 } /* end while */
145 }
147 146
148 endTime = time(NULL); 147 endTime = time(NULL);
149 148
diff --git a/dis/Transitive/transitive.c b/dis/Transitive/transitive.c
index 51805a6..9337aad 100644
--- a/dis/Transitive/transitive.c
+++ b/dis/Transitive/transitive.c
@@ -61,42 +61,43 @@ int main(int argc, char **argv) {
61 if ((dout = (unsigned int *)malloc(n * n * sizeof(unsigned int))) == NULL) 61 if ((dout = (unsigned int *)malloc(n * n * sizeof(unsigned int))) == NULL)
62 return (-1); 62 return (-1);
63 63
64 for (i = 0; i < n * n; i++) { 64 SET_UP
65 *(din + i) = NO_PATH;
66 *(dout + i) = NO_PATH;
67 }
68
69 randInit(seed); 65 randInit(seed);
70 for (k = 0; k < m; k++) {
71 i = randInt(0, n - 1);
72 j = randInt(0, n - 1);
73 *(din + j * n + i) = randInt(MIN_EDGES, MAX_EDGES);
74 }
75 66
76 SET_UP 67 for_each_job {
77 startTime = time(NULL); 68 for (i = 0; i < n * n; i++) {
69 *(din + i) = NO_PATH;
70 *(dout + i) = NO_PATH;
71 }
78 72
79 START_LOOP 73 for (k = 0; k < m; k++) {
80 for (k = 0; k < n; k++) { 74 i = randInt(0, n - 1);
81 unsigned int old; 75 j = randInt(0, n - 1);
82 unsigned int new1; 76 *(din + j * n + i) = randInt(MIN_EDGES, MAX_EDGES);
83 unsigned int *dtemp; 77 }
84 78
85 for (i = 0; i < n; i++) { 79 startTime = time(NULL);
86 for (j = 0; j < n; j++) { 80
87 old = *(din + j * n + i); 81 for (k = 0; k < n; k++) {
88 new1 = *(din + j * n + k) + *(din + k * n + i); 82 unsigned int old;
89 *(dout + j * n + i) = (new1 < old ? new1 : old); 83 unsigned int new1;
90 assert(*(dout + j * n + i) <= NO_PATH); 84 unsigned int *dtemp;
91 assert(*(dout + j * n + i) <= *(din + j * n + i)); 85
86 for (i = 0; i < n; i++) {
87 for (j = 0; j < n; j++) {
88 old = *(din + j * n + i);
89 new1 = *(din + j * n + k) + *(din + k * n + i);
90 *(dout + j * n + i) = (new1 < old ? new1 : old);
91 assert(*(dout + j * n + i) <= NO_PATH);
92 assert(*(dout + j * n + i) <= *(din + j * n + i));
93 }
92 } 94 }
95 dtemp = dout;
96 dout = din;
97 din = dtemp;
93 } 98 }
94 dtemp = dout;
95 dout = din;
96 din = dtemp;
97 } 99 }
98 100
99 STOP_LOOP
100 stopTime = time(NULL); 101 stopTime = time(NULL);
101 102
102 for (j = 0; j < n; j++) { 103 for (j = 0; j < n; j++) {
diff --git a/dis/Update/update.c b/dis/Update/update.c
index a12c3df..b7bf2b5 100644
--- a/dis/Update/update.c
+++ b/dis/Update/update.c
@@ -72,63 +72,64 @@ int main(int argc, char **argv) {
72 if ((field = (unsigned int *)malloc(f * sizeof(int))) == NULL) 72 if ((field = (unsigned int *)malloc(f * sizeof(int))) == NULL)
73 return (-1); 73 return (-1);
74 74
75 SET_UP
75 randInit(seed); 76 randInit(seed);
76 for (l = 0; l < f; l++) {
77 field[l] = randInt(0, f - w);
78 }
79 77
80 SET_UP 78 for_each_job {
81 startTime = time(NULL); 79 for (l = 0; l < f; l++) {
82 80 field[l] = randInt(0, f - w);
83 hops = 0; 81 }
84 index = initial; 82
85 83 startTime = time(NULL);
86 START_LOOP 84
87 while ((hops < maxhops) && (!((index >= minStop) && (index < maxStop)))) { 85 hops = 0;
88 int sum; 86 index = initial;
89 87
90 unsigned int ll, lll; 88 while ((hops < maxhops) && (!((index >= minStop) && (index < maxStop)))) {
91 unsigned int max, min; 89 int sum;
92 unsigned int partition; 90
93 unsigned int high; 91 unsigned int ll, lll;
94 max = MAX_FIELD_SIZE; 92 unsigned int max, min;
95 min = 0; 93 unsigned int partition;
96 high = 0; 94 unsigned int high;
97 sum = 0; 95 max = MAX_FIELD_SIZE;
98 96 min = 0;
99 for (ll = 0; ll < w; ll++) { 97 high = 0;
100 unsigned int balance; 98 sum = 0;
101 unsigned int x; 99
102 x = field[index + ll]; 100 for (ll = 0; ll < w; ll++) {
103 sum += x; 101 unsigned int balance;
104 102 unsigned int x;
105 if (x > max) 103 x = field[index + ll];
106 high++; 104 sum += x;
107 else if (x > min) { /* start else* */ 105
108 partition = x; 106 if (x > max)
109 balance = 0; 107 high++;
110 for (lll = ll + 1; lll < w; lll++) { 108 else if (x > min) { /* start else* */
111 if (field[index + lll] > partition) 109 partition = x;
112 balance++; 110 balance = 0;
111 for (lll = ll + 1; lll < w; lll++) {
112 if (field[index + lll] > partition)
113 balance++;
114 }
115 if (balance + high == w / 2)
116 break;
117 else if (balance + high > w / 2) {
118 min = partition;
119 } /* end if */
120 else {
121 max = partition;
122 high++;
123 } /* end else */
113 } 124 }
114 if (balance + high == w / 2) 125 if (min == max)
115 break; 126 break;
116 else if (balance + high > w / 2) { 127 } /* end else* */
117 min = partition; 128 field[index] = sum % (f - w);
118 } /* end if */ 129 index = (partition + hops) % (f - w);
119 else { 130 hops++;
120 max = partition; 131 } /* end for loop */
121 high++; 132 }
122 } /* end else */
123 }
124 if (min == max)
125 break;
126 } /* end else* */
127 field[index] = sum % (f - w);
128 index = (partition + hops) % (f - w);
129 hops++;
130 } /* end for loop */
131 STOP_LOOP
132 133
133 endTime = time(NULL); 134 endTime = time(NULL);
134 135
diff --git a/dis/gen_input.py b/dis/gen_input.py
index 67ee316..3698e88 100755
--- a/dis/gen_input.py
+++ b/dis/gen_input.py
@@ -106,8 +106,8 @@ with open(sys.argv[2], "r") as template:
106 # We expect the initialization params to all be on the first line 106 # We expect the initialization params to all be on the first line
107 params = template.readline().split() 107 params = template.readline().split()
108 mutated_params = BENCH_TO_PARAMS[benchmark_name](params, wss); 108 mutated_params = BENCH_TO_PARAMS[benchmark_name](params, wss);
109 print(" ".join(map(lambda x: str(x), mutated_params)))
110 print("Using", " ".join(map(lambda x: str(x), mutated_params)), "for", benchmark_name, "stressmark", file=sys.stderr) 109 print("Using", " ".join(map(lambda x: str(x), mutated_params)), "for", benchmark_name, "stressmark", file=sys.stderr)
110 print(" ".join(map(lambda x: str(x), mutated_params)))
111 if benchmark_name == "pointer": 111 if benchmark_name == "pointer":
112 # Clone the data format used in the template 112 # Clone the data format used in the template
113 for i in range(0,10): 113 for i in range(0,10):
diff --git a/dis/inputs/Neighborhood/test1.in b/dis/inputs/Neighborhood/test1.in
new file mode 100644
index 0000000..ef34bad
--- /dev/null
+++ b/dis/inputs/Neighborhood/test1.in
@@ -0,0 +1 @@
-12789 15 5000 3000 5 200 5 20