[Beignet] [PATCH] utest: modify compiler_if_else to not rely on compiler behaviour.

Ruiling Song ruiling.song at intel.com
Thu Apr 6 11:46:35 UTC 2017


the test case modify src as well as dst.
and it introduce cross workitem memory dependency in dst[id] = src[id+1];
The compiler may order 'then' and 'else' block not as written.
If compiler order the else block first. src[3+1] will be modified in else part.
And the utest will get wrong result. If user want to get the old behaviour,
It should use two if-then and order them as required.

Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
 kernels/compiler_if_else.cl |  2 --
 utests/compiler_if_else.cpp | 15 +++++----------
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/kernels/compiler_if_else.cl b/kernels/compiler_if_else.cl
index 7ae8f99..c8b2cb8 100644
--- a/kernels/compiler_if_else.cl
+++ b/kernels/compiler_if_else.cl
@@ -5,10 +5,8 @@ compiler_if_else(__global int *src, __global int *dst)
   dst[id] = src[id];
   if (dst[id] >= 0) {
     dst[id] = src[id+1];
-    src[id] = 1;
   } else {
     dst[id]--;
-    src[id] = 2;
   }
 }
 
diff --git a/utests/compiler_if_else.cpp b/utests/compiler_if_else.cpp
index e38b23f..d65ecd3 100644
--- a/utests/compiler_if_else.cpp
+++ b/utests/compiler_if_else.cpp
@@ -21,43 +21,38 @@ static void compiler_if_else(void)
   OCL_NDRANGE(1);
 
   // First control flow
-  OCL_MAP_BUFFER(0);
   OCL_MAP_BUFFER(1);
   for (uint32_t i = 0; i < 16; ++i) {
     OCL_ASSERT(((int32_t*)buf_data[1])[i] == 2);
-    OCL_ASSERT(((int32_t*)buf_data[0])[i] == 1);
   }
+  OCL_UNMAP_BUFFER(1);
 
   // Second control flow
+  OCL_MAP_BUFFER(0);
   for (uint32_t i = 0; i < n; ++i) ((int32_t*)buf_data[0])[i] = -1;
   OCL_UNMAP_BUFFER(0);
-  OCL_UNMAP_BUFFER(1);
   OCL_NDRANGE(1);
-  OCL_MAP_BUFFER(0);
   OCL_MAP_BUFFER(1);
   for (uint32_t i = 0; i < 16; ++i) {
     OCL_ASSERT(((int32_t*)buf_data[1])[i] == -2);
-    OCL_ASSERT(((int32_t*)buf_data[0])[i] == 2);
   }
+  OCL_UNMAP_BUFFER(1);
 
   // Third control flow
+  OCL_MAP_BUFFER(0);
   for (uint32_t i = 0; i < 4; ++i) ((int32_t*)buf_data[0])[i] = 2;
   for (uint32_t i = 4; i < n; ++i) ((int32_t*)buf_data[0])[i] = -1;
   OCL_UNMAP_BUFFER(0);
-  OCL_UNMAP_BUFFER(1);
   OCL_NDRANGE(1);
-  OCL_MAP_BUFFER(0);
   OCL_MAP_BUFFER(1);
   for (uint32_t i = 0; i < 3; ++i) {
     OCL_ASSERT(((int32_t*)buf_data[1])[i] == 2);
-    OCL_ASSERT(((int32_t*)buf_data[0])[i] == 1);
   }
   OCL_ASSERT(((int32_t*)buf_data[1])[3] == -1);
-  OCL_ASSERT(((int32_t*)buf_data[0])[3] == 1);
   for (uint32_t i = 4; i < 16; ++i) {
     OCL_ASSERT(((int32_t*)buf_data[1])[i] == -2);
-    OCL_ASSERT(((int32_t*)buf_data[0])[i] == 2);
   }
+  OCL_UNMAP_BUFFER(1);
 }
 
 MAKE_UTEST_FROM_FUNCTION(compiler_if_else);
-- 
2.7.4



More information about the Beignet mailing list