diff options
author | Pan Xiuli <xiuli.pan@intel.com> | 2016-05-20 05:40:33 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2016-06-13 17:02:34 +0800 |
commit | 5c7a23b65cd9222fb12c230ab55c8790691684ca (patch) | |
tree | 13cf338e1736126842850d6ec1311aec085c0b32 /utests/compiler_subgroup_buffer_block_read.cpp | |
parent | a2f9a6bcf5908c9ed506cdd805bb8606a963eb85 (diff) | |
download | beignet-5c7a23b65cd9222fb12c230ab55c8790691684ca.tar.gz |
Utest: Add tset case for block read/write buffer
V2: Rename test case to buffer block read/write test
Signed-off-by: Pan Xiuli <xiuli.pan@intel.com>
Reviewed-by: Yang Rong <rong.r.yang@intel.com>
Diffstat (limited to 'utests/compiler_subgroup_buffer_block_read.cpp')
-rw-r--r-- | utests/compiler_subgroup_buffer_block_read.cpp | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/utests/compiler_subgroup_buffer_block_read.cpp b/utests/compiler_subgroup_buffer_block_read.cpp new file mode 100644 index 00000000..334ec76a --- /dev/null +++ b/utests/compiler_subgroup_buffer_block_read.cpp @@ -0,0 +1,194 @@ +#include <cstdint> +#include <cstring> +#include <iostream> +#include "utest_helper.hpp" + +using namespace std; + +/* set to 1 for debug, output of input-expected data */ +#define DEBUG_STDOUT 0 + +/* NDRANGE */ +#define WG_GLOBAL_SIZE 32 +#define WG_LOCAL_SIZE 32 +/* + * Generic compute-expected function for buffer block read + */ +template<class T> +static void compute_expected(T* input, + T* expected, + size_t VEC_SIZE, + size_t SIMD_SIZE) +{ + for(uint32_t i = 0; i < SIMD_SIZE; i++) + for(uint32_t j = 0; j < VEC_SIZE; j++) + expected[i * VEC_SIZE + j] = input[SIMD_SIZE * j + i]; +} + +/* + * Generic input-expected generate function for block read + */ +template<class T> +static void generate_data(T* &input, + T* &expected, + size_t VEC_SIZE, + size_t SIMD_SIZE) +{ + /* allocate input and expected arrays */ + input = new T[WG_GLOBAL_SIZE * VEC_SIZE]; + expected = new T[WG_GLOBAL_SIZE * VEC_SIZE]; + + /* base value for all data types */ + T base_val = (long)7 << (sizeof(T) * 5 - 3); + + /* seed for random inputs */ + srand (time(NULL)); + + /* generate inputs and expected values */ + for(uint32_t gid = 0; gid < WG_GLOBAL_SIZE; gid += SIMD_SIZE) + { +#if DEBUG_STDOUT + cout << endl << "IN: " << endl; +#endif + SIMD_SIZE = (gid + SIMD_SIZE) > WG_GLOBAL_SIZE ? WG_GLOBAL_SIZE - gid : SIMD_SIZE; + + /* input values */ + for(uint32_t lid = 0; lid < SIMD_SIZE; lid++) + { + for(uint32_t vsz = 0; vsz < VEC_SIZE; vsz++) + { + /* initially 0, augment after */ + input[(gid + lid)*VEC_SIZE + vsz] = 0; + + /* check all data types, test ideal for QWORD types */ + input[(gid + lid)*VEC_SIZE + vsz] += ((rand() % 2 - 1) * base_val); + /* add trailing random bits, tests GENERAL cases */ + input[(gid + lid)*VEC_SIZE + vsz] += (rand() % 112); + +#if DEBUG_STDOUT + /* output generated input */ + cout << setw(4) << input[(gid + lid)*VEC_SIZE + vsz] << ", " ; + if((lid + 1) % 8 == 0) + cout << endl; +#endif + } + } + + /* expected values */ + compute_expected(input + gid * VEC_SIZE, expected + gid * VEC_SIZE, VEC_SIZE, SIMD_SIZE); + +#if DEBUG_STDOUT + /* output expected input */ + cout << endl << "EXP: " << endl; + for(uint32_t lid = 0; lid < SIMD_SIZE ; lid++){ + for(uint32_t vsz = 0; vsz < VEC_SIZE; vsz++) + cout << setw(4) << expected[(gid + lid)*VEC_SIZE + vsz] << ", " ; + if((lid + 1) % 8 == 0) + cout << endl; + } + cout << endl; +#endif + + } +} + +/* + * Generic subgroup utest function for buffer block read + */ +template<class T> +static void subgroup_generic(T* input, + T* expected, + size_t VEC_SIZE) +{ + /* get simd size */ + globals[0] = WG_GLOBAL_SIZE; + locals[0] = WG_LOCAL_SIZE; + size_t SIMD_SIZE = 0; + OCL_CALL(clGetKernelSubGroupInfoKHR,kernel,device,CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR,sizeof(size_t)*1,locals,sizeof(size_t),&SIMD_SIZE,NULL); + + size_t buf_sz = VEC_SIZE * WG_GLOBAL_SIZE; + /* input and expected data */ + generate_data(input, expected, VEC_SIZE, SIMD_SIZE); + + /* prepare input for datatype */ + OCL_CREATE_BUFFER(buf[0], 0, buf_sz * sizeof(T), NULL); + OCL_CREATE_BUFFER(buf[1], 0, buf_sz * sizeof(T), NULL); + OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]); + OCL_SET_ARG(1, sizeof(cl_mem), &buf[1]); + + /* set input data for GPU */ + OCL_MAP_BUFFER(0); + memcpy(buf_data[0], input, buf_sz* sizeof(T)); + OCL_UNMAP_BUFFER(0); + + /* run the kernel on GPU */ + OCL_NDRANGE(1); + + /* check if mismatch */ + OCL_MAP_BUFFER(1); + uint32_t mismatches = 0; + + for (uint32_t i = 0; i < buf_sz; i++) + if(((T *)buf_data[1])[i] != *(expected + i)) + { + /* found mismatch, increment */ + mismatches++; + +#if DEBUG_STDOUT + /* output mismatch */ + cout << "Err at " << i << ", " << + ((T *)buf_data[1])[i] << " != " << *(expected + i) << endl; +#endif + } + +#if DEBUG_STDOUT + /* output mismatch count */ + cout << "mismatches " << mismatches << endl; +#endif + + OCL_UNMAP_BUFFER(1); + + OCL_ASSERT(mismatches == 0); + free(input); + free(expected); +} + +/* + * subgroup buffer block read + */ +void compiler_subgroup_buffer_block_read1(void) +{ + cl_uint *input = NULL; + cl_uint *expected = NULL; + OCL_CREATE_KERNEL_FROM_FILE("compiler_subgroup_buffer_block_read", + "compiler_subgroup_buffer_block_read1"); + subgroup_generic(input, expected, 1); +} +MAKE_UTEST_FROM_FUNCTION(compiler_subgroup_buffer_block_read1); +void compiler_subgroup_buffer_block_read2(void) +{ + cl_uint *input = NULL; + cl_uint *expected = NULL; + OCL_CREATE_KERNEL_FROM_FILE("compiler_subgroup_buffer_block_read", + "compiler_subgroup_buffer_block_read2"); + subgroup_generic(input, expected, 2); +} +MAKE_UTEST_FROM_FUNCTION(compiler_subgroup_buffer_block_read2); +void compiler_subgroup_buffer_block_read4(void) +{ + cl_uint *input = NULL; + cl_uint *expected = NULL; + OCL_CREATE_KERNEL_FROM_FILE("compiler_subgroup_buffer_block_read", + "compiler_subgroup_buffer_block_read4"); + subgroup_generic(input, expected, 4); +} +MAKE_UTEST_FROM_FUNCTION(compiler_subgroup_buffer_block_read4); +void compiler_subgroup_buffer_block_read8(void) +{ + cl_uint *input = NULL; + cl_uint *expected = NULL; + OCL_CREATE_KERNEL_FROM_FILE("compiler_subgroup_buffer_block_read", + "compiler_subgroup_buffer_block_read8"); + subgroup_generic(input, expected, 8); +} +MAKE_UTEST_FROM_FUNCTION(compiler_subgroup_buffer_block_read8); |