diff options
author | Yang Rong <rong.r.yang@intel.com> | 2013-06-27 16:47:57 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@linux.intel.com> | 2013-06-27 18:54:15 +0800 |
commit | 1f854302ef8fb59cd5b4a5921e86dd84799ea3b0 (patch) | |
tree | 22632ada02b7f14a846f187d5a1dbf3b690f31a2 /utests/compiler_atomic_functions.cpp | |
parent | 188f7c7e78c41b42beac4e7bc59970dcae29c8d1 (diff) | |
download | beignet-1f854302ef8fb59cd5b4a5921e86dd84799ea3b0.tar.gz |
Add atomic test case.
The test case include local memory and global memory, atomic operations from
different threads and different work groups.
Signed-off-by: Yang Rong <rong.r.yang@intel.com>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
Diffstat (limited to 'utests/compiler_atomic_functions.cpp')
-rw-r--r-- | utests/compiler_atomic_functions.cpp | 87 |
1 files changed, 84 insertions, 3 deletions
diff --git a/utests/compiler_atomic_functions.cpp b/utests/compiler_atomic_functions.cpp index 20202da9..71e8384c 100644 --- a/utests/compiler_atomic_functions.cpp +++ b/utests/compiler_atomic_functions.cpp @@ -1,10 +1,91 @@ #include "utest_helper.hpp" +#include <cmath> +#include <algorithm> -void compiler_atomic_functions(void) +#define GROUP_NUM 16 +#define LOCAL_SIZE 64 +static void cpu_compiler_atomic(int *dst, int *src) { - OCL_CREATE_KERNEL("compiler_atomic_functions"); + dst[4] = 0xffffffff; + int tmp[16] = { 0 }; + + for(int j=0; j<LOCAL_SIZE; j++) { + int i = j % 12; + + switch(i) { + case 0: tmp[i] += 1; break; + case 1: tmp[i] -= 1; break; + case 2: tmp[i] += src[j]; break; + case 3: tmp[i] -= src[j]; break; + case 4: tmp[i] &= ~(src[j]<<(j>>2)); break; + case 5: tmp[i] |= src[j]<<(j>>2); break; + case 6: tmp[i] ^= src[j]; break; + case 7: tmp[i] = tmp[i] < -src[j] ? tmp[i] : -src[j]; break; + case 8: tmp[i] = tmp[i] > src[j] ? tmp[i] : src[j]; break; + case 9: tmp[i] = (unsigned int)tmp[i] < (unsigned int)(-src[j]) ? tmp[i] : -src[j]; break; + case 10: tmp[i] = (unsigned int)tmp[i] > (unsigned int)(src[j]) ? tmp[i] : src[j]; break; + case 11: tmp[i] = src[10]; break; + default: break; + } + } + + for(int k=0; k<GROUP_NUM; k++) { + for(int j=0; j<LOCAL_SIZE; j++) { + int i = j % 12; + + switch(i) { + case 0: dst[i] += 1; break; + case 1: dst[i] -= 1; break; + case 2: dst[i] += src[j]; break; + case 3: dst[i] -= src[j]; break; + case 4: dst[i] &= ~(src[j]<<(j>>2)); break; + case 5: dst[i] |= src[j]<<(j>>2); break; + case 6: dst[i] ^= src[j]; break; + case 7: dst[i] = dst[i] < -src[j] ? dst[i] : -src[j]; break; + case 8: dst[i] = dst[i] > src[j] ? dst[i] : src[j]; break; + case 9: dst[i] = (unsigned int)dst[i] < (unsigned int)(-src[j]) ? dst[i] : -src[j]; break; + case 10: dst[i] = (unsigned int)dst[i] > (unsigned int)(src[j]) ? dst[i] : src[j]; break; + case 11: dst[i] = src[10]; break; + default: break; + } + } + } + + for(int i=0; i<12; i++) + dst[i] += tmp[i]; } -MAKE_UTEST_FROM_FUNCTION(compiler_atomic_functions); +static void compiler_atomic_functions(void) +{ + const size_t n = GROUP_NUM * LOCAL_SIZE; + int cpu_dst[16] = {0}, cpu_src[256]; + globals[0] = n; + locals[0] = LOCAL_SIZE; + + // Setup kernel and buffers + OCL_CREATE_KERNEL("compiler_atomic_functions"); + OCL_CREATE_BUFFER(buf[0], 0, 16 * sizeof(int), NULL); + OCL_CREATE_BUFFER(buf[1], 0, locals[0] * sizeof(int), NULL); + OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]); + OCL_SET_ARG(1, 16 * sizeof(int), NULL); + OCL_SET_ARG(2, sizeof(cl_mem), &buf[1]); + + OCL_MAP_BUFFER(1); + for (uint32_t i = 0; i < locals[0]; ++i) + cpu_src[i] = ((int*)buf_data[1])[i] = rand() & 0xff; + cpu_compiler_atomic(cpu_dst, cpu_src); + OCL_UNMAP_BUFFER(1); + OCL_NDRANGE(1); + + OCL_MAP_BUFFER(0); + + // Check results + for(int i=0; i<12; i++) { + //printf("The dst(%d) gpu(0x%x) cpu(0x%x)\n", i, ((uint32_t *)buf_data[0])[i], cpu_dst[i]); + OCL_ASSERT(((int *)buf_data[0])[i] == cpu_dst[i]); + } + OCL_UNMAP_BUFFER(0); +} +MAKE_UTEST_FROM_FUNCTION(compiler_atomic_functions) |