diff options
Diffstat (limited to 'benchmarks/polybench-syn/linear-algebra/solvers')
5 files changed, 141 insertions, 120 deletions
diff --git a/benchmarks/polybench-syn/linear-algebra/solvers/cholesky.c b/benchmarks/polybench-syn/linear-algebra/solvers/cholesky.c index 264251d..05e85ea 100644 --- a/benchmarks/polybench-syn/linear-algebra/solvers/cholesky.c +++ b/benchmarks/polybench-syn/linear-algebra/solvers/cholesky.c @@ -9,7 +9,7 @@ */ /* cholesky.c: this file is part of PolyBench/C */ -#include <stdio.h> +#include "../../include/misc.h" # define SQRT_FUN(x) sqrtf(x) @@ -24,7 +24,7 @@ void init_array(int n, for (i = 0; i < n; plus(i)) { for (j = 0; j <= i; plus(j)) - A[i][j] = (int)(-j % n) / n + ONE; + A[i][j] = (int)sdivider(smodulo(-j, n), n) + ONE; for (j = i + ONE; j < n; plus(j)) { A[i][j] = 0; } @@ -76,34 +76,30 @@ void kernel_cholesky(int n, int i, j, k; int ONE = 1; -#pragma scop - for (i = 0; i < n; plus(i)) { - - for (j = 0; j < i; plus(j)) { - for (k = 0; k < j; plus(k)) { - A[i][j] -= A[i][k] * A[j][k]; - } - A[i][j] /= A[j][j]; - } - - for (k = 0; k < i; plus(k)) { - A[i][i] -= A[i][k] * A[i][k]; - } - int sq = 0; int val = 0; int cmp = A[i][i]; - printf("cmp %d\n",cmp); - while(sq <= cmp) { - val = val + ONE; - sq = val * val; - } - printf("val %d\n",val); - A[i][i] = val; - } -#pragma endscop + for (i = 0; i < n; plus(i)) { + + for (j = 0; j < i; plus(j)) { + for (k = 0; k < j; plus(k)) { + A[i][j] -= A[i][k] * A[j][k]; + } + A[i][j] = sdivider(A[i][j] ,A[j][j]); + } + + for (k = 0; k < i; plus(k)) { + A[i][i] -= A[i][k] * A[i][k]; + } + int sq = 0; int val = 0; int cmp = A[i][i]; + while(sq <= cmp) { + val = val + ONE; + sq = val * val; + } + A[i][i] = val; + } } -int main(int argc, char** argv) +int main() { int n = 40; @@ -112,7 +108,7 @@ int main(int argc, char** argv) int A[40][40]; - //init_array (n, A); + init_array (n, A); kernel_cholesky (n, A); diff --git a/benchmarks/polybench-syn/linear-algebra/solvers/durbin.c b/benchmarks/polybench-syn/linear-algebra/solvers/durbin.c index 92afb09..5c853a7 100644 --- a/benchmarks/polybench-syn/linear-algebra/solvers/durbin.c +++ b/benchmarks/polybench-syn/linear-algebra/solvers/durbin.c @@ -52,6 +52,45 @@ int sdivider(int N, int D) { } } +unsigned int divider(unsigned int x, unsigned int y) +{ + unsigned int r0, q0, y0, y1; + + r0 = x; + q0 = 0; + y0 = y; + y1 = y; + do + { + y1 = 2 * y1; + } while (y1 <= x); + do + { + y1 = y1 / 2; + q0 = 2 * q0; + if (r0 >= y1) + { + r0 = r0 - y1; + q0 = q0 + 1; + } + } while ((int)y1 != (int)y0); + return q0; +} + +int sdivider(int N, int D) { + if (D < 0) { + if (N < 0) + return divider(-N, -D); + else + return -divider(N, -D); + } else { + if (N < 0) + return -divider(-N, D); + else + return divider(N, D); + } +} + #define plus(i) i = i + ONE /* Include polybench common header. */ static @@ -59,7 +98,7 @@ void init_array (int n, int r[ 40 + 0]) { int ONE = 1; - int i, j; + int i; for (i = 0; i < n; plus(i)) { @@ -85,6 +124,7 @@ int print_array(int n, #ifndef SYNTHESIS printf("finished = %u\n", res); #endif + return res; } @@ -110,8 +150,7 @@ void kernel_durbin(int n, for (i=0; i<k; plus(i)) { sum += r[k-i-ONE]*y[i]; } - //alpha = - sdivider(r[k] + sum, beta); - alpha = - (r[k] + sum) / beta; + alpha = - sdivider(r[k] + sum, beta); for (i=0; i<k; plus(i)) { z[i] = y[i] + alpha*y[k-i-ONE]; diff --git a/benchmarks/polybench-syn/linear-algebra/solvers/lu.c b/benchmarks/polybench-syn/linear-algebra/solvers/lu.c index 1cf07ea..56dadd7 100644 --- a/benchmarks/polybench-syn/linear-algebra/solvers/lu.c +++ b/benchmarks/polybench-syn/linear-algebra/solvers/lu.c @@ -14,6 +14,8 @@ //#include <string.h> //#include <math.h> +#include "../../include/misc.h" + #define plus(i) i = i + ONE static @@ -26,7 +28,7 @@ void init_array (int n, for (i = 0; i < n; plus(i)) { for (j = 0; j <= i; plus(j)) - A[i][j] = (int)(-j % n) / n + ONE; + A[i][j] = sdivider(smodulo(-j, n), n) + ONE; for (j = plus(i); j < n; plus(j)) { A[i][j] = 0; } @@ -82,13 +84,12 @@ void kernel_lu(int n, int i, j, k; int ONE = 1; -#pragma scop for (i = 0; i < n; plus(i)) { for (j = 0; j <i; plus(j)) { for (k = 0; k < j; plus(k)) { A[i][j] -= A[i][k] * A[k][j]; } - A[i][j] /= A[j][j]; + A[i][j] = sdivider(A[i][j], A[j][j]); } for (j = i; j < n; plus(j)) { for (k = 0; k < i; plus(k)) { @@ -96,7 +97,6 @@ void kernel_lu(int n, } } } -#pragma endscop } static @@ -128,19 +128,9 @@ int main() - //print_array(n, A); - // polybench_timer_start();; - - kernel_lu (n, A); - // polybench_timer_stop();; - // polybench_timer_print();; - - - - //if (argc > 42 && ! strcmp(argv[0], "")) return check_array(n, A); return 0; diff --git a/benchmarks/polybench-syn/linear-algebra/solvers/ludcmp.c b/benchmarks/polybench-syn/linear-algebra/solvers/ludcmp.c index e85316a..f37d983 100644 --- a/benchmarks/polybench-syn/linear-algebra/solvers/ludcmp.c +++ b/benchmarks/polybench-syn/linear-algebra/solvers/ludcmp.c @@ -9,37 +9,37 @@ */ /* ludcmp.c: this file is part of PolyBench/C */ +#include "../../include/misc.h" + #define plus(i) i = i + ONE -static + static void init_array (int n, - int A[ 40 + 0][40 + 0], - int b[ 40 + 0], - int x[ 40 + 0], - int y[ 40 + 0]) + int A[ 40 + 0][40 + 0], + int b[ 40 + 0], + int x[ 40 + 0], + int y[ 40 + 0]) { int i, j; int ONE = 1; - int TWO = 2; - int FOUR = 4; int fn = (int)n; for (i = 0; i < n; plus(i)) - { - x[i] = 0; - y[i] = 0; - b[i] = (i+ONE)/fn/(TWO) + (FOUR); - } + { + x[i] = 0; + y[i] = 0; + b[i] = divider(i+1, fn*2) + 4; + } for (i = 0; i < n; plus(i)) - { - for (j = 0; j <= i; plus(j)) - A[i][j] = (int)(-j % n) / n + ONE; - for (j = i+ONE; j < n; plus(j)) { - A[i][j] = 0; - } - A[i][i] = 1; + { + for (j = 0; j <= i; plus(j)) + A[i][j] = (int)sdivider(smodulo(-j, n), n) + 1; + for (j = i+ONE; j < n; plus(j)) { + A[i][j] = 0; } + A[i][i] = 1; + } @@ -51,19 +51,19 @@ void init_array (int n, for (t = 0; t < n; plus(t)) for (r = 0; r < n; plus(r)) for (s = 0; s < n; plus(s)) - B[r][s] += A[r][t] * A[s][t]; - for (r = 0; r < n; plus(r)) - for (s = 0; s < n; plus(s)) - A[r][s] = B[r][s]; + B[r][s] += A[r][t] * A[s][t]; + for (r = 0; r < n; plus(r)) + for (s = 0; s < n; plus(s)) + A[r][s] = B[r][s]; } -static + static int check_array(int n, - int x[ 40 + 0]) + int x[ 40 + 0]) { int i; @@ -71,7 +71,7 @@ int check_array(int n, int res = 0; for (i = 0; i < n; plus(i)) { - res += x[i]; + res += x[i]; } return res; } @@ -79,50 +79,48 @@ int check_array(int n, -static + static void kernel_ludcmp(int n, - int A[ 40 + 0][40 + 0], - int b[ 40 + 0], - int x[ 40 + 0], - int y[ 40 + 0]) + int A[ 40 + 0][40 + 0], + int b[ 40 + 0], + int x[ 40 + 0], + int y[ 40 + 0]) { int i, j, k; int ONE = 1; int w; -#pragma scop - for (i = 0; i < n; plus(i)) { + for (i = 0; i < n; plus(i)) { for (j = 0; j <i; plus(j)) { - w = A[i][j]; - for (k = 0; k < j; plus(k)) { - w -= A[i][k] * A[k][j]; - } - A[i][j] = w / A[j][j]; + w = A[i][j]; + for (k = 0; k < j; plus(k)) { + w -= A[i][k] * A[k][j]; + } + A[i][j] = sdivider(w, A[j][j]); } - for (j = i; j < n; plus(j)) { - w = A[i][j]; - for (k = 0; k < i; plus(k)) { - w -= A[i][k] * A[k][j]; - } - A[i][j] = w; + for (j = i; j < n; plus(j)) { + w = A[i][j]; + for (k = 0; k < i; plus(k)) { + w -= A[i][k] * A[k][j]; + } + A[i][j] = w; } } for (i = 0; i < n; plus(i)) { - w = b[i]; - for (j = 0; j < i; plus(j)) - w -= A[i][j] * y[j]; - y[i] = w; + w = b[i]; + for (j = 0; j < i; plus(j)) + w -= A[i][j] * y[j]; + y[i] = w; } - for (i = n-ONE; i >=0; i=i-ONE) { - w = y[i]; - for (j = i+ONE; j < n; plus(j)) - w -= A[i][j] * x[j]; - x[i] = w / A[i][i]; + for (i = n-ONE; i >=0; i=i-ONE) { + w = y[i]; + for (j = i+ONE; j < n; plus(j)) + w -= A[i][j] * x[j]; + x[i] = sdivider(w, A[i][i]); } -#pragma endscop } @@ -131,7 +129,6 @@ int main() { int n = 40; - int ONE = 1; int A[40 + 0][40 + 0]; @@ -142,20 +139,17 @@ int main() init_array (n, - A, - b, - x, - y); - - - ; + A, + b, + x, + y); kernel_ludcmp (n, - A, - b, - x, - y); + A, + b, + x, + y); return check_array(n, x); diff --git a/benchmarks/polybench-syn/linear-algebra/solvers/trisolv.c b/benchmarks/polybench-syn/linear-algebra/solvers/trisolv.c index 5e760e6..8e76231 100644 --- a/benchmarks/polybench-syn/linear-algebra/solvers/trisolv.c +++ b/benchmarks/polybench-syn/linear-algebra/solvers/trisolv.c @@ -9,6 +9,8 @@ */ /* trisolv.c: this file is part of PolyBench/C */ +#include "../../include/misc.h" + #define plus(i) i = i + ONE static void init_array(int n, @@ -24,7 +26,7 @@ void init_array(int n, x[i] = - 999; b[i] = i ; for (j = 0; j <= i; plus(j)) - L[i][j] = (int) (i+n-j+ONE)*(ONE+ONE)/n; + L[i][j] = (int) divider((i+n-j+ONE)*(ONE+ONE), n); } } @@ -57,15 +59,15 @@ void kernel_trisolv(int n, int i, j; int ONE = 1; -#pragma scop - for (i = 0; i < n; plus(i)) - { - x[i] = b[i]; - for (j = 0; j <i; plus(j)) - x[i] -= L[i][j] * x[j]; - x[i] = x[i] / L[i][i]; - } -#pragma endscop + for (i = 0; i < n; plus(i)) + { + x[i] = b[i]; + for (j = 0; j <i; plus(j)) + x[i] -= L[i][j] * x[j]; + + x[i] = divider(x[i],L[i][i]); + + } } |