diff options
author | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-19 01:30:29 -0400 |
---|---|---|
committer | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-19 01:30:29 -0400 |
commit | 47ced4e96bbb782b9e780e8f2cfc637b2c21ff44 (patch) | |
tree | e0d2a0f28145ba21312c8d96442228d4b7219ff7 | |
parent | a71fc97fd262e1b5770f827047ea60bbaf38d9a2 (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.c | 78 | ||||
-rwxr-xr-x | dis/Matrix/ver2/matrix.c | 40 | ||||
-rw-r--r-- | dis/Neighborhood/neighborhood.c | 14 | ||||
-rw-r--r-- | dis/Pointer/pointer.c | 121 | ||||
-rw-r--r-- | dis/Transitive/transitive.c | 57 | ||||
-rw-r--r-- | dis/Update/update.c | 107 | ||||
-rwxr-xr-x | dis/gen_input.py | 2 | ||||
-rw-r--r-- | dis/inputs/Neighborhood/test1.in | 1 |
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 | |||