diff options
author | Homer Hsing <homer.xing@intel.com> | 2013-10-10 10:13:41 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@linux.intel.com> | 2013-10-10 13:22:38 +0800 |
commit | 04efbda63e00bef950ac35dde9285b3002ba9ba4 (patch) | |
tree | a50955c21d1472ed231e009b7f0e591fdff2fd51 /utests | |
parent | 1ad7e368cf9e1ac2f5256b70b20e1e46a06a92e0 (diff) |
saturated conversion of native GPU data type, larger to narrower
This patch supports saturated conversion of
native GPU data type (char/short/int/float),
from a larger-range data type to a narrower-range data type.
For instance, convert_uchar_sat(int)
Several test cases are in this patch.
v2: add uint->int, int->uint
Signed-off-by: Homer Hsing <homer.xing@intel.com>
Reviewed-by: "Yang, Rong R" <rong.r.yang@intel.com>
Diffstat (limited to 'utests')
-rw-r--r-- | utests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | utests/builtin_convert_sat.cpp | 71 |
2 files changed, 72 insertions, 0 deletions
diff --git a/utests/CMakeLists.txt b/utests/CMakeLists.txt index f18bd46f..31b85e38 100644 --- a/utests/CMakeLists.txt +++ b/utests/CMakeLists.txt @@ -126,6 +126,7 @@ set (utests_sources builtin_num_groups.cpp builtin_local_id.cpp builtin_acos_asin.cpp + builtin_convert_sat.cpp runtime_createcontext.cpp runtime_null_kernel_arg.cpp runtime_event.cpp diff --git a/utests/builtin_convert_sat.cpp b/utests/builtin_convert_sat.cpp new file mode 100644 index 00000000..e16ce16a --- /dev/null +++ b/utests/builtin_convert_sat.cpp @@ -0,0 +1,71 @@ +#include <cstdint> +#include "utest_helper.hpp" + +typedef unsigned char uchar; +typedef unsigned short ushort; + +int64_t my_rand(void) { + int64_t x = rand() - RAND_MAX/2; + int64_t y = rand() - RAND_MAX/2; + return x * y; +} + +#define DEF(DST_TYPE, SRC_TYPE, DST_MIN, DST_MAX) \ +void builtin_convert_ ## SRC_TYPE ## _to_ ## DST_TYPE ## _sat(void) \ +{ \ + const int n = 128; \ + OCL_CREATE_KERNEL_FROM_FILE("builtin_convert_sat", "builtin_convert_" # SRC_TYPE "_to_" # DST_TYPE "_sat"); \ + OCL_CREATE_BUFFER(buf[0], 0, n * sizeof(SRC_TYPE), NULL); \ + OCL_CREATE_BUFFER(buf[1], 0, n * sizeof(DST_TYPE), NULL); \ + OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]); \ + OCL_SET_ARG(1, sizeof(cl_mem), &buf[1]); \ + globals[0] = n; \ + locals[0] = 16; \ + OCL_MAP_BUFFER(0); \ + for (int i = 0; i < n; i++) \ + ((SRC_TYPE *)buf_data[0])[i] = my_rand(); \ + OCL_UNMAP_BUFFER(0); \ + OCL_NDRANGE(1); \ + OCL_MAP_BUFFER(0); \ + OCL_MAP_BUFFER(1); \ + for (int i = 0; i < n; i++) { \ + SRC_TYPE src = ((SRC_TYPE *)buf_data[0])[i]; \ + DST_TYPE dst; \ + if ((double)src > (double)DST_MAX) \ + dst = DST_MAX; \ + else if ((double)src < (double)DST_MIN) \ + dst = DST_MIN; \ + else \ + dst = src; \ + OCL_ASSERT(((DST_TYPE *)buf_data[1])[i] == dst); \ + } \ + OCL_UNMAP_BUFFER(0); \ + OCL_UNMAP_BUFFER(1); \ +} \ +MAKE_UTEST_FROM_FUNCTION(builtin_convert_ ## SRC_TYPE ## _to_ ## DST_TYPE ## _sat); + +DEF(char, uchar, -128, 127); +DEF(char, short, -128, 127); +DEF(char, ushort, -128, 127); +DEF(char, int, -128, 127); +DEF(char, uint, -128, 127); +DEF(char, float, -128, 127); +DEF(uchar, char, 0, 255); +DEF(uchar, short, 0, 255); +DEF(uchar, ushort, 0, 255); +DEF(uchar, int, 0, 255); +DEF(uchar, uint, 0, 255); +DEF(uchar, float, 0, 255); +DEF(short, ushort, -32768, 32767); +DEF(short, int, -32768, 32767); +DEF(short, uint, -32768, 32767); +DEF(short, float, -32768, 32767); +DEF(ushort, short, 0, 65535); +DEF(ushort, int, 0, 65535); +DEF(ushort, uint, 0, 65535); +DEF(ushort, float, 0, 65535); +DEF(int, uint, -0x7FFFFFFF-1, 0x7FFFFFFF); +DEF(int, float, -0x7FFFFFFF-1, 0x7FFFFFFF); +DEF(uint, int, 0, 0xffffffffu); +DEF(uint, float, 0, 0xffffffffu); +#undef DEF |