From c0078554ad734addc344cb09494faf3718b11a1b Mon Sep 17 00:00:00 2001
From: Daniel Maier <daniel.maier@tu-berlin.de>
Date: Sat, 3 Nov 2018 10:19:01 +0100
Subject: [PATCH] error calculation using capped mre

---
 codes/2mm/2mm.c                       | 11 +++++++----
 codes/3mm/3mm.c                       | 11 +++++++----
 codes/adi/adi.c                       | 11 +++++++----
 codes/covariance/covariance.c         | 11 +++++++----
 codes/deriche/deriche.c               | 11 +++++++----
 codes/doitgen/doitgen.c               | 11 +++++++----
 codes/fdtd-2d/fdtd-2d.c               | 25 ++++++++++++++++---------
 codes/floyd-warshall/floyd-warshall.c | 25 +++++++++++++++----------
 codes/gemm/gemm.c                     | 11 +++++++----
 codes/gemver/gemver.c                 |  8 +++++---
 codes/gesummv/gesummv.c               |  8 +++++---
 codes/heat-3d/heat-3d.c               | 10 +++++++---
 codes/jacobi-1d/jacobi-1d.c           |  6 ++++--
 codes/jacobi-2d/jacobi-2d.c           | 11 +++++++----
 codes/seidel-2d/seidel-2d.c           | 11 +++++++----
 codes/symm/symm.c                     | 11 +++++++----
 codes/syr2k/syr2k.c                   | 11 +++++++----
 codes/syrk/syrk.c                     | 11 +++++++----
 codes/trmm/trmm.c                     | 11 +++++++----
 19 files changed, 143 insertions(+), 82 deletions(-)

