diff options
-rw-r--r-- | dis/Field/DISstressmarkRNG.h | 1 | ||||
-rw-r--r-- | dis/Field/field.c | 162 | ||||
-rwxr-xr-x | dis/Makefile | 2 | ||||
-rwxr-xr-x | dis/Matrix/ver2/DISstressmarkRNG.h | 1 | ||||
-rwxr-xr-x | dis/Matrix/ver2/matrix.c | 468 | ||||
-rw-r--r-- | dis/Neighborhood/DISstressmarkRNG.h | 1 | ||||
-rw-r--r-- | dis/Neighborhood/neighborhood.c | 77 | ||||
-rw-r--r-- | dis/Neighborhood/utili.h | 435 | ||||
-rw-r--r-- | dis/Pointer/DISstressmarkRNG.h | 1 | ||||
-rw-r--r-- | dis/Pointer/pointer.c | 225 | ||||
-rw-r--r-- | dis/Transitive/DISstressmarkRNG.h | 1 | ||||
-rw-r--r-- | dis/Transitive/transitive.c | 103 | ||||
-rw-r--r-- | dis/Update/DISstressmarkRNG.h | 1 | ||||
-rw-r--r-- | dis/Update/update.c | 98 |
14 files changed, 747 insertions, 829 deletions
diff --git a/dis/Field/DISstressmarkRNG.h b/dis/Field/DISstressmarkRNG.h index 4aa2620..6243606 100644 --- a/dis/Field/DISstressmarkRNG.h +++ b/dis/Field/DISstressmarkRNG.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <assert.h> | ||
1 | #include <math.h> | 2 | #include <math.h> |
2 | 3 | ||
3 | #define IA 16807 | 4 | #define IA 16807 |
diff --git a/dis/Field/field.c b/dis/Field/field.c index f83a403..248f779 100644 --- a/dis/Field/field.c +++ b/dis/Field/field.c | |||
@@ -1,28 +1,27 @@ | |||
1 | /* | 1 | /* |
2 | * Sample code for the DIS Field Stressmark | 2 | * Sample code for the DIS Field Stressmark |
3 | * | 3 | * |
4 | * This source code is the completely correct source code based on | 4 | * This source code is the completely correct source code based on |
5 | * the example codes provided by Atlantic Aerospace Division, Titan | 5 | * the example codes provided by Atlantic Aerospace Division, Titan |
6 | * Systems Corporation, 2000. | 6 | * Systems Corporation, 2000. |
7 | * | 7 | * |
8 | * If you just compile and generate the executables from this source | 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 | 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 | 10 | * understanding of this stressmark, it is strongly suggested that you |
11 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 11 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
12 | * before going on since the detailed comments are given in this documents. | 12 | * before going on since the detailed comments are given in this documents. |
13 | * the comments are not repeated here. | 13 | * the comments are not repeated here. |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <stdio.h> | ||
17 | #include <time.h> | ||
18 | #include <assert.h> | ||
19 | #include <stdlib.h> | ||
20 | #include "DISstressmarkRNG.h" | 16 | #include "DISstressmarkRNG.h" |
21 | #include "extra.h" | 17 | #include "extra.h" |
22 | 18 | #include <assert.h> | |
19 | #include <stdio.h> | ||
20 | #include <stdlib.h> | ||
21 | #include <time.h> | ||
23 | 22 | ||
24 | #define MIN_FIELD_SIZE 16 | 23 | #define MIN_FIELD_SIZE 16 |
25 | #define MAX_FIELD_SIZE (16777216*4) // This has been quadrupled from original | 24 | #define MAX_FIELD_SIZE (16777216 * 4) // This has been quadrupled from original |
26 | #define MIN_SEED -2147483647 | 25 | #define MIN_SEED -2147483647 |
27 | #define MAX_SEED -1 | 26 | #define MAX_SEED -1 |
28 | #define MIN_MOD_OFFSET 0 | 27 | #define MIN_MOD_OFFSET 0 |
@@ -39,7 +38,7 @@ | |||
39 | * main() | 38 | * main() |
40 | */ | 39 | */ |
41 | 40 | ||
42 | int main(int argc, char** argv){ | 41 | int main(int argc, char **argv) { |
43 | SET_UP | 42 | SET_UP |
44 | unsigned char *field; | 43 | unsigned char *field; |
45 | unsigned int f; | 44 | unsigned int f; |
@@ -48,17 +47,17 @@ int main(int argc, char** argv){ | |||
48 | unsigned int n; | 47 | unsigned int n; |
49 | 48 | ||
50 | time_t startTime, endTime; | 49 | time_t startTime, endTime; |
51 | 50 | ||
52 | struct tokenS{ | 51 | struct tokenS { |
53 | unsigned char delimiter[MAX_TOKEN_LENGTH]; | 52 | unsigned char delimiter[MAX_TOKEN_LENGTH]; |
54 | unsigned char length; | 53 | unsigned char length; |
55 | struct statisticS{ | 54 | struct statisticS { |
56 | unsigned int count; | 55 | unsigned int count; |
57 | unsigned char min; | 56 | unsigned char min; |
58 | unsigned char sum; | 57 | unsigned char sum; |
59 | }stat[MAX_SUBFIELDS]; | 58 | } stat[MAX_SUBFIELDS]; |
60 | unsigned char subfields; | 59 | unsigned char subfields; |
61 | }token[MAX_TOKENS]; | 60 | } token[MAX_TOKENS]; |
62 | 61 | ||
63 | unsigned int l; | 62 | unsigned int l; |
64 | 63 | ||
@@ -68,91 +67,92 @@ int main(int argc, char** argv){ | |||
68 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); | 67 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); |
69 | assert((mod_offset >= MIN_MOD_OFFSET) && (mod_offset <= MAX_MOD_OFFSET)); | 68 | assert((mod_offset >= MIN_MOD_OFFSET) && (mod_offset <= MAX_MOD_OFFSET)); |
70 | assert((n >= MIN_TOKENS) && (n <= MAX_TOKENS)); | 69 | assert((n >= MIN_TOKENS) && (n <= MAX_TOKENS)); |
71 | for (l=0; l<n; l++){ | 70 | for (l = 0; l < n; l++) { |
72 | int x; | 71 | int x; |
73 | int index; | 72 | int index; |
74 | index = 0; | 73 | index = 0; |
75 | assert(fscanf(stdin,"%x", &x) == 1); | 74 | assert(fscanf(stdin, "%x", &x) == 1); |
76 | while(x!=0){ | 75 | while (x != 0) { |
77 | assert((x >= MIN_TOKEN_VALUE) && (x <= MAX_TOKEN_VALUE)); | 76 | assert((x >= MIN_TOKEN_VALUE) && (x <= MAX_TOKEN_VALUE)); |
78 | token[l].delimiter[index] = (unsigned char )x; | 77 | token[l].delimiter[index] = (unsigned char)x; |
79 | index++; | 78 | index++; |
80 | assert(fscanf(stdin,"%x", &x) == 1); | 79 | assert(fscanf(stdin, "%x", &x) == 1); |
81 | } | ||
82 | assert((index >= MIN_TOKEN_LENGTH) && (index <= MAX_TOKEN_LENGTH)); | ||
83 | token[l].length = index; | ||
84 | } | 80 | } |
81 | assert((index >= MIN_TOKEN_LENGTH) && (index <= MAX_TOKEN_LENGTH)); | ||
82 | token[l].length = index; | ||
83 | } | ||
85 | 84 | ||
86 | if ((field = (unsigned char*)malloc(f*sizeof(unsigned char))) == NULL) | 85 | if ((field = (unsigned char *)malloc(f * sizeof(unsigned char))) == NULL) |
87 | return (-1); | 86 | return (-1); |
88 | 87 | ||
89 | randInit(seed); | 88 | randInit(seed); |
90 | for (l =0; l<f; l++){ | 89 | for (l = 0; l < f; l++) { |
91 | field[l] = randInt(MIN_TOKEN_VALUE, MAX_TOKEN_VALUE); | 90 | field[l] = randInt(MIN_TOKEN_VALUE, MAX_TOKEN_VALUE); |
92 | } | 91 | } |
93 | 92 | ||
94 | startTime = time(NULL); | 93 | startTime = time(NULL); |
95 | START_LOOP | 94 | START_LOOP |
96 | 95 | ||
97 | for (l =0; l<n; l++){ | 96 | for (l = 0; l < n; l++) { |
98 | unsigned int index; | 97 | unsigned int index; |
99 | 98 | ||
100 | token[l].subfields = 0; | 99 | token[l].subfields = 0; |
101 | token[l].stat[0].count = 0; | 100 | token[l].stat[0].count = 0; |
102 | token[l].stat[0].sum = 0; | 101 | token[l].stat[0].sum = 0; |
103 | token[l].stat[0].min = MAX_TOKEN_VALUE; | 102 | token[l].stat[0].min = MAX_TOKEN_VALUE; |
104 | 103 | ||
105 | index = 0; | 104 | index = 0; |
106 | while ((index < f) && (token[l].subfields < MAX_SUBFIELDS)){ | 105 | while ((index < f) && (token[l].subfields < MAX_SUBFIELDS)) { |
107 | unsigned char offset; | 106 | unsigned char offset; |
108 | offset = 0; | 107 | offset = 0; |
109 | while ((field[index+offset] == token[l].delimiter[offset]) && | 108 | while ((field[index + offset] == token[l].delimiter[offset]) && |
110 | (offset < token[l].length)){ | 109 | (offset < token[l].length)) { |
111 | offset++; | 110 | offset++; |
112 | } | 111 | } |
113 | 112 | ||
114 | if (offset == token[l].length){ | 113 | if (offset == token[l].length) { |
115 | for (offset=0; offset<token[l].length; offset++){ | 114 | for (offset = 0; offset < token[l].length; offset++) { |
116 | field[index+offset] = (field[index+offset] + | 115 | field[index + offset] = (field[index + offset] + |
117 | field[(index+offset+mod_offset) % f]) | 116 | field[(index + offset + mod_offset) % f]) % |
118 | %(MAX_TOKEN_VALUE+1); | 117 | (MAX_TOKEN_VALUE + 1); |
119 | } | 118 | } |
120 | index += token[l].length-1; | 119 | index += token[l].length - 1; |
121 | token[l].subfields++; | 120 | token[l].subfields++; |
122 | token[l].stat[token[l].subfields].count = 0; | 121 | token[l].stat[token[l].subfields].count = 0; |
123 | token[l].stat[token[l].subfields].sum = 0; | 122 | token[l].stat[token[l].subfields].sum = 0; |
124 | token[l].stat[token[l].subfields].min = MAX_TOKEN_VALUE; | 123 | token[l].stat[token[l].subfields].min = MAX_TOKEN_VALUE; |
125 | } | 124 | } |
126 | 125 | ||
127 | else{ | 126 | else { |
128 | token[l].stat[token[l].subfields].count++; | 127 | token[l].stat[token[l].subfields].count++; |
129 | token[l].stat[token[l].subfields].sum += field[index]; | 128 | token[l].stat[token[l].subfields].sum += field[index]; |
130 | if (token[l].stat[token[l].subfields].min > field[index]) | 129 | if (token[l].stat[token[l].subfields].min > field[index]) |
131 | token[l].stat[token[l].subfields].min = field[index]; | 130 | token[l].stat[token[l].subfields].min = field[index]; |
132 | } | 131 | } |
133 | index++; | 132 | index++; |
134 | } | 133 | } |
135 | token[l].subfields++; | 134 | token[l].subfields++; |
136 | } | 135 | } |
137 | 136 | ||
138 | STOP_LOOP | 137 | STOP_LOOP |
139 | endTime = time(NULL); | 138 | endTime = time(NULL); |
140 | 139 | ||
141 | volatile int sumAll = 0; | 140 | volatile int sumAll = 0; |
142 | for (l = 0; l< n; l++){ | 141 | for (l = 0; l < n; l++) { |
143 | unsigned int ll; | 142 | unsigned int ll; |
144 | //fprintf(stdout, "%d subfields for token %d \n", token[l].subfields, l); | 143 | // fprintf(stdout, "%d subfields for token %d \n", token[l].subfields, l); |
145 | sumAll += token[l].subfields + l; | 144 | sumAll += token[l].subfields + l; |
146 | for ( ll =0; ll<token[l].subfields; ll++) { | 145 | for (ll = 0; ll < token[l].subfields; ll++) { |
147 | sumAll += ll + token[l].stat[ll].count + token[l].stat[ll].min + token[l].stat[ll].sum; | 146 | sumAll += ll + token[l].stat[ll].count + token[l].stat[ll].min + |
148 | /*fprintf(stdout, "subfields %d:\tcount = %d\tmin= %x\tsum= %x\n", | 147 | token[l].stat[ll].sum; |
149 | ll, token[l].stat[ll].count, | 148 | /*fprintf(stdout, "subfields %d:\tcount = %d\tmin= %x\tsum= %x\n", |
150 | token[l].stat[ll].min, token[l].stat[ll].sum);*/ | 149 | ll, token[l].stat[ll].count, |
151 | } | 150 | token[l].stat[ll].min, token[l].stat[ll].sum);*/ |
152 | } | 151 | } |
153 | fprintf(stderr, "time for field stressmark = %f seconds.\n", | ||
154 | difftime(endTime, startTime)); | ||
155 | free(field); | ||
156 | WRITE_TO_FILE | ||
157 | return(0); | ||
158 | } | 152 | } |
153 | fprintf(stderr, "time for field stressmark = %f seconds.\n", | ||
154 | difftime(endTime, startTime)); | ||
155 | free(field); | ||
156 | WRITE_TO_FILE | ||
157 | return (0); | ||
158 | } | ||
diff --git a/dis/Makefile b/dis/Makefile index 957a39a..2c1ff89 100755 --- a/dis/Makefile +++ b/dis/Makefile | |||
@@ -25,7 +25,7 @@ ifneq ($(shell grep "define LITMUS 1" ../baseline/source/extra.h),) | |||
25 | LDFLAGS += -L${LIBLITMUS} -llitmus | 25 | LDFLAGS += -L${LIBLITMUS} -llitmus |
26 | endif | 26 | endif |
27 | 27 | ||
28 | all: | 28 | all: baseline |
29 | baseline: field matrix neighborhood pointer transitive update random_walk | 29 | baseline: field matrix neighborhood pointer transitive update random_walk |
30 | pairs: field_all matrix_all neighborhood_all pointer_all transitive_all update_all | 30 | pairs: field_all matrix_all neighborhood_all pointer_all transitive_all update_all |
31 | 31 | ||
diff --git a/dis/Matrix/ver2/DISstressmarkRNG.h b/dis/Matrix/ver2/DISstressmarkRNG.h index 4aa2620..6243606 100755 --- a/dis/Matrix/ver2/DISstressmarkRNG.h +++ b/dis/Matrix/ver2/DISstressmarkRNG.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <assert.h> | ||
1 | #include <math.h> | 2 | #include <math.h> |
2 | 3 | ||
3 | #define IA 16807 | 4 | #define IA 16807 |
diff --git a/dis/Matrix/ver2/matrix.c b/dis/Matrix/ver2/matrix.c index ffa7cb7..2b075fb 100755 --- a/dis/Matrix/ver2/matrix.c +++ b/dis/Matrix/ver2/matrix.c | |||
@@ -1,17 +1,17 @@ | |||
1 | /* Please note: | 1 | /* Please note: |
2 | * This code is the optimized version of the first version of Matrix | 2 | * This code is the optimized version of the first version of Matrix |
3 | * Stressmark. It uses less temporary vectors and vsariables, thus reduce | 3 | * Stressmark. It uses less temporary vectors and vsariables, thus reduce |
4 | * memory allocation/deallocation overhead. the simulation is faster | 4 | * memory allocation/deallocation overhead. the simulation is faster |
5 | */ | 5 | */ |
6 | /* | 6 | /* |
7 | * Sample code for the DIS Matrix Stressmark | 7 | * Sample code for the DIS Matrix Stressmark |
8 | * | 8 | * |
9 | * This source code is the completely correct source code based on | 9 | * This source code is the completely correct source code based on |
10 | * the example codes provided by Atlantic Aerospace Division, Titan | 10 | * the example codes provided by Atlantic Aerospace Division, Titan |
11 | * Systems Corporation, 2000. | 11 | * Systems Corporation, 2000. |
12 | * | 12 | * |
13 | * If you just compile and generate the executables from this source | 13 | * If you just compile and generate the executables from this source |
14 | * code, this code would be enough. However, if you wish to get a complete | 14 | * code, this code would be enough. However, if you wish to get a complete |
15 | * understanding of this stressmark, it is strongly suggested that you | 15 | * understanding of this stressmark, it is strongly suggested that you |
16 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 16 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
17 | * before going on since the detailed comments are given in this documents. | 17 | * before going on since the detailed comments are given in this documents. |
@@ -22,37 +22,37 @@ | |||
22 | * The Sparse Matrix Storage is implemented by Compact Row Storage Scheme | 22 | * The Sparse Matrix Storage is implemented by Compact Row Storage Scheme |
23 | * In the code, the data is first generated by randomNonzeroFloat() | 23 | * In the code, the data is first generated by randomNonzeroFloat() |
24 | * the data is first stored in a full-space matrix with size of dim*dim | 24 | * the data is first stored in a full-space matrix with size of dim*dim |
25 | * then the data is transfered to the Compact Row Matrix, | 25 | * then the data is transfered to the Compact Row Matrix, |
26 | * the data value is kept in *value, | 26 | * the data value is kept in *value, |
27 | * the columns corresponding to the value are stored in *col_ind, | 27 | * the columns corresponding to the value are stored in *col_ind, |
28 | * the start element of each row is stored in *row_start. | 28 | * the start element of each row is stored in *row_start. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | /* | 31 | /* |
32 | * Please note: | 32 | * Please note: |
33 | * the total number of data is numberNonzero +dim | 33 | * the total number of data is numberNonzero +dim |
34 | * among which, NumberNonzero because this is symmetric matrix | 34 | * among which, NumberNonzero because this is symmetric matrix |
35 | * dim because the diagonal elements | 35 | * dim because the diagonal elements |
36 | */ | 36 | */ |
37 | 37 | ||
38 | #include <stdio.h> | 38 | #include "DISstressmarkRNG.h" |
39 | #include "extra.h" | ||
40 | #include <assert.h> | ||
39 | #include <math.h> | 41 | #include <math.h> |
42 | #include <stdio.h> | ||
40 | #include <stdlib.h> | 43 | #include <stdlib.h> |
41 | #include <time.h> | 44 | #include <time.h> |
42 | #include <assert.h> | ||
43 | #include "DISstressmarkRNG.h" | ||
44 | #include "extra.h" | ||
45 | 45 | ||
46 | #define MIN_SEED -2147483647 | 46 | #define MIN_SEED -2147483647 |
47 | #define MAX_SEED -1 | 47 | #define MAX_SEED -1 |
48 | #define MIN_DIM 1 | 48 | #define MIN_DIM 1 |
49 | #define MAX_DIM 32768 | 49 | #define MAX_DIM 32768 |
50 | #define MAX_ITERATIONS 65536 | 50 | #define MAX_ITERATIONS 65536 |
51 | #define MIN_TOLERANCE 1e-7//0.000007 | 51 | #define MIN_TOLERANCE 1e-7 // 0.000007 |
52 | #define MAX_TOLERANCE 0.5 | 52 | #define MAX_TOLERANCE 0.5 |
53 | #define MIN_NUMBER -3.4e10/dim | 53 | #define MIN_NUMBER -3.4e10 / dim |
54 | #define MAX_NUMBER 3.4e10/dim | 54 | #define MAX_NUMBER 3.4e10 / dim |
55 | #define EPSI 1.0e-10 | 55 | #define EPSI 1.0e-10 |
56 | #define MIN_DIG_NUMBER 1.0e-10 | 56 | #define MIN_DIG_NUMBER 1.0e-10 |
57 | #define MAX_DIG_NUMBER 3.4e10 | 57 | #define MAX_DIG_NUMBER 3.4e10 |
58 | 58 | ||
@@ -62,97 +62,90 @@ | |||
62 | 62 | ||
63 | static int dim; | 63 | static int dim; |
64 | 64 | ||
65 | /* | 65 | /* |
66 | * matrix * vector | 66 | * matrix * vector |
67 | */ | 67 | */ |
68 | 68 | ||
69 | void matrixMulvector(double *value, | 69 | void matrixMulvector(double *value, int *col_ind, int *row_start, |
70 | int *col_ind, | 70 | double *vector, double *out) { |
71 | int *row_start, | ||
72 | double *vector, | ||
73 | double *out) | ||
74 | { | ||
75 | int l, ll; | 71 | int l, ll; |
76 | double sum; | 72 | double sum; |
77 | int tmp_rs, tmp_re; | 73 | int tmp_rs, tmp_re; |
78 | 74 | ||
79 | for (l=0; l<dim; l++){ | 75 | for (l = 0; l < dim; l++) { |
80 | *(out + l) = 0; | 76 | *(out + l) = 0; |
81 | tmp_rs = row_start[l]; | 77 | tmp_rs = row_start[l]; |
82 | 78 | ||
83 | if (tmp_rs != -1){ | 79 | if (tmp_rs != -1) { |
84 | tmp_re = row_start[l+1]; /* | 80 | tmp_re = row_start[l + 1]; /* |
85 | *get the start and ending elements of | 81 | *get the start and ending elements of |
86 | * each row | 82 | * each row |
87 | */ | 83 | */ |
88 | for (ll=tmp_rs; ll<tmp_re; ll++){ | 84 | for (ll = tmp_rs; ll < tmp_re; ll++) { |
89 | *(out + l) += value[ll]*vector[col_ind[ll]]; | 85 | *(out + l) += value[ll] * vector[col_ind[ll]]; |
90 | } | 86 | } |
91 | } | 87 | } |
92 | } | 88 | } |
93 | return; | 89 | return; |
94 | } | 90 | } |
95 | 91 | ||
96 | |||
97 | /* | 92 | /* |
98 | * vector1 - vector2 | 93 | * vector1 - vector2 |
99 | */ | 94 | */ |
100 | 95 | ||
101 | void vectorSub(double *vector1, double *vector2, double *vector){ | 96 | void vectorSub(double *vector1, double *vector2, double *vector) { |
102 | 97 | ||
103 | int l; | 98 | int l; |
104 | 99 | ||
105 | for (l=0; l<dim; l++){ | 100 | for (l = 0; l < dim; l++) { |
106 | *(vector + l) = *(vector1 + l) - *(vector2 + l); | 101 | *(vector + l) = *(vector1 + l) - *(vector2 + l); |
107 | } | 102 | } |
108 | return; | 103 | return; |
109 | } | 104 | } |
110 | 105 | ||
111 | |||
112 | /* | 106 | /* |
113 | * vector1 + vector2 | 107 | * vector1 + vector2 |
114 | */ | 108 | */ |
115 | 109 | ||
116 | void vectorAdd(double *vector1, double *vector2, double *vector){ | 110 | void vectorAdd(double *vector1, double *vector2, double *vector) { |
117 | 111 | ||
118 | int l; | 112 | int l; |
119 | 113 | ||
120 | for (l=0; l<dim; l++){ | 114 | for (l = 0; l < dim; l++) { |
121 | *(vector + l) = *(vector1 + l) + *(vector2 + l); | 115 | *(vector + l) = *(vector1 + l) + *(vector2 + l); |
122 | } | 116 | } |
123 | return; | 117 | return; |
124 | } | 118 | } |
125 | 119 | ||
126 | /* | 120 | /* |
127 | * vector1 * vector2 | 121 | * vector1 * vector2 |
128 | */ | 122 | */ |
129 | 123 | ||
130 | double vectorMul(double *vector1, double *vector2){ | 124 | double vectorMul(double *vector1, double *vector2) { |
131 | 125 | ||
132 | int l; | 126 | int l; |
133 | double product; | 127 | double product; |
134 | 128 | ||
135 | product = 0; | 129 | product = 0; |
136 | 130 | ||
137 | for (l=0; l<dim; l++){ | 131 | for (l = 0; l < dim; l++) { |
138 | product += (*(vector1 + l))*(*(vector2 + l)); | 132 | product += (*(vector1 + l)) * (*(vector2 + l)); |
139 | |||
140 | } | 133 | } |
141 | return product; | 134 | return product; |
142 | } | 135 | } |
143 | 136 | ||
144 | /* | 137 | /* |
145 | * /vector/ | 138 | * /vector/ |
146 | */ | 139 | */ |
147 | 140 | ||
148 | double vectorValue(double *vector){ | 141 | double vectorValue(double *vector) { |
149 | 142 | ||
150 | double value; | 143 | double value; |
151 | int l; | 144 | int l; |
152 | 145 | ||
153 | value = 0; | 146 | value = 0; |
154 | 147 | ||
155 | for (l=0; l<dim; l++){ | 148 | for (l = 0; l < dim; l++) { |
156 | value += (*(vector + l)) * (*(vector + l)); | 149 | value += (*(vector + l)) * (*(vector + l)); |
157 | } | 150 | } |
158 | 151 | ||
@@ -164,94 +157,89 @@ double vectorValue(double *vector){ | |||
164 | * In fact, we return the original vector here | 157 | * In fact, we return the original vector here |
165 | */ | 158 | */ |
166 | 159 | ||
167 | void transpose(double *vector, double *vect){ | 160 | void transpose(double *vector, double *vect) { |
168 | 161 | ||
169 | int l; | 162 | int l; |
170 | 163 | ||
171 | for (l=0; l<dim; l++){ | 164 | for (l = 0; l < dim; l++) { |
172 | *(vect+l) = *(vector+l); | 165 | *(vect + l) = *(vector + l); |
173 | } | 166 | } |
174 | return; | 167 | return; |
175 | } | 168 | } |
176 | 169 | ||
177 | /* | 170 | /* |
178 | * value * <vector> | 171 | * value * <vector> |
179 | */ | 172 | */ |
180 | void valueMulvector(double value, double *vector, double *vect){ | 173 | void valueMulvector(double value, double *vector, double *vect) { |
181 | 174 | ||
182 | int l; | 175 | int l; |
183 | int lll, i; | 176 | int lll, i; |
184 | double tmp; | 177 | double tmp; |
185 | 178 | ||
186 | for (l=0; l<dim; l++){ | 179 | for (l = 0; l < dim; l++) { |
187 | *(vect + l) = *(vector + l) * value; | 180 | *(vect + l) = *(vector + l) * value; |
188 | } | 181 | } |
189 | return; | 182 | return; |
190 | } | 183 | } |
191 | 184 | ||
192 | /* | 185 | /* |
193 | * generate the data distributed sparsely in matrix | 186 | * generate the data distributed sparsely in matrix |
194 | */ | 187 | */ |
195 | 188 | ||
196 | void initMatrix(double *matrix, int dim, int numberNonzero){ | 189 | void initMatrix(double *matrix, int dim, int numberNonzero) { |
197 | 190 | ||
198 | int k, l, ll; | 191 | int k, l, ll; |
199 | int i, j; | 192 | int i, j; |
200 | 193 | ||
201 | int lll; | 194 | int lll; |
202 | double sum; | 195 | double sum; |
203 | 196 | ||
204 | for (k=0; k< dim*dim; k++){ | 197 | for (k = 0; k < dim * dim; k++) { |
205 | *(matrix + k) = 0; | 198 | *(matrix + k) = 0; |
206 | } | 199 | } |
207 | 200 | ||
208 | for (l=0; l<numberNonzero/2; l++){ | 201 | for (l = 0; l < numberNonzero / 2; l++) { |
209 | 202 | ||
210 | i = randomUInt(1, dim-1); | 203 | i = randomUInt(1, dim - 1); |
211 | j = randomUInt(0, i-1); | 204 | j = randomUInt(0, i - 1); |
212 | 205 | ||
213 | while (*(matrix + i*dim + j) != 0){ | 206 | while (*(matrix + i * dim + j) != 0) { |
214 | 207 | ||
215 | i++; | 208 | i++; |
216 | if (i == dim){ | 209 | if (i == dim) { |
217 | j++; | 210 | j++; |
218 | if (j == dim-1){ | 211 | if (j == dim - 1) { |
219 | j = 0; | 212 | j = 0; |
220 | i = 1; | 213 | i = 1; |
221 | } | 214 | } else { |
222 | else{ | 215 | i = j + 1; |
223 | i = j+1; | 216 | } |
224 | } | 217 | } |
225 | } | ||
226 | } | 218 | } |
227 | 219 | ||
228 | if (*(matrix + i*dim + j) == 0){ | 220 | if (*(matrix + i * dim + j) == 0) { |
229 | *(matrix + i*dim + j) = (double )randomNonZeroFloat(MIN_NUMBER, | 221 | *(matrix + i * dim + j) = |
230 | MAX_NUMBER, | 222 | (double)randomNonZeroFloat(MIN_NUMBER, MAX_NUMBER, EPSI); |
231 | EPSI); | 223 | *(matrix + j * dim + i) = *(matrix + i * dim + j); |
232 | *(matrix + j*dim + i) = *(matrix + i*dim + j); | ||
233 | } | 224 | } |
234 | } | 225 | } |
235 | |||
236 | for (ll=0; ll<dim; ll++){ | ||
237 | 226 | ||
227 | for (ll = 0; ll < dim; ll++) { | ||
228 | |||
229 | *(matrix + ll * dim + ll) = (double)randomNonZeroFloat( | ||
230 | -MAX_DIG_NUMBER, MAX_DIG_NUMBER, MIN_DIG_NUMBER); | ||
238 | 231 | ||
239 | |||
240 | *(matrix + ll*dim + ll) = (double )randomNonZeroFloat(-MAX_DIG_NUMBER, | ||
241 | MAX_DIG_NUMBER, | ||
242 | MIN_DIG_NUMBER); | ||
243 | |||
244 | sum = 0; | 232 | sum = 0; |
245 | 233 | ||
246 | for (lll=0; lll<dim; lll++){ | 234 | for (lll = 0; lll < dim; lll++) { |
247 | if (lll != ll){ | 235 | if (lll != ll) { |
248 | sum += *(matrix + lll*dim + ll); | 236 | sum += *(matrix + lll * dim + ll); |
249 | } | 237 | } |
250 | } | 238 | } |
251 | 239 | ||
252 | if (*(matrix + ll*dim + ll) < sum ){ | 240 | if (*(matrix + ll * dim + ll) < sum) { |
253 | *(matrix + ll*dim + ll) += sum; | 241 | *(matrix + ll * dim + ll) += sum; |
254 | } | 242 | } |
255 | } | 243 | } |
256 | 244 | ||
257 | return; | 245 | return; |
@@ -260,13 +248,13 @@ void initMatrix(double *matrix, int dim, int numberNonzero){ | |||
260 | /* | 248 | /* |
261 | * generate the data value in the vectors | 249 | * generate the data value in the vectors |
262 | */ | 250 | */ |
263 | 251 | ||
264 | void initVector(double *vector, int dim){ | 252 | void initVector(double *vector, int dim) { |
265 | 253 | ||
266 | int l; | 254 | int l; |
267 | 255 | ||
268 | for (l=0; l<dim; l++){ | 256 | for (l = 0; l < dim; l++) { |
269 | *(vector + l) = (double )randomFloat (MIN_NUMBER, MAX_NUMBER); | 257 | *(vector + l) = (double)randomFloat(MIN_NUMBER, MAX_NUMBER); |
270 | } | 258 | } |
271 | 259 | ||
272 | return; | 260 | return; |
@@ -276,10 +264,10 @@ void initVector(double *vector, int dim){ | |||
276 | * make a vector contains value of zero | 264 | * make a vector contains value of zero |
277 | */ | 265 | */ |
278 | 266 | ||
279 | void zeroVector(double *vector, int dim){ | 267 | void zeroVector(double *vector, int dim) { |
280 | int l; | 268 | int l; |
281 | 269 | ||
282 | for (l=0; l<dim; l++){ | 270 | for (l = 0; l < dim; l++) { |
283 | *(vector + l) = 0; | 271 | *(vector + l) = 0; |
284 | } | 272 | } |
285 | return; | 273 | return; |
@@ -289,48 +277,37 @@ void zeroVector(double *vector, int dim){ | |||
289 | * return a vector which is the copy of the vect | 277 | * return a vector which is the copy of the vect |
290 | */ | 278 | */ |
291 | 279 | ||
292 | void equalVector(double *vect, double *vect1){ | 280 | void equalVector(double *vect, double *vect1) { |
293 | 281 | ||
294 | int l; | 282 | int l; |
295 | 283 | ||
296 | for (l=0; l<dim; l++){ | 284 | for (l = 0; l < dim; l++) { |
297 | *(vect1+l) = *(vect+l); | 285 | *(vect1 + l) = *(vect + l); |
298 | } | 286 | } |
299 | return; | 287 | return; |
300 | } | 288 | } |
301 | 289 | ||
302 | 290 | void biConjugateGradient(double *value, int *col_ind, int *row_start, | |
303 | 291 | double *vectorB, double *vectorX, | |
304 | void biConjugateGradient(double *value, | 292 | double errorTolerance, int maxIterations, |
305 | int *col_ind, | 293 | double *actualError, int *actualIteration, int dim, |
306 | int *row_start, | 294 | // Start internal matrixes |
307 | double *vectorB, | 295 | double *vectorP, double *vectorR, double *nextVectorR, |
308 | double *vectorX, | 296 | double *tmpVector1, double *tmpVector2, |
309 | double errorTolerance, | 297 | double *tmpVector3) |
310 | int maxIterations, | 298 | /* |
311 | double *actualError, | 299 | * in the code, we use a lot of temparary vectors and variables |
312 | int *actualIteration, | 300 | * this is just for simple and clear |
313 | int dim, | 301 | * you can optimize these temporary variables and vectors |
314 | // Start internal matrixes | 302 | * based on your need |
315 | double *vectorP, | 303 | * |
316 | double *vectorR, | 304 | */ |
317 | double *nextVectorR, | ||
318 | double *tmpVector1, | ||
319 | double *tmpVector2, | ||
320 | double *tmpVector3) | ||
321 | /* | ||
322 | * in the code, we use a lot of temparary vectors and variables | ||
323 | * this is just for simple and clear | ||
324 | * you can optimize these temporary variables and vectors | ||
325 | * based on your need | ||
326 | * | ||
327 | */ | ||
328 | { | 305 | { |
329 | double error; | 306 | double error; |
330 | int iteration; | 307 | int iteration; |
331 | double alpha, beta; | 308 | double alpha, beta; |
332 | 309 | ||
333 | double tmpValue1, tmpValue2; | 310 | double tmpValue1, tmpValue2; |
334 | int i; | 311 | int i; |
335 | int l; | 312 | int l; |
336 | int ll; | 313 | int ll; |
@@ -341,7 +318,7 @@ void biConjugateGradient(double *value, | |||
341 | /* | 318 | /* |
342 | * vectorR = vectorB - matrixA*vectorX | 319 | * vectorR = vectorB - matrixA*vectorX |
343 | */ | 320 | */ |
344 | matrixMulvector(value,col_ind, row_start, vectorX, tmpVector1); | 321 | matrixMulvector(value, col_ind, row_start, vectorX, tmpVector1); |
345 | 322 | ||
346 | vectorSub(vectorB, tmpVector1, vectorR); | 323 | vectorSub(vectorB, tmpVector1, vectorR); |
347 | 324 | ||
@@ -354,35 +331,35 @@ void biConjugateGradient(double *value, | |||
354 | /* | 331 | /* |
355 | * error = |matrixA * vectorX - vectorB| / |vectorB| | 332 | * error = |matrixA * vectorX - vectorB| / |vectorB| |
356 | */ | 333 | */ |
357 | vectorSub(tmpVector1, vectorB, tmpVector1); | 334 | vectorSub(tmpVector1, vectorB, tmpVector1); |
358 | 335 | ||
359 | error = vectorValue(tmpVector1)/vectorValue(vectorB); | 336 | error = vectorValue(tmpVector1) / vectorValue(vectorB); |
360 | 337 | ||
361 | iteration = 0; | 338 | iteration = 0; |
362 | 339 | ||
363 | while ((iteration < maxIterations) && (error > errorTolerance)){ | 340 | while ((iteration < maxIterations) && (error > errorTolerance)) { |
364 | 341 | ||
365 | /* | 342 | /* |
366 | * alpha = (transpose(vectorR) * vectorR) / | 343 | * alpha = (transpose(vectorR) * vectorR) / |
367 | * (transpose(vectorP) * (matrixA * vectorP) | 344 | * (transpose(vectorP) * (matrixA * vectorP) |
368 | */ | 345 | */ |
369 | 346 | ||
370 | matrixMulvector(value, col_ind, row_start, vectorP, tmpVector1); | 347 | matrixMulvector(value, col_ind, row_start, vectorP, tmpVector1); |
371 | transpose(vectorR, tmpVector2); | 348 | transpose(vectorR, tmpVector2); |
372 | transpose(vectorP, tmpVector3); | 349 | transpose(vectorP, tmpVector3); |
373 | tmpValue1 = vectorMul(tmpVector3, tmpVector1); | 350 | tmpValue1 = vectorMul(tmpVector3, tmpVector1); |
374 | tmpValue2 = vectorMul(tmpVector2, vectorR); | 351 | tmpValue2 = vectorMul(tmpVector2, vectorR); |
375 | alpha = tmpValue2/tmpValue1; | 352 | alpha = tmpValue2 / tmpValue1; |
376 | 353 | ||
377 | /* | 354 | /* |
378 | * nextVectorR = vectorR - alpha*(matrixA * vectorP) | 355 | * nextVectorR = vectorR - alpha*(matrixA * vectorP) |
379 | */ | 356 | */ |
380 | 357 | ||
381 | valueMulvector(alpha, tmpVector1, tmpVector2); | 358 | valueMulvector(alpha, tmpVector1, tmpVector2); |
382 | vectorSub(vectorR, tmpVector2, tmpVector1); | 359 | vectorSub(vectorR, tmpVector2, tmpVector1); |
383 | equalVector(tmpVector1, nextVectorR); | 360 | equalVector(tmpVector1, nextVectorR); |
384 | 361 | ||
385 | /* | 362 | /* |
386 | * beta = (transpose(nextVectorR) * nextVectorR) / | 363 | * beta = (transpose(nextVectorR) * nextVectorR) / |
387 | * (transpose(vectorR) * vectorR) | 364 | * (transpose(vectorR) * vectorR) |
388 | */ | 365 | */ |
@@ -391,38 +368,38 @@ void biConjugateGradient(double *value, | |||
391 | tmpValue1 = vectorMul(tmpVector3, nextVectorR); | 368 | tmpValue1 = vectorMul(tmpVector3, nextVectorR); |
392 | transpose(vectorR, tmpVector2); | 369 | transpose(vectorR, tmpVector2); |
393 | tmpValue2 = vectorMul(tmpVector2, vectorR); | 370 | tmpValue2 = vectorMul(tmpVector2, vectorR); |
394 | beta = tmpValue1/tmpValue2; | 371 | beta = tmpValue1 / tmpValue2; |
395 | 372 | ||
396 | /* | 373 | /* |
397 | * vectorX = vectorX + alpha * vectorP | 374 | * vectorX = vectorX + alpha * vectorP |
398 | */ | 375 | */ |
399 | valueMulvector(alpha, vectorP, tmpVector1); | 376 | valueMulvector(alpha, vectorP, tmpVector1); |
400 | vectorAdd(vectorX,tmpVector1, vectorX); | 377 | vectorAdd(vectorX, tmpVector1, vectorX); |
401 | 378 | ||
402 | /* | 379 | /* |
403 | *vectorP = nextVectorR + beta*vectorP | 380 | *vectorP = nextVectorR + beta*vectorP |
404 | */ | 381 | */ |
405 | valueMulvector(beta, vectorP, tmpVector1); | 382 | valueMulvector(beta, vectorP, tmpVector1); |
406 | vectorAdd(nextVectorR, tmpVector1, tmpVector1); | 383 | vectorAdd(nextVectorR, tmpVector1, tmpVector1); |
407 | 384 | ||
408 | for (ll=0; ll<dim; ll++){ | 385 | for (ll = 0; ll < dim; ll++) { |
409 | *(vectorP + ll) = *(tmpVector1 + ll); | 386 | *(vectorP + ll) = *(tmpVector1 + ll); |
410 | } | 387 | } |
411 | 388 | ||
412 | /* | 389 | /* |
413 | * vectorR = nextVectorR | 390 | * vectorR = nextVectorR |
414 | */ | 391 | */ |
415 | 392 | ||
416 | for (l=0; l<dim; l++){ | 393 | for (l = 0; l < dim; l++) { |
417 | *(vectorR+l) = *(nextVectorR+l); | 394 | *(vectorR + l) = *(nextVectorR + l); |
418 | } | 395 | } |
419 | 396 | ||
420 | /* | 397 | /* |
421 | * error = |matrixA * vectorX - vectorB| / |vectorB| | 398 | * error = |matrixA * vectorX - vectorB| / |vectorB| |
422 | */ | 399 | */ |
423 | matrixMulvector(value, col_ind,row_start, vectorX, tmpVector1); | 400 | matrixMulvector(value, col_ind, row_start, vectorX, tmpVector1); |
424 | vectorSub(tmpVector1,vectorB,tmpVector1); | 401 | vectorSub(tmpVector1, vectorB, tmpVector1); |
425 | error = vectorValue(tmpVector1)/vectorValue(vectorB); | 402 | error = vectorValue(tmpVector1) / vectorValue(vectorB); |
426 | 403 | ||
427 | iteration++; | 404 | iteration++; |
428 | } | 405 | } |
@@ -439,63 +416,57 @@ void biConjugateGradient(double *value, | |||
439 | 416 | ||
440 | return; | 417 | return; |
441 | } | 418 | } |
442 | 419 | ||
443 | /* | 420 | /* |
444 | * This is the function to transfer the data from the matrix of dense storage | 421 | * This is the function to transfer the data from the matrix of dense storage |
445 | * to Compact Row Storage | 422 | * to Compact Row Storage |
446 | */ | 423 | */ |
447 | void create_CRS(double *matrixA, | 424 | void create_CRS(double *matrixA, double *value, int *col_ind, int *row_start, |
448 | double *value, | 425 | int dim, int numberNonzero) { |
449 | int *col_ind, | ||
450 | int *row_start, | ||
451 | int dim, | ||
452 | int numberNonzero) | ||
453 | { | ||
454 | 426 | ||
455 | int i, j, k; | 427 | int i, j, k; |
456 | int cnt; | 428 | int cnt; |
457 | double tmp; | 429 | double tmp; |
458 | 430 | ||
459 | /* | 431 | /* |
460 | *initialize the row_start | 432 | *initialize the row_start |
461 | */ | 433 | */ |
462 | 434 | ||
463 | for(k=0; k<dim; k++){ | 435 | for (k = 0; k < dim; k++) { |
464 | row_start[k] = -1; | 436 | row_start[k] = -1; |
465 | } | 437 | } |
466 | 438 | ||
467 | /* | 439 | /* |
468 | * make the end of the last row to be numberNonzero + dim. | 440 | * make the end of the last row to be numberNonzero + dim. |
469 | */ | 441 | */ |
470 | 442 | ||
471 | row_start[dim] = numberNonzero+dim; | 443 | row_start[dim] = numberNonzero + dim; |
472 | 444 | ||
473 | /* | 445 | /* |
474 | * initialize the col_ind | 446 | * initialize the col_ind |
475 | */ | 447 | */ |
476 | 448 | ||
477 | for (k=0; k<numberNonzero+dim; k++){ | 449 | for (k = 0; k < numberNonzero + dim; k++) { |
478 | col_ind[k] = -1; | 450 | col_ind[k] = -1; |
479 | } | 451 | } |
480 | 452 | ||
481 | |||
482 | cnt = 0; | 453 | cnt = 0; |
483 | 454 | ||
484 | for (i=0; (cnt<numberNonzero+dim)&&(i<dim); i++){ | 455 | for (i = 0; (cnt < numberNonzero + dim) && (i < dim); i++) { |
485 | for (j=0; (cnt<numberNonzero+dim)&&(j<dim); j++){ | 456 | for (j = 0; (cnt < numberNonzero + dim) && (j < dim); j++) { |
486 | 457 | ||
487 | tmp = *(matrixA + i*dim + j); | 458 | tmp = *(matrixA + i * dim + j); |
488 | 459 | ||
489 | if (tmp!=0){ | 460 | if (tmp != 0) { |
490 | 461 | ||
491 | value[cnt] = tmp; | 462 | value[cnt] = tmp; |
492 | col_ind[cnt] = j; | 463 | col_ind[cnt] = j; |
493 | 464 | ||
494 | if (row_start[i] == -1) | 465 | if (row_start[i] == -1) |
495 | row_start[i] = cnt; | 466 | row_start[i] = cnt; |
496 | 467 | ||
497 | cnt += 1; | 468 | cnt += 1; |
498 | } | 469 | } |
499 | } | 470 | } |
500 | } | 471 | } |
501 | row_start[i] = cnt; | 472 | row_start[i] = cnt; |
@@ -503,56 +474,54 @@ void create_CRS(double *matrixA, | |||
503 | return; | 474 | return; |
504 | } | 475 | } |
505 | 476 | ||
506 | 477 | int main(int argc, char **argv) { | |
507 | int main(int argc, char** argv) | ||
508 | { | ||
509 | int seed; | 478 | int seed; |
510 | int numberNonzero; | 479 | int numberNonzero; |
511 | int maxIterations; | 480 | int maxIterations; |
512 | float errorTolerance; | 481 | float errorTolerance; |
513 | double actualError; | 482 | double actualError; |
514 | int actualIteration; | 483 | int actualIteration; |
515 | 484 | ||
516 | time_t beginTime; | 485 | time_t beginTime; |
517 | time_t endTime; | 486 | time_t endTime; |
518 | 487 | ||
519 | double *matrixA; | 488 | double *matrixA; |
520 | double *vectorB; | 489 | double *vectorB; |
521 | double *vectorX; | 490 | double *vectorX; |
522 | 491 | ||
523 | double *value; | 492 | double *value; |
524 | int *col_ind; | 493 | int *col_ind; |
525 | int *row_start; | 494 | int *row_start; |
526 | double sum; | 495 | double sum; |
527 | int k; | 496 | int k; |
528 | // Internal vects for biConj | 497 | // Internal vects for biConj |
529 | double *vectorR, *vectorP, *nextVectorR; | 498 | double *vectorR, *vectorP, *nextVectorR; |
530 | double *tmpVector1, *tmpVector2, *tmpVector3; | 499 | double *tmpVector1, *tmpVector2, *tmpVector3; |
531 | SET_UP | 500 | SET_UP |
532 | 501 | ||
533 | assert(fscanf(stdin, "%d %d %d %d %f", | 502 | assert(fscanf(stdin, "%d %d %d %d %f", &seed, &dim, &numberNonzero, |
534 | &seed, &dim, &numberNonzero,&maxIterations,&errorTolerance) == 5); | 503 | &maxIterations, &errorTolerance) == 5); |
535 | assert((seed > MIN_SEED) && (seed < MAX_SEED)); | 504 | assert((seed > MIN_SEED) && (seed < MAX_SEED)); |
536 | assert((dim > MIN_DIM) && (dim < MAX_DIM)); | 505 | assert((dim > MIN_DIM) && (dim < MAX_DIM)); |
537 | assert((numberNonzero > dim) && (numberNonzero < dim*dim)); | 506 | assert((numberNonzero > dim) && (numberNonzero < dim * dim)); |
538 | assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); | 507 | assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); |
539 | assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); | 508 | assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); |
540 | |||
541 | matrixA = (double *)malloc(dim*dim*sizeof(double)); | ||
542 | vectorB = (double *)malloc(dim*sizeof(double)); | ||
543 | vectorX = (double *)malloc(dim*sizeof(double)); | ||
544 | 509 | ||
545 | value = (double *)malloc((numberNonzero+dim)*sizeof(double)); | 510 | matrixA = (double *)malloc(dim * dim * sizeof(double)); |
546 | col_ind = (int *)malloc((numberNonzero+dim)*sizeof(int)); | 511 | vectorB = (double *)malloc(dim * sizeof(double)); |
547 | row_start = (int *)malloc((dim+1)*sizeof(int)); | 512 | vectorX = (double *)malloc(dim * sizeof(double)); |
513 | |||
514 | value = (double *)malloc((numberNonzero + dim) * sizeof(double)); | ||
515 | col_ind = (int *)malloc((numberNonzero + dim) * sizeof(int)); | ||
516 | row_start = (int *)malloc((dim + 1) * sizeof(int)); | ||
548 | 517 | ||
549 | // Internal matricies for biConj | 518 | // Internal matricies for biConj |
550 | vectorP = (double *)malloc(dim*sizeof(double)); | 519 | vectorP = (double *)malloc(dim * sizeof(double)); |
551 | vectorR = (double *)malloc(dim*sizeof(double)); | 520 | vectorR = (double *)malloc(dim * sizeof(double)); |
552 | nextVectorR = (double *)malloc(dim*sizeof(double)); | 521 | nextVectorR = (double *)malloc(dim * sizeof(double)); |
553 | tmpVector1 = (double *)malloc(dim*sizeof(double)); | 522 | tmpVector1 = (double *)malloc(dim * sizeof(double)); |
554 | tmpVector2 = (double *)malloc(dim*sizeof(double)); | 523 | tmpVector2 = (double *)malloc(dim * sizeof(double)); |
555 | tmpVector3 = (double *)malloc(dim*sizeof(double)); | 524 | tmpVector3 = (double *)malloc(dim * sizeof(double)); |
556 | 525 | ||
557 | randInit(seed); | 526 | randInit(seed); |
558 | 527 | ||
@@ -569,23 +538,24 @@ int main(int argc, char** argv) | |||
569 | actualError = 0; | 538 | actualError = 0; |
570 | actualIteration = 0; | 539 | actualIteration = 0; |
571 | 540 | ||
572 | biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, | 541 | biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, |
573 | maxIterations, | 542 | errorTolerance, maxIterations, &actualError, |
574 | &actualError, &actualIteration, dim, | 543 | &actualIteration, dim, vectorP, vectorR, nextVectorR, |
575 | vectorP, vectorR, nextVectorR, tmpVector1, tmpVector2, tmpVector3); | 544 | tmpVector1, tmpVector2, tmpVector3); |
576 | 545 | ||
577 | STOP_LOOP | 546 | STOP_LOOP |
578 | endTime = time(NULL); | 547 | endTime = time(NULL); |
579 | 548 | ||
580 | sum = 0; | 549 | sum = 0; |
581 | for (k=1; k<dim; k++){ | 550 | for (k = 1; k < dim; k++) { |
582 | sum += sum + *(vectorX + k); | 551 | sum += sum + *(vectorX + k); |
583 | } | 552 | } |
584 | 553 | ||
585 | fprintf(stdout, "sum = %f, actualError = %e, actualIteration = %d\n", sum, actualError, actualIteration); | 554 | fprintf(stdout, "sum = %f, actualError = %e, actualIteration = %d\n", sum, |
586 | fprintf(stderr, "time for matrix stressmark = %f seconds.\n", difftime(endTime, beginTime)); | 555 | actualError, actualIteration); |
556 | fprintf(stderr, "time for matrix stressmark = %f seconds.\n", | ||
557 | difftime(endTime, beginTime)); | ||
587 | 558 | ||
588 | WRITE_TO_FILE | 559 | WRITE_TO_FILE |
589 | return(0); | 560 | return (0); |
590 | } | 561 | } |
591 | |||
diff --git a/dis/Neighborhood/DISstressmarkRNG.h b/dis/Neighborhood/DISstressmarkRNG.h index 4aa2620..6243606 100644 --- a/dis/Neighborhood/DISstressmarkRNG.h +++ b/dis/Neighborhood/DISstressmarkRNG.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <assert.h> | ||
1 | #include <math.h> | 2 | #include <math.h> |
2 | 3 | ||
3 | #define IA 16807 | 4 | #define IA 16807 |
diff --git a/dis/Neighborhood/neighborhood.c b/dis/Neighborhood/neighborhood.c index 23f3a8e..614b8e8 100644 --- a/dis/Neighborhood/neighborhood.c +++ b/dis/Neighborhood/neighborhood.c | |||
@@ -1,12 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Sample code for the DIS Neighborhood Stressmark | 2 | * Sample code for the DIS Neighborhood Stressmark |
3 | * | 3 | * |
4 | * This source code is the completely correct source code based on | 4 | * This source code is the completely correct source code based on |
5 | * the example codes provided by Atlantic Aerospace Division, Titan | 5 | * the example codes provided by Atlantic Aerospace Division, Titan |
6 | * Systems Corporation, 2000. | 6 | * Systems Corporation, 2000. |
7 | * | 7 | * |
8 | * If you just compile and generate the executables from this source | 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 | 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 | 10 | * understanding of this stressmark, it is strongly suggested that you |
11 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 11 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
12 | * before going on since the detailed comments are given in this documents. | 12 | * before going on since the detailed comments are given in this documents. |
@@ -17,19 +17,18 @@ | |||
17 | * 06/2020 Joshua Bakita Include image creation time in timing | 17 | * 06/2020 Joshua Bakita Include image creation time in timing |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include "DISstressmarkRNG.h" | ||
21 | #include "extra.h" | ||
22 | #include "utili.h" | ||
23 | #include <assert.h> | ||
20 | #include <stdio.h> | 24 | #include <stdio.h> |
21 | #include <stdlib.h> | 25 | #include <stdlib.h> |
22 | #include <time.h> | 26 | #include <time.h> |
23 | #include<assert.h> | ||
24 | #include "DISstressmarkRNG.h" | ||
25 | #include "utili.h" | ||
26 | #include "extra.h" | ||
27 | 27 | ||
28 | /* | 28 | /* |
29 | * main() | 29 | * main() |
30 | */ | 30 | */ |
31 | int main(int argc, char** argv) | 31 | int main(int argc, char **argv) { |
32 | { | ||
33 | long int seed; | 32 | long int seed; |
34 | int dimension; | 33 | int dimension; |
35 | int numberLines; | 34 | int numberLines; |
@@ -46,10 +45,9 @@ int main(int argc, char** argv) | |||
46 | time_t endTime; | 45 | time_t endTime; |
47 | SET_UP | 46 | SET_UP |
48 | 47 | ||
49 | assert(fscanf(stdin, "%ld %d %d %d %d %d %d %d", | 48 | assert(fscanf(stdin, "%ld %d %d %d %d %d %d %d", &seed, &bitDepth, &dimension, |
50 | &seed, &bitDepth, &dimension, &numberLines, | 49 | &numberLines, &minThickness, &maxThickness, &distanceShort, |
51 | &minThickness, &maxThickness, | 50 | &distanceLong) == 8); |
52 | &distanceShort, &distanceLong) == 8); | ||
53 | 51 | ||
54 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); | 52 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); |
55 | assert((dimension > 0) && (dimension <= MAX_DIMENSION)); | 53 | assert((dimension > 0) && (dimension <= MAX_DIMENSION)); |
@@ -67,43 +65,32 @@ int main(int argc, char** argv) | |||
67 | 65 | ||
68 | beginTime = time(NULL); | 66 | beginTime = time(NULL); |
69 | START_LOOP | 67 | START_LOOP |
70 | createImage(image, dimension, maxPixel, numberLines, | 68 | createImage(image, dimension, maxPixel, numberLines, minThickness, |
71 | minThickness, maxThickness); | 69 | maxThickness); |
72 | 70 | ||
73 | neighborhoodCalculation(image, dimension, | 71 | neighborhoodCalculation(image, dimension, distanceShort, distanceLong, |
74 | distanceShort, distanceLong, &values, maxPixel); | 72 | &values, maxPixel); |
75 | STOP_LOOP | 73 | STOP_LOOP |
76 | endTime = time(NULL); | 74 | endTime = time(NULL); |
77 | WRITE_TO_FILE | 75 | WRITE_TO_FILE |
78 | 76 | ||
79 | // printf(" end time is %d\n", endTime); | 77 | // printf(" end time is %d\n", endTime); |
80 | 78 | ||
81 | fprintf(stdout, "%9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e", | 79 | fprintf(stdout, "%9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e", |
82 | values.distShort.deg0.entropy, | 80 | values.distShort.deg0.entropy, values.distShort.deg0.energy, |
83 | values.distShort.deg0.energy, | 81 | values.distShort.deg45.entropy, values.distShort.deg45.energy, |
84 | values.distShort.deg45.entropy, | 82 | values.distShort.deg90.entropy, values.distShort.deg90.energy, |
85 | values.distShort.deg45.energy, | 83 | values.distShort.deg135.entropy, values.distShort.deg135.energy); |
86 | values.distShort.deg90.entropy, | ||
87 | values.distShort.deg90.energy, | ||
88 | values.distShort.deg135.entropy, | ||
89 | values.distShort.deg135.energy); | ||
90 | 84 | ||
91 | fprintf(stdout,"%9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e", | 85 | fprintf(stdout, "%9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e %9.4e", |
92 | values.distLong.deg0.entropy, | 86 | values.distLong.deg0.entropy, values.distLong.deg0.energy, |
93 | values.distLong.deg0.energy,values.distShort.deg45.entropy, | 87 | values.distShort.deg45.entropy, values.distLong.deg45.energy, |
94 | values.distLong.deg45.energy, | 88 | values.distLong.deg90.entropy, values.distLong.deg90.energy, |
95 | values.distLong.deg90.entropy, | 89 | values.distLong.deg135.entropy, values.distLong.deg135.energy); |
96 | values.distLong.deg90.energy, | ||
97 | values.distLong.deg135.entropy, | ||
98 | values.distLong.deg135.energy); | ||
99 | 90 | ||
100 | fprintf(stderr, "time for neghborhood stressmark = %f seconds.\n", | 91 | fprintf(stderr, "time for neghborhood stressmark = %f seconds.\n", |
101 | difftime(endTime, beginTime)); | 92 | difftime(endTime, beginTime)); |
102 | 93 | ||
103 | free((Pixel *)image); | 94 | free((Pixel *)image); |
104 | return (SUCCESS); | 95 | return (SUCCESS); |
105 | } | 96 | } |
106 | |||
107 | |||
108 | |||
109 | |||
diff --git a/dis/Neighborhood/utili.h b/dis/Neighborhood/utili.h index 5b54d9b..b5a7498 100644 --- a/dis/Neighborhood/utili.h +++ b/dis/Neighborhood/utili.h | |||
@@ -1,12 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Sample code for the DIS Pointer Stressmark | 2 | * Sample code for the DIS Pointer Stressmark |
3 | * | 3 | * |
4 | * This source code is the completely correct source code based on | 4 | * This source code is the completely correct source code based on |
5 | * the example codes provided by Atlantic Aerospace Division, Titan | 5 | * the example codes provided by Atlantic Aerospace Division, Titan |
6 | * Systems Corporation, 2000. | 6 | * Systems Corporation, 2000. |
7 | * | 7 | * |
8 | * If you just compile and generate the executables from this source | 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 | 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 | 10 | * understanding of this stressmark, it is strongly suggested that you |
11 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 11 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
12 | * before going on since the detailed comments are given in this documents. | 12 | * before going on since the detailed comments are given in this documents. |
@@ -22,287 +22,248 @@ | |||
22 | 22 | ||
23 | #define MIN_PIXEL 0 | 23 | #define MIN_PIXEL 0 |
24 | #define MAX_DIMENSION 32768 | 24 | #define MAX_DIMENSION 32768 |
25 | #define MIN_SEED -2147483647 | 25 | #define MIN_SEED -2147483647 |
26 | #define MAX_SEED -1 | 26 | #define MAX_SEED -1 |
27 | #define MAX_NUMBER_LINES 65536 | 27 | #define MAX_NUMBER_LINES 65536 |
28 | #define MIN_BIT_DEPTH 7 | 28 | #define MIN_BIT_DEPTH 7 |
29 | #define MAX_BIT_DEPTH 15 | 29 | #define MAX_BIT_DEPTH 15 |
30 | 30 | ||
31 | typedef struct { | 31 | typedef struct { |
32 | int column; | 32 | int column; |
33 | int row; | 33 | int row; |
34 | }Coord; | 34 | } Coord; |
35 | 35 | ||
36 | /* | 36 | /* |
37 | * Neighborhood structure consists of the GLCM descriptors entropy and | 37 | * Neighborhood structure consists of the GLCM descriptors entropy and |
38 | * energy for each of 2 distance and 4 angels | 38 | * energy for each of 2 distance and 4 angels |
39 | */ | 39 | */ |
40 | typedef struct { | 40 | typedef struct { |
41 | float entropy; | 41 | float entropy; |
42 | float energy; | 42 | float energy; |
43 | }Descriptors; | 43 | } Descriptors; |
44 | 44 | ||
45 | typedef struct { | 45 | typedef struct { |
46 | Descriptors deg0; | 46 | Descriptors deg0; |
47 | Descriptors deg45; | 47 | Descriptors deg45; |
48 | Descriptors deg90; | 48 | Descriptors deg90; |
49 | Descriptors deg135; | 49 | Descriptors deg135; |
50 | }Angeles; | 50 | } Angeles; |
51 | 51 | ||
52 | typedef struct { | 52 | typedef struct { |
53 | Angeles distShort; | 53 | Angeles distShort; |
54 | Angeles distLong; | 54 | Angeles distLong; |
55 | }Neighborhood; | 55 | } Neighborhood; |
56 | 56 | ||
57 | typedef short int Pixel; /* short int;*/ | 57 | typedef short int Pixel; /* short int;*/ |
58 | 58 | ||
59 | typedef struct { | 59 | typedef struct { |
60 | int numColumns; /* number of columns in image */ | 60 | int numColumns; /* number of columns in image */ |
61 | int numRows; /* number of rows in image */ | 61 | int numRows; /* number of rows in image */ |
62 | Pixel maxImageValue; /* max legal image value */ | 62 | Pixel maxImageValue; /* max legal image value */ |
63 | Pixel *data; /* data pointer */ | 63 | Pixel *data; /* data pointer */ |
64 | } Image; | 64 | } Image; |
65 | 65 | ||
66 | // For correct implementation of drawLineSegment | 66 | // For correct implementation of drawLineSegment |
67 | #include "initializeImage.c" | 67 | #include "initializeImage.c" |
68 | 68 | ||
69 | Pixel *createImage (Pixel *image, | 69 | Pixel *createImage(Pixel *image, int dimension, Pixel maxPixel, int numberLines, |
70 | int dimension, | 70 | int minThickness, int maxThickness) { |
71 | Pixel maxPixel, | 71 | int i; |
72 | int numberLines, | 72 | |
73 | int minThickness, | 73 | Coord startPoint; |
74 | int maxThickness) | 74 | Coord endPoint; |
75 | { | 75 | int thickness; |
76 | int i; | 76 | int startValue; |
77 | 77 | int endValue; | |
78 | Coord startPoint; | 78 | Image img; |
79 | Coord endPoint; | 79 | img.numColumns = dimension; |
80 | int thickness; | 80 | img.numRows = dimension; |
81 | int startValue; | 81 | img.maxImageValue = maxPixel; |
82 | int endValue; | 82 | img.data = image; |
83 | Image img; | 83 | |
84 | img.numColumns = dimension; | 84 | for (i = 0; i < dimension * dimension; i++) { |
85 | img.numRows = dimension; | 85 | image[i] = 0; |
86 | img.maxImageValue = maxPixel; | 86 | } |
87 | img.data = image; | ||
88 | |||
89 | for (i=0; i<dimension*dimension; i++){ | ||
90 | image[i] = 0; | ||
91 | } | ||
92 | 87 | ||
93 | for (i=0; i<numberLines; i++){ | 88 | for (i = 0; i < numberLines; i++) { |
94 | float temp; | 89 | float temp; |
95 | float prev; | 90 | float prev; |
96 | 91 | ||
97 | temp = randomUInt(0, dimension*dimension - 1); | 92 | temp = randomUInt(0, dimension * dimension - 1); |
98 | startPoint.row = (int) temp/dimension; | 93 | startPoint.row = (int)temp / dimension; |
99 | startPoint.column = (int) temp % dimension; | 94 | startPoint.column = (int)temp % dimension; |
100 | prev = temp; | 95 | prev = temp; |
101 | 96 | ||
102 | // Make sure that the end is different than the start | 97 | // Make sure that the end is different than the start |
103 | while((temp = randomUInt(0, dimension*dimension -1)) == prev); | 98 | while ((temp = randomUInt(0, dimension * dimension - 1)) == prev) |
99 | ; | ||
104 | 100 | ||
105 | endPoint.row = (int) temp/dimension; | 101 | endPoint.row = (int)temp / dimension; |
106 | endPoint.column = (int) temp% dimension; | 102 | endPoint.column = (int)temp % dimension; |
107 | 103 | ||
108 | thickness = randomUInt(minThickness, maxThickness); | 104 | thickness = randomUInt(minThickness, maxThickness); |
109 | startValue = randomUInt(MIN_PIXEL, maxPixel); | 105 | startValue = randomUInt(MIN_PIXEL, maxPixel); |
110 | endValue = randomUInt(MIN_PIXEL, maxPixel); | 106 | endValue = randomUInt(MIN_PIXEL, maxPixel); |
111 | 107 | ||
112 | drawLineSegment(&startPoint, &endPoint, | 108 | drawLineSegment(&startPoint, &endPoint, startValue, endValue, thickness, |
113 | startValue, endValue, thickness, &img); | 109 | &img); |
114 | } | 110 | } |
115 | return(image); | 111 | return (image); |
116 | } | 112 | } |
117 | 113 | ||
114 | void calcEntropyEnergy(int *sumHist, int *diffHist, Pixel *image, int numBins, | ||
115 | int dx, int dy, float *entropy, float *energy, | ||
116 | int dimension, Pixel maxPixel) { | ||
117 | int index; | ||
118 | int totalNumPixels; | ||
119 | int rowIndex; | ||
120 | int rowLow, rowHigh; | ||
121 | int columnIndex; | ||
122 | int columnLow, columnHigh; | ||
123 | int columnForPixelAtDistance; | ||
124 | int rowForPixelAtDistance; | ||
125 | int value0RowOffset; | ||
126 | int value1RowOffset; | ||
127 | |||
128 | *entropy = 0.0; | ||
129 | *energy = 0.0; | ||
130 | |||
131 | for (index = 0; index < numBins; index++) { | ||
132 | sumHist[index] = 0; | ||
133 | diffHist[index] = 0; | ||
134 | } | ||
118 | 135 | ||
119 | void calcEntropyEnergy( | 136 | if (dy < 0) { |
120 | int *sumHist, | 137 | rowLow = -dy; |
121 | int *diffHist, | 138 | rowHigh = dimension; |
122 | Pixel *image, | 139 | } else { |
123 | int numBins, | 140 | rowLow = 0; |
124 | int dx, | 141 | rowHigh = dimension - dy; |
125 | int dy, | 142 | } |
126 | float *entropy, | 143 | if (dx < 0) { |
127 | float *energy, | 144 | columnLow = -dx; |
128 | int dimension, | 145 | columnHigh = dimension; |
129 | Pixel maxPixel) | 146 | } else { |
130 | { | 147 | columnLow = 0; |
131 | int index; | 148 | columnHigh = dimension - dx; |
132 | int totalNumPixels; | 149 | } |
133 | int rowIndex; | ||
134 | int rowLow, rowHigh; | ||
135 | int columnIndex; | ||
136 | int columnLow, columnHigh; | ||
137 | int columnForPixelAtDistance; | ||
138 | int rowForPixelAtDistance; | ||
139 | int value0RowOffset; | ||
140 | int value1RowOffset; | ||
141 | |||
142 | *entropy = 0.0; | ||
143 | *energy = 0.0; | ||
144 | |||
145 | for (index = 0; index < numBins; index++){ | ||
146 | sumHist[index] = 0; | ||
147 | diffHist[index] = 0; | ||
148 | } | ||
149 | |||
150 | if (dy < 0){ | ||
151 | rowLow = -dy; | ||
152 | rowHigh = dimension; | ||
153 | } | ||
154 | else { | ||
155 | rowLow = 0; | ||
156 | rowHigh = dimension - dy; | ||
157 | } | ||
158 | if (dx < 0){ | ||
159 | columnLow = -dx; | ||
160 | columnHigh = dimension; | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | columnLow = 0; | ||
165 | columnHigh = dimension - dx; | ||
166 | } | ||
167 | 150 | ||
168 | totalNumPixels = 0; | 151 | totalNumPixels = 0; |
169 | value0RowOffset = rowLow * dimension; | 152 | value0RowOffset = rowLow * dimension; |
170 | value1RowOffset = (rowLow + dy) * dimension; | 153 | value1RowOffset = (rowLow + dy) * dimension; |
171 | 154 | ||
172 | for (rowIndex = rowLow; rowIndex<rowHigh; rowIndex++){ | 155 | for (rowIndex = rowLow; rowIndex < rowHigh; rowIndex++) { |
173 | for (columnIndex= columnLow; columnIndex<columnHigh; | 156 | for (columnIndex = columnLow; columnIndex < columnHigh; columnIndex++) { |
174 | columnIndex++){ | 157 | int value0; |
175 | int value0; | 158 | int value1; |
176 | int value1; | 159 | int binIndex; |
177 | int binIndex; | ||
178 | 160 | ||
179 | rowForPixelAtDistance = rowIndex + dy; | 161 | rowForPixelAtDistance = rowIndex + dy; |
180 | columnForPixelAtDistance = columnIndex + dx; | 162 | columnForPixelAtDistance = columnIndex + dx; |
181 | 163 | ||
182 | value0 = *(image + value0RowOffset + columnIndex); | 164 | value0 = *(image + value0RowOffset + columnIndex); |
183 | value1 = *(image + value1RowOffset + | 165 | value1 = *(image + value1RowOffset + columnForPixelAtDistance); |
184 | columnForPixelAtDistance); | ||
185 | 166 | ||
186 | binIndex = value0 + value1 - 2*MIN_PIXEL; | 167 | binIndex = value0 + value1 - 2 * MIN_PIXEL; |
187 | assert((binIndex >= 0) && (binIndex < numBins)); | 168 | assert((binIndex >= 0) && (binIndex < numBins)); |
188 | sumHist[binIndex] += 1; | 169 | sumHist[binIndex] += 1; |
189 | binIndex = value0 - value1 + maxPixel - MIN_PIXEL; | 170 | binIndex = value0 - value1 + maxPixel - MIN_PIXEL; |
190 | 171 | ||
191 | assert((binIndex >= 0) && (binIndex < numBins)); | 172 | assert((binIndex >= 0) && (binIndex < numBins)); |
192 | 173 | ||
193 | diffHist[binIndex] += 1; | 174 | diffHist[binIndex] += 1; |
194 | totalNumPixels += 1; | 175 | totalNumPixels += 1; |
176 | } | ||
195 | 177 | ||
196 | } | 178 | value0RowOffset += dimension; |
197 | 179 | value1RowOffset += dimension; | |
198 | value0RowOffset += dimension; | 180 | } |
199 | value1RowOffset += dimension; | ||
200 | 181 | ||
201 | } | 182 | if (totalNumPixels > 0) { |
202 | 183 | int index; | |
203 | 184 | double energySum; | |
204 | if (totalNumPixels > 0){ | 185 | double energyDifference; |
205 | int index; | 186 | double entropyValue; |
206 | double energySum; | 187 | double sumNormalized; |
207 | double energyDifference; | 188 | double diffNormalized; |
208 | double entropyValue; | 189 | double scale; |
209 | double sumNormalized; | 190 | |
210 | double diffNormalized; | 191 | energySum = (double)0; |
211 | double scale; | 192 | energyDifference = (double)0; |
212 | 193 | entropyValue = (double)0; | |
213 | energySum = (double) 0; | 194 | scale = 1.e0 / totalNumPixels; |
214 | energyDifference = (double) 0; | 195 | for (index = 0; index < numBins; index++) { |
215 | entropyValue = (double) 0; | 196 | if (sumHist[index] > 0) { |
216 | scale = 1.e0/totalNumPixels; | 197 | sumNormalized = (double)sumHist[index] * scale; |
217 | for (index = 0; index<numBins; index++){ | 198 | entropyValue = |
218 | if (sumHist[index] > 0){ | 199 | entropyValue - sumNormalized * log((double)sumNormalized); |
219 | sumNormalized = (double) sumHist[index]*scale; | 200 | energySum = energySum + sumNormalized * sumNormalized; |
220 | entropyValue = entropyValue - sumNormalized * | 201 | } |
221 | log((double)sumNormalized); | 202 | if (diffHist[index] > 0) { |
222 | energySum = energySum + sumNormalized * sumNormalized ; | 203 | diffNormalized = (double)diffHist[index] * scale; |
223 | } | 204 | entropyValue = entropyValue - diffNormalized * log(diffNormalized); |
224 | if (diffHist[index] > 0){ | 205 | energyDifference = energyDifference + diffNormalized * diffNormalized; |
225 | diffNormalized = (double)diffHist[index]*scale; | ||
226 | entropyValue = entropyValue - diffNormalized * log(diffNormalized); | ||
227 | energyDifference = energyDifference + | ||
228 | diffNormalized * diffNormalized; | ||
229 | } | ||
230 | } | 206 | } |
231 | *energy = energySum * energyDifference; | ||
232 | *entropy = entropyValue; | ||
233 | } | 207 | } |
234 | return; | 208 | *energy = energySum * energyDifference; |
235 | } | 209 | *entropy = entropyValue; |
236 | |||
237 | |||
238 | void neighborhoodCalculation | ||
239 | (Pixel *image, | ||
240 | int dimension, | ||
241 | int distanceShort, | ||
242 | int distanceLong, | ||
243 | Neighborhood *neighborhood, | ||
244 | Pixel maxPixel) | ||
245 | { | ||
246 | int *sumHist, *diffHist; | ||
247 | int numBins; | ||
248 | |||
249 | numBins = (2 * (maxPixel - MIN_PIXEL + 1) -1); | ||
250 | sumHist = (int *) malloc(numBins * sizeof(int)); | ||
251 | assert (sumHist != NULL); | ||
252 | diffHist = (int *)malloc(numBins * sizeof(int)); | ||
253 | assert(diffHist != NULL); | ||
254 | |||
255 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
256 | distanceShort, 0, | ||
257 | &(neighborhood->distShort.deg0.entropy), | ||
258 | &(neighborhood->distShort.deg0.energy), dimension, | ||
259 | maxPixel); | ||
260 | |||
261 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
262 | distanceShort, distanceShort, | ||
263 | &(neighborhood->distShort.deg45.entropy), | ||
264 | &(neighborhood->distShort.deg45.energy), dimension, | ||
265 | maxPixel); | ||
266 | |||
267 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
268 | 0, distanceShort, | ||
269 | &(neighborhood->distShort.deg90.entropy), | ||
270 | &(neighborhood->distShort.deg90.energy), dimension, | ||
271 | maxPixel); | ||
272 | |||
273 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
274 | -distanceShort, distanceShort, | ||
275 | &(neighborhood->distShort.deg135.entropy), | ||
276 | &(neighborhood->distShort.deg135.energy), dimension, | ||
277 | maxPixel); | ||
278 | |||
279 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
280 | distanceLong, 0, | ||
281 | &(neighborhood->distLong.deg0.entropy), | ||
282 | &(neighborhood->distLong.deg0.energy), dimension, | ||
283 | maxPixel); | ||
284 | |||
285 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
286 | distanceLong, distanceLong, | ||
287 | &(neighborhood->distLong.deg45.entropy), | ||
288 | &(neighborhood->distLong.deg45.energy), dimension, | ||
289 | maxPixel); | ||
290 | |||
291 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
292 | 0, distanceLong, | ||
293 | &(neighborhood->distLong.deg90.entropy), | ||
294 | &(neighborhood->distLong.deg90.energy), dimension, | ||
295 | maxPixel); | ||
296 | |||
297 | calcEntropyEnergy(sumHist, diffHist, image, numBins, | ||
298 | -distanceLong, distanceLong, | ||
299 | &(neighborhood->distLong.deg135.entropy), | ||
300 | &(neighborhood->distLong.deg135.energy), dimension, | ||
301 | maxPixel); | ||
302 | |||
303 | free(sumHist); | ||
304 | free(diffHist); | ||
305 | |||
306 | return; | ||
307 | } | 210 | } |
211 | return; | ||
212 | } | ||
308 | 213 | ||
214 | void neighborhoodCalculation(Pixel *image, int dimension, int distanceShort, | ||
215 | int distanceLong, Neighborhood *neighborhood, | ||
216 | Pixel maxPixel) { | ||
217 | int *sumHist, *diffHist; | ||
218 | int numBins; | ||
219 | |||
220 | numBins = (2 * (maxPixel - MIN_PIXEL + 1) - 1); | ||
221 | sumHist = (int *)malloc(numBins * sizeof(int)); | ||
222 | assert(sumHist != NULL); | ||
223 | diffHist = (int *)malloc(numBins * sizeof(int)); | ||
224 | assert(diffHist != NULL); | ||
225 | |||
226 | calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceShort, 0, | ||
227 | &(neighborhood->distShort.deg0.entropy), | ||
228 | &(neighborhood->distShort.deg0.energy), dimension, | ||
229 | maxPixel); | ||
230 | |||
231 | calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceShort, | ||
232 | distanceShort, &(neighborhood->distShort.deg45.entropy), | ||
233 | &(neighborhood->distShort.deg45.energy), dimension, | ||
234 | maxPixel); | ||
235 | |||
236 | calcEntropyEnergy(sumHist, diffHist, image, numBins, 0, distanceShort, | ||
237 | &(neighborhood->distShort.deg90.entropy), | ||
238 | &(neighborhood->distShort.deg90.energy), dimension, | ||
239 | maxPixel); | ||
240 | |||
241 | calcEntropyEnergy(sumHist, diffHist, image, numBins, -distanceShort, | ||
242 | distanceShort, &(neighborhood->distShort.deg135.entropy), | ||
243 | &(neighborhood->distShort.deg135.energy), dimension, | ||
244 | maxPixel); | ||
245 | |||
246 | calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceLong, 0, | ||
247 | &(neighborhood->distLong.deg0.entropy), | ||
248 | &(neighborhood->distLong.deg0.energy), dimension, maxPixel); | ||
249 | |||
250 | calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceLong, | ||
251 | distanceLong, &(neighborhood->distLong.deg45.entropy), | ||
252 | &(neighborhood->distLong.deg45.energy), dimension, | ||
253 | maxPixel); | ||
254 | |||
255 | calcEntropyEnergy(sumHist, diffHist, image, numBins, 0, distanceLong, | ||
256 | &(neighborhood->distLong.deg90.entropy), | ||
257 | &(neighborhood->distLong.deg90.energy), dimension, | ||
258 | maxPixel); | ||
259 | |||
260 | calcEntropyEnergy(sumHist, diffHist, image, numBins, -distanceLong, | ||
261 | distanceLong, &(neighborhood->distLong.deg135.entropy), | ||
262 | &(neighborhood->distLong.deg135.energy), dimension, | ||
263 | maxPixel); | ||
264 | |||
265 | free(sumHist); | ||
266 | free(diffHist); | ||
267 | |||
268 | return; | ||
269 | } | ||
diff --git a/dis/Pointer/DISstressmarkRNG.h b/dis/Pointer/DISstressmarkRNG.h index 4aa2620..6243606 100644 --- a/dis/Pointer/DISstressmarkRNG.h +++ b/dis/Pointer/DISstressmarkRNG.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <assert.h> | ||
1 | #include <math.h> | 2 | #include <math.h> |
2 | 3 | ||
3 | #define IA 16807 | 4 | #define IA 16807 |
diff --git a/dis/Pointer/pointer.c b/dis/Pointer/pointer.c index 3fc7248..3f3eefb 100644 --- a/dis/Pointer/pointer.c +++ b/dis/Pointer/pointer.c | |||
@@ -1,26 +1,26 @@ | |||
1 | /* | 1 | /* |
2 | * Sample code for the DIS Pointer Stressmark | 2 | * Sample code for the DIS Pointer Stressmark |
3 | * | 3 | * |
4 | * This source code is the completely correct source code based on | 4 | * This source code is the completely correct source code based on |
5 | * the example codes provided by Atlantic Aerospace Division, Titan | 5 | * the example codes provided by Atlantic Aerospace Division, Titan |
6 | * Systems Corporation, 2000. | 6 | * Systems Corporation, 2000. |
7 | * | 7 | * |
8 | * If you just compile and generate the executables from this source | 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 | 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 | 10 | * understanding of this stressmark, it is strongly suggested that you |
11 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 11 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
12 | * before going on since the detailed comments are given in this documents. | 12 | * before going on since the detailed comments are given in this documents. |
13 | * the comments are not repeated here. | 13 | * the comments are not repeated here. |
14 | */ | 14 | */ |
15 | #include <stdio.h> | ||
16 | #include <time.h> | ||
17 | #include <assert.h> | ||
18 | #include <stdlib.h> | ||
19 | #include "DISstressmarkRNG.h" | 15 | #include "DISstressmarkRNG.h" |
20 | #include "extra.h" | 16 | #include "extra.h" |
17 | #include <assert.h> | ||
18 | #include <stdio.h> | ||
19 | #include <stdlib.h> | ||
20 | #include <time.h> | ||
21 | 21 | ||
22 | #define MIN_FIELD_SIZE 16 | 22 | #define MIN_FIELD_SIZE 16 |
23 | #define MAX_FIELD_SIZE (16777216*4) // Modifed from original | 23 | #define MAX_FIELD_SIZE (16777216 * 4) // Modifed from original |
24 | #define MIN_WINDOW_SIZE 1 | 24 | #define MIN_WINDOW_SIZE 1 |
25 | #define MAX_WINDOW_SIZE 15 | 25 | #define MAX_WINDOW_SIZE 15 |
26 | #define MIN_HOP_LIMIT 1 | 26 | #define MIN_HOP_LIMIT 1 |
@@ -35,7 +35,7 @@ | |||
35 | /* | 35 | /* |
36 | * main() | 36 | * main() |
37 | */ | 37 | */ |
38 | int main(int argc, char** argv){ | 38 | int main(int argc, char **argv) { |
39 | 39 | ||
40 | unsigned int *field; | 40 | unsigned int *field; |
41 | unsigned long f; | 41 | unsigned long f; |
@@ -46,116 +46,115 @@ int main(int argc, char** argv){ | |||
46 | 46 | ||
47 | clock_t startTime, endTime; | 47 | clock_t startTime, endTime; |
48 | 48 | ||
49 | struct threadS{ | 49 | struct threadS { |
50 | unsigned long initial; | 50 | unsigned long initial; |
51 | unsigned long minStop; | 51 | unsigned long minStop; |
52 | unsigned long maxStop; | 52 | unsigned long maxStop; |
53 | unsigned long hops; | 53 | unsigned long hops; |
54 | }*thread; | 54 | } * thread; |
55 | 55 | ||
56 | unsigned int l; | 56 | unsigned int l; |
57 | SET_UP | 57 | SET_UP |
58 | 58 | ||
59 | assert(fscanf(stdin, "%lu %u %lu %ld %u", | 59 | assert(fscanf(stdin, "%lu %u %lu %ld %u", &f, &l, &maxhops, &seed, &n) == 5); |
60 | &f, &l, &maxhops, &seed, &n) == 5); | 60 | |
61 | 61 | assert((f >= MIN_FIELD_SIZE) && (f <= MAX_FIELD_SIZE)); | |
62 | assert ((f >= MIN_FIELD_SIZE) && (f <= MAX_FIELD_SIZE)); | 62 | w = (unsigned int)l; |
63 | w = (unsigned int) l; | 63 | assert((w >= MIN_WINDOW_SIZE) && (w <= MAX_WINDOW_SIZE)); |
64 | assert ((w >= MIN_WINDOW_SIZE) && (w <= MAX_WINDOW_SIZE)); | 64 | assert(w % 2 == 1); |
65 | assert (w % 2 == 1); | 65 | assert(f > w); |
66 | assert (f > w); | 66 | assert((maxhops >= MIN_HOP_LIMIT) && (maxhops <= MAX_HOP_LIMIT)); |
67 | assert ((maxhops >= MIN_HOP_LIMIT) && (maxhops <= MAX_HOP_LIMIT)); | 67 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); |
68 | assert ((seed >= MIN_SEED) && (seed <= MAX_SEED)); | 68 | |
69 | 69 | assert((n >= MIN_THREADS) && (n <= MAX_THREADS)); | |
70 | assert ((n >= MIN_THREADS) && (n <= MAX_THREADS)); | 70 | if ((thread = (struct threadS *)malloc(n * sizeof(struct threadS))) == NULL) |
71 | if ((thread = (struct threadS *)malloc(n*sizeof(struct threadS))) == NULL) | 71 | return (-1); |
72 | return (-1); | 72 | |
73 | 73 | for (l = 0; l < n; l++) { | |
74 | for (l=0; l<n; l++){ | 74 | assert(fscanf(stdin, "%lu %lu %lu", &(thread[l].initial), |
75 | assert(fscanf(stdin, "%lu %lu %lu", | 75 | &(thread[l].minStop), &(thread[l].maxStop)) == 3); |
76 | &(thread[l].initial), &(thread[l].minStop), &(thread[l].maxStop)) == 3); | 76 | assert((thread[l].initial >= 0) && (thread[l].initial < f)); |
77 | assert ((thread[l].initial >= 0) && (thread[l].initial < f)); | 77 | assert((thread[l].minStop >= 0) && (thread[l].minStop < f)); |
78 | assert ((thread[l].minStop >= 0) && (thread[l].minStop < f)); | 78 | assert((thread[l].maxStop >= 0) && (thread[l].maxStop < 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 | } | ||
89 | startTime = time(NULL); | ||
90 | clock(); | ||
91 | |||
92 | START_LOOP | ||
93 | for (l=0; l<n; l++) | ||
94 | { | ||
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 | } | 79 | } |
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 | } /* end while */ | ||
146 | STOP_LOOP | ||
147 | |||
148 | endTime = time(NULL); | ||
149 | |||
150 | volatile int _stop_optimizer = thread[l].hops + l; | ||
151 | /*for (l=0; l<n; l++){ | ||
152 | fprintf(stdout, "%lu hops on thread %d\n", thread[l].hops, l); | ||
153 | }*/ | ||
154 | |||
155 | fprintf(stderr, "time for pointer stressmark = %f seconds.\n", | ||
156 | difftime(endTime, startTime)); | ||
157 | free (field); | ||
158 | free (thread); | ||
159 | WRITE_TO_FILE | ||
160 | 80 | ||
81 | if ((field = (unsigned int *)malloc(f * sizeof(int))) == NULL) | ||
82 | return (-1); | ||
83 | |||
84 | randInit(seed); | ||
85 | for (l = 0; l < f; l++) { | ||
86 | field[l] = randInt(0, f - w); | ||
87 | } | ||
88 | startTime = time(NULL); | ||
89 | clock(); | ||
90 | |||
91 | START_LOOP | ||
92 | for (l = 0; l < n; l++) { | ||
93 | unsigned int index; | ||
94 | unsigned int minStop, maxStop; | ||
95 | unsigned int hops; | ||
96 | |||
97 | hops = 0; | ||
98 | minStop = thread[l].minStop; | ||
99 | maxStop = thread[l].maxStop; | ||
100 | index = thread[l].initial; | ||
101 | while ((hops < maxhops) && (!((index >= minStop) && (index < maxStop)))) { | ||
102 | |||
103 | unsigned int ll, lll; | ||
104 | unsigned int max, min; | ||
105 | unsigned int partition; | ||
106 | unsigned int high; | ||
107 | |||
108 | partition = field[index]; | ||
109 | max = MAX_FIELD_SIZE; | ||
110 | min = 0; | ||
111 | high = 0; | ||
112 | |||
113 | for (ll = 0; ll < w; ll++) { | ||
114 | unsigned int balance; | ||
115 | unsigned int x; | ||
116 | x = field[index + ll]; | ||
117 | |||
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++; | ||
136 | } /* end else */ | ||
137 | } | ||
138 | if (min == max) | ||
139 | break; | ||
140 | } /* end else* */ | ||
141 | index = (partition + hops) % (f - w); | ||
142 | hops++; | ||
143 | } /* end loop ll */ | ||
144 | thread[l].hops = hops; | ||
145 | } /* end while */ | ||
146 | STOP_LOOP | ||
147 | |||
148 | endTime = time(NULL); | ||
149 | |||
150 | volatile int _stop_optimizer = thread[l].hops + l; | ||
151 | /*for (l=0; l<n; l++){ | ||
152 | fprintf(stdout, "%lu hops on thread %d\n", thread[l].hops, l); | ||
153 | }*/ | ||
154 | |||
155 | fprintf(stderr, "time for pointer stressmark = %f seconds.\n", | ||
156 | difftime(endTime, startTime)); | ||
157 | free(field); | ||
158 | free(thread); | ||
159 | WRITE_TO_FILE | ||
161 | } | 160 | } |
diff --git a/dis/Transitive/DISstressmarkRNG.h b/dis/Transitive/DISstressmarkRNG.h index 4aa2620..6243606 100644 --- a/dis/Transitive/DISstressmarkRNG.h +++ b/dis/Transitive/DISstressmarkRNG.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <assert.h> | ||
1 | #include <math.h> | 2 | #include <math.h> |
2 | 3 | ||
3 | #define IA 16807 | 4 | #define IA 16807 |
diff --git a/dis/Transitive/transitive.c b/dis/Transitive/transitive.c index 303216f..51805a6 100644 --- a/dis/Transitive/transitive.c +++ b/dis/Transitive/transitive.c | |||
@@ -1,12 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Sample code for the DIS Transitive Stressmark | 2 | * Sample code for the DIS Transitive Stressmark |
3 | * | 3 | * |
4 | * This source code is the completely correct source code based on | 4 | * This source code is the completely correct source code based on |
5 | * the example codes provided by Atlantic Aerospace Division, Titan | 5 | * the example codes provided by Atlantic Aerospace Division, Titan |
6 | * Systems Corporation, 2000. | 6 | * Systems Corporation, 2000. |
7 | * | 7 | * |
8 | * If you just compile and generate the executables from this source | 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 | 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 | 10 | * understanding of this stressmark, it is strongly suggested that you |
11 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 11 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
12 | * before going on since the detailed comments are given in this documents. | 12 | * before going on since the detailed comments are given in this documents. |
@@ -16,12 +16,12 @@ | |||
16 | * Joshua Bakita, 05/30/2020: Fixed out-of-bounds randInt call | 16 | * Joshua Bakita, 05/30/2020: Fixed out-of-bounds randInt call |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <stdio.h> | ||
20 | #include <time.h> | ||
21 | #include <assert.h> | ||
22 | #include <stdlib.h> | ||
23 | #include "DISstressmarkRNG.h" | 19 | #include "DISstressmarkRNG.h" |
24 | #include "extra.h" | 20 | #include "extra.h" |
21 | #include <assert.h> | ||
22 | #include <stdio.h> | ||
23 | #include <stdlib.h> | ||
24 | #include <time.h> | ||
25 | 25 | ||
26 | #define MIN_VERTICES 8 | 26 | #define MIN_VERTICES 8 |
27 | #define MAX_VERTICES 16384 | 27 | #define MAX_VERTICES 16384 |
@@ -34,11 +34,11 @@ | |||
34 | #define MIN_EDGS 0 | 34 | #define MIN_EDGS 0 |
35 | #define MAX_EDGE 255 | 35 | #define MAX_EDGE 255 |
36 | 36 | ||
37 | /* | 37 | /* |
38 | * main() | 38 | * main() |
39 | */ | 39 | */ |
40 | 40 | ||
41 | int main(int argc, char** argv){ | 41 | int main(int argc, char **argv) { |
42 | unsigned int *din, *dout; | 42 | unsigned int *din, *dout; |
43 | unsigned int n; | 43 | unsigned int n; |
44 | unsigned int m; | 44 | unsigned int m; |
@@ -49,46 +49,46 @@ int main(int argc, char** argv){ | |||
49 | unsigned int sum; | 49 | unsigned int sum; |
50 | volatile int realRes = 0; | 50 | volatile int realRes = 0; |
51 | 51 | ||
52 | assert(fscanf(stdin,"%d %d %d", &n, &m, &seed) == 3); | 52 | assert(fscanf(stdin, "%d %d %d", &n, &m, &seed) == 3); |
53 | 53 | ||
54 | assert((n >= MIN_VERTICES) && (n <= MAX_VERTICES)); | 54 | assert((n >= MIN_VERTICES) && (n <= MAX_VERTICES)); |
55 | assert((m >= MIN_EDGES) && (m <= MAX_EDGES)); | 55 | assert((m >= MIN_EDGES) && (m <= MAX_EDGES)); |
56 | assert(m <= n*n); | 56 | assert(m <= n * n); |
57 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); | 57 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); |
58 | 58 | ||
59 | if ((din = (unsigned int *)malloc(n*n*sizeof(unsigned int))) == NULL) | 59 | if ((din = (unsigned int *)malloc(n * n * sizeof(unsigned int))) == NULL) |
60 | return (-1); | 60 | return (-1); |
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 | for (i = 0; i < n * n; i++) { |
65 | *(din + i) = NO_PATH; | 65 | *(din + i) = NO_PATH; |
66 | *(dout + i) = NO_PATH; | 66 | *(dout + i) = NO_PATH; |
67 | } | 67 | } |
68 | 68 | ||
69 | randInit(seed); | 69 | randInit(seed); |
70 | for (k=0; k<m; k++){ | 70 | for (k = 0; k < m; k++) { |
71 | i = randInt(0, n-1); | 71 | i = randInt(0, n - 1); |
72 | j = randInt(0, n-1); | 72 | j = randInt(0, n - 1); |
73 | *(din + j*n + i) = randInt(MIN_EDGES, MAX_EDGES); | 73 | *(din + j * n + i) = randInt(MIN_EDGES, MAX_EDGES); |
74 | } | 74 | } |
75 | 75 | ||
76 | SET_UP | 76 | SET_UP |
77 | startTime = time(NULL); | 77 | startTime = time(NULL); |
78 | 78 | ||
79 | START_LOOP | 79 | START_LOOP |
80 | for (k=0; k<n; k++){ | 80 | for (k = 0; k < n; k++) { |
81 | unsigned int old; | 81 | unsigned int old; |
82 | unsigned int new1; | 82 | unsigned int new1; |
83 | unsigned int *dtemp; | 83 | unsigned int *dtemp; |
84 | 84 | ||
85 | for (i=0; i<n; i++){ | 85 | for (i = 0; i < n; i++) { |
86 | for (j=0; j<n; j++){ | 86 | for (j = 0; j < n; j++) { |
87 | old = *(din + j*n + i); | 87 | old = *(din + j * n + i); |
88 | new1 = *(din + j*n + k) + *(din + k*n + i); | 88 | new1 = *(din + j * n + k) + *(din + k * n + i); |
89 | *(dout + j*n + i) = (new1 < old ? new1: old); | 89 | *(dout + j * n + i) = (new1 < old ? new1 : old); |
90 | assert(*(dout + j*n + i) <= NO_PATH); | 90 | assert(*(dout + j * n + i) <= NO_PATH); |
91 | assert(*(dout + j*n + i) <= *(din + j*n + i)); | 91 | assert(*(dout + j * n + i) <= *(din + j * n + i)); |
92 | } | 92 | } |
93 | } | 93 | } |
94 | dtemp = dout; | 94 | dtemp = dout; |
@@ -99,35 +99,28 @@ int main(int argc, char** argv){ | |||
99 | STOP_LOOP | 99 | STOP_LOOP |
100 | stopTime = time(NULL); | 100 | stopTime = time(NULL); |
101 | 101 | ||
102 | for (j=0; j<n; j++){ | 102 | for (j = 0; j < n; j++) { |
103 | sum = 0; | 103 | sum = 0; |
104 | for (i=0; i<n; i++){ | 104 | for (i = 0; i < n; i++) { |
105 | if (*(din + j*n + i) != NO_PATH) | 105 | if (*(din + j * n + i) != NO_PATH) |
106 | sum += *(din + j*n + i); | 106 | sum += *(din + j * n + i); |
107 | } | 107 | } |
108 | realRes+=sum; | 108 | realRes += sum; |
109 | //fprintf(stdout, "%u ", sum); | 109 | // fprintf(stdout, "%u ", sum); |
110 | } | 110 | } |
111 | for (i=0; i<n; i++){ | 111 | for (i = 0; i < n; i++) { |
112 | sum = 0; | 112 | sum = 0; |
113 | for (j=0; j<n; j++){ | 113 | for (j = 0; j < n; j++) { |
114 | if (*(din + j*n + i) != NO_PATH) | 114 | if (*(din + j * n + i) != NO_PATH) |
115 | sum += *(din+j*n+i); | 115 | sum += *(din + j * n + i); |
116 | } | 116 | } |
117 | realRes+=sum; | 117 | realRes += sum; |
118 | //fprintf(stdout, "%u ", sum); | 118 | // fprintf(stdout, "%u ", sum); |
119 | } | 119 | } |
120 | fprintf(stderr, "time for transitive stressmark = %f seconds.\n", | 120 | fprintf(stderr, "time for transitive stressmark = %f seconds.\n", |
121 | difftime(stopTime, startTime)); | 121 | difftime(stopTime, startTime)); |
122 | free(din); | 122 | free(din); |
123 | free(dout); | 123 | free(dout); |
124 | WRITE_TO_FILE | 124 | WRITE_TO_FILE |
125 | return(0); | 125 | return (0); |
126 | } | 126 | } |
127 | |||
128 | |||
129 | |||
130 | |||
131 | |||
132 | |||
133 | |||
diff --git a/dis/Update/DISstressmarkRNG.h b/dis/Update/DISstressmarkRNG.h index 4aa2620..6243606 100644 --- a/dis/Update/DISstressmarkRNG.h +++ b/dis/Update/DISstressmarkRNG.h | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <assert.h> | ||
1 | #include <math.h> | 2 | #include <math.h> |
2 | 3 | ||
3 | #define IA 16807 | 4 | #define IA 16807 |
diff --git a/dis/Update/update.c b/dis/Update/update.c index f5e770a..a12c3df 100644 --- a/dis/Update/update.c +++ b/dis/Update/update.c | |||
@@ -1,24 +1,24 @@ | |||
1 | /* | 1 | /* |
2 | * Sample code for the DIS Update Stressmark | 2 | * Sample code for the DIS Update Stressmark |
3 | * | 3 | * |
4 | * This source code is the completely correct source code based on | 4 | * This source code is the completely correct source code based on |
5 | * the example codes provided by Atlantic Aerospace Division, Titan | 5 | * the example codes provided by Atlantic Aerospace Division, Titan |
6 | * Systems Corporation, 2000. | 6 | * Systems Corporation, 2000. |
7 | * | 7 | * |
8 | * If you just compile and generate the executables from this source | 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 | 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 | 10 | * understanding of this stressmark, it is strongly suggested that you |
11 | * read the Benchmark Analysis and Specifications Document Version 1.0 | 11 | * read the Benchmark Analysis and Specifications Document Version 1.0 |
12 | * before going on since the detailed comments are given in this documents. | 12 | * before going on since the detailed comments are given in this documents. |
13 | * the comments are not repeated here. | 13 | * the comments are not repeated here. |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include "DISstressmarkRNG.h" | ||
17 | #include "extra.h" | ||
18 | #include <assert.h> | ||
16 | #include <stdio.h> | 19 | #include <stdio.h> |
17 | #include <stdlib.h> | 20 | #include <stdlib.h> |
18 | #include <time.h> | 21 | #include <time.h> |
19 | #include<assert.h> | ||
20 | #include "DISstressmarkRNG.h" | ||
21 | #include "extra.h" | ||
22 | 22 | ||
23 | #define MIN_FIELD_SIZE 16 | 23 | #define MIN_FIELD_SIZE 16 |
24 | 24 | ||
@@ -36,11 +36,11 @@ | |||
36 | 36 | ||
37 | #define MAX_SEED -1 | 37 | #define MAX_SEED -1 |
38 | 38 | ||
39 | /* | 39 | /* |
40 | *main() | 40 | *main() |
41 | */ | 41 | */ |
42 | 42 | ||
43 | int main(int argc, char** argv){ | 43 | int main(int argc, char **argv) { |
44 | 44 | ||
45 | unsigned int *field; | 45 | unsigned int *field; |
46 | unsigned int f; | 46 | unsigned int f; |
@@ -55,13 +55,13 @@ int main(int argc, char** argv){ | |||
55 | unsigned int hops; | 55 | unsigned int hops; |
56 | unsigned int l; | 56 | unsigned int l; |
57 | 57 | ||
58 | assert(fscanf(stdin, "%u %u %u %d %u %u %u", | 58 | assert(fscanf(stdin, "%u %u %u %d %u %u %u", &f, &l, &maxhops, &seed, |
59 | &f, &l, &maxhops, &seed, &initial, &minStop, &maxStop) == 7); | 59 | &initial, &minStop, &maxStop) == 7); |
60 | 60 | ||
61 | assert((f >= MIN_FIELD_SIZE) && (f <= MAX_FIELD_SIZE)); | 61 | assert((f >= MIN_FIELD_SIZE) && (f <= MAX_FIELD_SIZE)); |
62 | w = (unsigned int )l; | 62 | w = (unsigned int)l; |
63 | assert((w >= MIN_WINDOW_SIZE) && (w <= MAX_WINDOW_SIZE)); | 63 | assert((w >= MIN_WINDOW_SIZE) && (w <= MAX_WINDOW_SIZE)); |
64 | assert(w%2 == 1); | 64 | assert(w % 2 == 1); |
65 | assert(f > w); | 65 | assert(f > w); |
66 | assert((maxhops >= MIN_HOP_LIMIT) && (maxhops <= MAX_HOP_LIMIT)); | 66 | assert((maxhops >= MIN_HOP_LIMIT) && (maxhops <= MAX_HOP_LIMIT)); |
67 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); | 67 | assert((seed >= MIN_SEED) && (seed <= MAX_SEED)); |
@@ -69,14 +69,14 @@ int main(int argc, char** argv){ | |||
69 | assert((minStop >= 0) && (minStop < f)); | 69 | assert((minStop >= 0) && (minStop < f)); |
70 | assert((maxStop >= 0) && (maxStop < f)); | 70 | assert((maxStop >= 0) && (maxStop < f)); |
71 | 71 | ||
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 | randInit(seed); | 75 | randInit(seed); |
76 | for (l=0; l<f; l++){ | 76 | for (l = 0; l < f; l++) { |
77 | field[l] = randInt(0, f-w); | 77 | field[l] = randInt(0, f - w); |
78 | } | 78 | } |
79 | 79 | ||
80 | SET_UP | 80 | SET_UP |
81 | startTime = time(NULL); | 81 | startTime = time(NULL); |
82 | 82 | ||
@@ -84,9 +84,7 @@ int main(int argc, char** argv){ | |||
84 | index = initial; | 84 | index = initial; |
85 | 85 | ||
86 | START_LOOP | 86 | START_LOOP |
87 | while ((hops < maxhops) && | 87 | while ((hops < maxhops) && (!((index >= minStop) && (index < maxStop)))) { |
88 | (!((index >= minStop) && | ||
89 | (index < maxStop)))){ | ||
90 | int sum; | 88 | int sum; |
91 | 89 | ||
92 | unsigned int ll, lll; | 90 | unsigned int ll, lll; |
@@ -98,43 +96,47 @@ int main(int argc, char** argv){ | |||
98 | high = 0; | 96 | high = 0; |
99 | sum = 0; | 97 | sum = 0; |
100 | 98 | ||
101 | for (ll=0; ll<w; ll++){ | 99 | for (ll = 0; ll < w; ll++) { |
102 | unsigned int balance; | 100 | unsigned int balance; |
103 | unsigned int x; | 101 | unsigned int x; |
104 | x = field[index+ll]; | 102 | x = field[index + ll]; |
105 | sum += x; | 103 | sum += x; |
106 | 104 | ||
107 | if (x > max) high++; | 105 | if (x > max) |
108 | else if (x >min){ /* start else* */ | 106 | high++; |
109 | partition = x; | 107 | else if (x > min) { /* start else* */ |
110 | balance = 0; | 108 | partition = x; |
111 | for (lll=ll+1; lll<w; lll++){ | 109 | balance = 0; |
112 | if (field[index+lll] > partition) balance++; | 110 | for (lll = ll + 1; lll < w; lll++) { |
113 | } | 111 | if (field[index + lll] > partition) |
114 | if (balance+high == w/2) break; | 112 | balance++; |
115 | else if (balance+high>w/2){ | 113 | } |
116 | min = partition; | 114 | if (balance + high == w / 2) |
117 | }/* end if */ | 115 | break; |
118 | else{ | 116 | else if (balance + high > w / 2) { |
119 | max = partition; | 117 | min = partition; |
120 | high++; | 118 | } /* end if */ |
121 | } /* end else */ | 119 | else { |
120 | max = partition; | ||
121 | high++; | ||
122 | } /* end else */ | ||
122 | } | 123 | } |
123 | if (min == max) break; | 124 | if (min == max) |
124 | }/* end else* */ | 125 | break; |
125 | field[index] = sum % (f-w); | 126 | } /* end else* */ |
126 | index = (partition+hops)%(f-w); | 127 | field[index] = sum % (f - w); |
128 | index = (partition + hops) % (f - w); | ||
127 | hops++; | 129 | hops++; |
128 | }/* end for loop */ | 130 | } /* end for loop */ |
129 | STOP_LOOP | 131 | STOP_LOOP |
130 | 132 | ||
131 | endTime = time(NULL); | 133 | endTime = time(NULL); |
132 | 134 | ||
133 | volatile int _stop_optimizer = hops; | 135 | volatile int _stop_optimizer = hops; |
134 | //fprintf(stdout, "%u hops\n", hops); | 136 | // fprintf(stdout, "%u hops\n", hops); |
135 | fprintf(stderr, "time for update stressmark = %f seconds.\n", | 137 | fprintf(stderr, "time for update stressmark = %f seconds.\n", |
136 | difftime(endTime, startTime)); | 138 | difftime(endTime, startTime)); |
137 | free(field); | 139 | free(field); |
138 | WRITE_TO_FILE | 140 | WRITE_TO_FILE |
139 | return(1); | 141 | return (1); |
140 | } | 142 | } |