[Beignet] [PATCH V2] Utest: Add result error tolerance for float data types

grigore.lupescu at intel.com grigore.lupescu at intel.com
Wed Apr 13 10:28:41 UTC 2016


From: Grigore Lupescu <grigore.lupescu at intel.com>

Modification affects only workgroup reduce, scan inclusive, scan exclusive, on non integer type
In some instances results may differ slightly between CPU and GPU hence comparison is relaxed

Signed-off-by: Grigore Lupescu <grigore.lupescu at intel.com>
---
 utests/compiler_workgroup_reduce.cpp         | 27 ++++++++++++++++++++++-----
 utests/compiler_workgroup_scan_exclusive.cpp | 27 ++++++++++++++++++++++-----
 utests/compiler_workgroup_scan_inclusive.cpp | 27 ++++++++++++++++++++++-----
 3 files changed, 66 insertions(+), 15 deletions(-)

diff --git a/utests/compiler_workgroup_reduce.cpp b/utests/compiler_workgroup_reduce.cpp
index f796d5c..1624947 100644
--- a/utests/compiler_workgroup_reduce.cpp
+++ b/utests/compiler_workgroup_reduce.cpp
@@ -173,14 +173,31 @@ static void workgroup_generic(WG_FUNCTION wg_func,
   for (uint32_t i = 0; i < WG_GLOBAL_SIZE; i++)
     if(((T *)buf_data[1])[i] != *(expected + i))
     {
-      /* found mismatch, increment */
-      mismatches++;
+      /* found mismatch on integer, increment */
+      if(numeric_limits<T>::is_integer){
+        mismatches++;
 
 #if DEBUG_STDOUT
-      /* output mismatch */
-      cout << "Err at " << i << ", " <<
-        ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
+        /* output mismatch */
+        cout << "Err at " << i << ", " <<
+          ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
 #endif
+      }
+      /* float error is tolerable though */
+      else {
+          float num_computed = ((T *)buf_data[1])[i];
+          float num_expected = *(expected + i);
+          float num_diff = abs(num_computed - num_expected) / abs(num_expected);
+          if(num_diff > 0.01f){
+            mismatches++;
+
+#if DEBUG_STDOUT
+          /* output mismatch */
+          cout << "Err at " << i << ", " <<
+            ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
+#endif
+        }
+      }
     }
 
 #if DEBUG_STDOUT
diff --git a/utests/compiler_workgroup_scan_exclusive.cpp b/utests/compiler_workgroup_scan_exclusive.cpp
index c44c098..4ff5442 100644
--- a/utests/compiler_workgroup_scan_exclusive.cpp
+++ b/utests/compiler_workgroup_scan_exclusive.cpp
@@ -157,14 +157,31 @@ static void workgroup_generic(WG_FUNCTION wg_func,
   for (uint32_t i = 0; i < WG_GLOBAL_SIZE; i++)
     if(((T *)buf_data[1])[i] != *(expected + i))
     {
-      /* found mismatch, increment */
-      mismatches++;
+      /* found mismatch on integer, increment */
+      if(numeric_limits<T>::is_integer){
+        mismatches++;
 
 #if DEBUG_STDOUT
-      /* output mismatch */
-      cout << "Err at " << i << ", " <<
-        ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
+        /* output mismatch */
+        cout << "Err at " << i << ", " <<
+          ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
 #endif
+      }
+      /* float error is tolerable though */
+      else {
+          float num_computed = ((T *)buf_data[1])[i];
+          float num_expected = *(expected + i);
+          float num_diff = abs(num_computed - num_expected) / abs(num_expected);
+          if(num_diff > 0.01f){
+            mismatches++;
+
+#if DEBUG_STDOUT
+          /* output mismatch */
+          cout << "Err at " << i << ", " <<
+            ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
+#endif
+        }
+      }
     }
 
 #if DEBUG_STDOUT
diff --git a/utests/compiler_workgroup_scan_inclusive.cpp b/utests/compiler_workgroup_scan_inclusive.cpp
index b4501b8..1a7477f 100644
--- a/utests/compiler_workgroup_scan_inclusive.cpp
+++ b/utests/compiler_workgroup_scan_inclusive.cpp
@@ -147,14 +147,31 @@ static void workgroup_generic(WG_FUNCTION wg_func,
   for (uint32_t i = 0; i < WG_GLOBAL_SIZE; i++)
     if(((T *)buf_data[1])[i] != *(expected + i))
     {
-      /* found mismatch, increment */
-      mismatches++;
+      /* found mismatch on integer, increment */
+      if(numeric_limits<T>::is_integer){
+        mismatches++;
 
 #if DEBUG_STDOUT
-      /* output mismatch */
-      cout << "Err at " << i << ", " <<
-        ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
+        /* output mismatch */
+        cout << "Err at " << i << ", " <<
+          ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
 #endif
+      }
+      /* float error is tolerable though */
+      else {
+          float num_computed = ((T *)buf_data[1])[i];
+          float num_expected = *(expected + i);
+          float num_diff = abs(num_computed - num_expected) / abs(num_expected);
+          if(num_diff > 0.01f){
+            mismatches++;
+
+#if DEBUG_STDOUT
+          /* output mismatch */
+          cout << "Err at " << i << ", " <<
+            ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl;
+#endif
+        }
+      }
     }
 
 #if DEBUG_STDOUT
-- 
2.5.0



More information about the Beignet mailing list