diff --git a/codes/2mm/2mm.c b/codes/2mm/2mm.c
index 7c78512..db4bf9a 100644
--- a/codes/2mm/2mm.c
+++ b/codes/2mm/2mm.c
@@ -77,15 +77,18 @@ void calc_error(int ni, int nl,
 		 DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
 {
     int i;
+    int n = ni*nl;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(D[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < ni*nl; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= ni*nl;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/3mm/3mm.c b/codes/3mm/3mm.c
index bbf5720..0b22953 100644
--- a/codes/3mm/3mm.c
+++ b/codes/3mm/3mm.c
@@ -73,15 +73,18 @@ void calc_error(int ni, int nl,
 		 DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
 {
     int i;
+    int n = ni*nl;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(D[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < ni*nl; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= ni*nl;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/adi/adi.c b/codes/adi/adi.c
index 8bd7b05..08f3e2e 100644
--- a/codes/adi/adi.c
+++ b/codes/adi/adi.c
@@ -64,15 +64,18 @@ void calc_error (int n,
 		 DATA_TYPE POLYBENCH_2D(u,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(u[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/covariance/covariance.c b/codes/covariance/covariance.c
index 3c5a7fe..8f8c98b 100644
--- a/codes/covariance/covariance.c
+++ b/codes/covariance/covariance.c
@@ -65,15 +65,18 @@ void calc_error(int m,
 		 DATA_TYPE POLYBENCH_2D(cov,M,M,m,m))
 {
     int i, j;
+    int n = m*m;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(cov[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < m*m; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= m*m;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/deriche/deriche.c b/codes/deriche/deriche.c
index 29c2270..0c0be9b 100644
--- a/codes/deriche/deriche.c
+++ b/codes/deriche/deriche.c
@@ -66,15 +66,18 @@ void calc_error(int w, int h,
 		 DATA_TYPE POLYBENCH_2D(imgOut,W,H,w,h))
 {
     int i;
+    int n = w*h;
     double err = 0;
     float *accurate = &_binary_data_bin_start;
     float *test = &(imgOut[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < w*h; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= w*h;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/doitgen/doitgen.c b/codes/doitgen/doitgen.c
index 392b054..8cc4746 100644
--- a/codes/doitgen/doitgen.c
+++ b/codes/doitgen/doitgen.c
@@ -67,15 +67,18 @@ void calc_error(int nr, int nq, int np,
 		 DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np))
 {
     int i;
+    int n = nr*nq*np;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < nr*nq*np; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= nr*nq*np;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/fdtd-2d/fdtd-2d.c b/codes/fdtd-2d/fdtd-2d.c
index 8a7ffc4..ba3e2da 100644
--- a/codes/fdtd-2d/fdtd-2d.c
+++ b/codes/fdtd-2d/fdtd-2d.c
@@ -95,33 +95,40 @@ void calc_error(int nx,
 		 DATA_TYPE POLYBENCH_2D(hz,NX,NY,nx,ny))
 {
     int i;
+    int n = nx*ny;
     double err = 0;
 
     {
         double *accurate = &_binary_data_ex_bin_start;
         double *test = &(ex[0][0]);
 
-        /* calculate the mean squared error */
-        for(i = 0; i < nx*ny; i++) {
-            err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        for(i = 0; i < n; i++) {
+            double e = fabs((accurate[i] - test[i])/accurate[i]);
+            if(e > 1)
+                e = 1;
+            err += e;
         }
     }
     {
         double *accurate = &_binary_data_ey_bin_start;
         double *test = &(ey[0][0]);
 
-        /* calculate the mean squared error */
-        for(i = 0; i < nx*ny; i++) {
-            err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        for(i = 0; i < n; i++) {
+            double e = fabs((accurate[i] - test[i])/accurate[i]);
+            if(e > 1)
+                e = 1;
+            err += e;
         }
     }
     {
         double *accurate = &_binary_data_hz_bin_start;
         double *test = &(hz[0][0]);
 
-        /* calculate the mean squared error */
-        for(i = 0; i < nx*ny; i++) {
-            err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        for(i = 0; i < n; i++) {
+            double e = fabs((accurate[i] - test[i])/accurate[i]);
+            if(e > 1)
+                e = 1;
+            err += e;
         }
     }
 
diff --git a/codes/floyd-warshall/floyd-warshall.c b/codes/floyd-warshall/floyd-warshall.c
index ecd1626..e8138c8 100644
--- a/codes/floyd-warshall/floyd-warshall.c
+++ b/codes/floyd-warshall/floyd-warshall.c
@@ -64,15 +64,20 @@ static
 void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(path,N,N,n,n))
 {
-  double err = 0;
-  int *accurate = &_binary_data_bin_start;
-  int *test = &(path[0][0]);
-
-  for (int i = 0; i < n*n; i++) {
-      err += (accurate[i] - test[i]) * (accurate[i] - test[i]);
-  }
-  err /= n*n;
-  printf("error: %f\n", err);
+    int i;
+    int n = n*n;
+    double err = 0;
+    int *accurate = &_binary_data_bin_start;
+    int *test = &(path[0][0]);
+
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
+    }
+    err /= n;
+    printf("error: %f\n", err);
 }
 
 
@@ -85,7 +90,7 @@ void kernel_floyd_warshall(int n,
   int i, j, k;
 
 #pragma scop
-  for (k = 0; k < _PB_N; k++)
+  for (k = 0; k < n; k++)
     {
       for(i = 0; i < _PB_N; i++)
 	for (j = 0; j < _PB_N; j++)
diff --git a/codes/gemm/gemm.c b/codes/gemm/gemm.c
index 37f8fd8..b7a73ef 100644
--- a/codes/gemm/gemm.c
+++ b/codes/gemm/gemm.c
@@ -73,15 +73,18 @@ void calc_error(int ni, int nj,
 		 DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj))
 {
     int i;
+    int n = ni*nj;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < ni*nj; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= ni*nj;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/gemver/gemver.c b/codes/gemver/gemver.c
index 8c30035..ad8ec47 100644
--- a/codes/gemver/gemver.c
+++ b/codes/gemver/gemver.c
@@ -89,9 +89,11 @@ void calc_error(int n,
     double *accurate = &_binary_data_bin_start;
     double *test = &(w[0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
     err /= n;
     printf("error: %f\n", err);
diff --git a/codes/gesummv/gesummv.c b/codes/gesummv/gesummv.c
index fe523fe..b21dbe9 100644
--- a/codes/gesummv/gesummv.c
+++ b/codes/gesummv/gesummv.c
@@ -76,9 +76,11 @@ void calc_error(int n,
     double *accurate = &_binary_data_bin_start;
     double *test = &(y[0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
     err /= n;
     printf("error: %f\n", err);
diff --git a/codes/heat-3d/heat-3d.c b/codes/heat-3d/heat-3d.c
index f171a17..85914fd 100644
--- a/codes/heat-3d/heat-3d.c
+++ b/codes/heat-3d/heat-3d.c
@@ -65,15 +65,19 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_3D(A,N,N,N,n,n,n))
 {
     int i;
+    int n = n*n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0][0]);
 
     /* calculate the mean squared error */
-    for(i = 0; i < n*n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/jacobi-1d/jacobi-1d.c b/codes/jacobi-1d/jacobi-1d.c
index 6cd537c..c77e4e1 100644
--- a/codes/jacobi-1d/jacobi-1d.c
+++ b/codes/jacobi-1d/jacobi-1d.c
@@ -69,9 +69,11 @@ void calc_error(int n,
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0]);
 
-    /* calculate the mean squared error */
     for(i = 0; i < n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
     err /= n;
     printf("error: %f\n", err);
diff --git a/codes/jacobi-2d/jacobi-2d.c b/codes/jacobi-2d/jacobi-2d.c
index 5dc7edf..643c6c6 100644
--- a/codes/jacobi-2d/jacobi-2d.c
+++ b/codes/jacobi-2d/jacobi-2d.c
@@ -66,15 +66,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/seidel-2d/seidel-2d.c b/codes/seidel-2d/seidel-2d.c
index 2debc95..0d6ba05 100644
--- a/codes/seidel-2d/seidel-2d.c
+++ b/codes/seidel-2d/seidel-2d.c
@@ -62,15 +62,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/symm/symm.c b/codes/symm/symm.c
index ea286ad..f167ef9 100644
--- a/codes/symm/symm.c
+++ b/codes/symm/symm.c
@@ -75,15 +75,18 @@ void calc_error(int m, int n,
 		 DATA_TYPE POLYBENCH_2D(C,M,N,m,n))
 {
     int i, j;
+    int n = m*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < m*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= m*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/syr2k/syr2k.c b/codes/syr2k/syr2k.c
index 0647acc..60438f3 100644
--- a/codes/syr2k/syr2k.c
+++ b/codes/syr2k/syr2k.c
@@ -73,15 +73,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/syrk/syrk.c b/codes/syrk/syrk.c
index 1db7bc1..3c95aa2 100644
--- a/codes/syrk/syrk.c
+++ b/codes/syrk/syrk.c
@@ -69,15 +69,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/trmm/trmm.c b/codes/trmm/trmm.c
index 062cf1e..c1d287f 100644
--- a/codes/trmm/trmm.c
+++ b/codes/trmm/trmm.c
@@ -71,15 +71,18 @@ void calc_error(int m, int n,
 		 DATA_TYPE POLYBENCH_2D(B,M,N,m,n))
 {
     int i;
+    int n = m*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(B[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < m*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= m*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
-- 
GitLab