1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "harness/compat.h"
17*6467f958SSadaf Ebrahimi
18*6467f958SSadaf Ebrahimi #include <stdio.h>
19*6467f958SSadaf Ebrahimi #include <string.h>
20*6467f958SSadaf Ebrahimi #include "procs.h"
21*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
22*6467f958SSadaf Ebrahimi #include "CL/cl_half.h"
23*6467f958SSadaf Ebrahimi
24*6467f958SSadaf Ebrahimi MTdata gMTdata;
25*6467f958SSadaf Ebrahimi cl_half_rounding_mode g_rounding_mode;
26*6467f958SSadaf Ebrahimi
27*6467f958SSadaf Ebrahimi test_definition test_list[] = {
28*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(sub_group_info_ext, Version(2, 0)),
29*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(sub_group_info_core, Version(2, 1)),
30*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(work_item_functions_ext, Version(2, 0)),
31*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(work_item_functions_core, Version(2, 1)),
32*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(subgroup_functions_ext, Version(2, 0)),
33*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(subgroup_functions_core, Version(2, 1)),
34*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(barrier_functions_ext, Version(2, 0)),
35*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(barrier_functions_core, Version(2, 1)),
36*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(ifp_ext, Version(2, 0)),
37*6467f958SSadaf Ebrahimi ADD_TEST_VERSION(ifp_core, Version(2, 1)),
38*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_extended_types),
39*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_non_uniform_vote),
40*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_non_uniform_arithmetic),
41*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_ballot),
42*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_clustered_reduce),
43*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_shuffle),
44*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_shuffle_relative),
45*6467f958SSadaf Ebrahimi ADD_TEST(subgroup_functions_rotate),
46*6467f958SSadaf Ebrahimi };
47*6467f958SSadaf Ebrahimi
48*6467f958SSadaf Ebrahimi const int test_num = ARRAY_SIZE(test_list);
49*6467f958SSadaf Ebrahimi
InitCL(cl_device_id device)50*6467f958SSadaf Ebrahimi static test_status InitCL(cl_device_id device)
51*6467f958SSadaf Ebrahimi {
52*6467f958SSadaf Ebrahimi auto version = get_device_cl_version(device);
53*6467f958SSadaf Ebrahimi test_status ret = TEST_PASS;
54*6467f958SSadaf Ebrahimi if (version >= Version(3, 0))
55*6467f958SSadaf Ebrahimi {
56*6467f958SSadaf Ebrahimi cl_uint max_sub_groups;
57*6467f958SSadaf Ebrahimi int error;
58*6467f958SSadaf Ebrahimi
59*6467f958SSadaf Ebrahimi error = clGetDeviceInfo(device, CL_DEVICE_MAX_NUM_SUB_GROUPS,
60*6467f958SSadaf Ebrahimi sizeof(max_sub_groups), &max_sub_groups, NULL);
61*6467f958SSadaf Ebrahimi if (error != CL_SUCCESS)
62*6467f958SSadaf Ebrahimi {
63*6467f958SSadaf Ebrahimi print_error(error, "Unable to get max number of subgroups");
64*6467f958SSadaf Ebrahimi return TEST_FAIL;
65*6467f958SSadaf Ebrahimi }
66*6467f958SSadaf Ebrahimi
67*6467f958SSadaf Ebrahimi if (max_sub_groups == 0)
68*6467f958SSadaf Ebrahimi {
69*6467f958SSadaf Ebrahimi ret = TEST_SKIP;
70*6467f958SSadaf Ebrahimi }
71*6467f958SSadaf Ebrahimi }
72*6467f958SSadaf Ebrahimi // Determine the rounding mode to be used in float to half conversions in
73*6467f958SSadaf Ebrahimi // init and reference code
74*6467f958SSadaf Ebrahimi const cl_device_fp_config fpConfig = get_default_rounding_mode(device);
75*6467f958SSadaf Ebrahimi
76*6467f958SSadaf Ebrahimi if (fpConfig == CL_FP_ROUND_TO_NEAREST)
77*6467f958SSadaf Ebrahimi {
78*6467f958SSadaf Ebrahimi g_rounding_mode = CL_HALF_RTE;
79*6467f958SSadaf Ebrahimi }
80*6467f958SSadaf Ebrahimi else if (fpConfig == CL_FP_ROUND_TO_ZERO && gIsEmbedded)
81*6467f958SSadaf Ebrahimi {
82*6467f958SSadaf Ebrahimi g_rounding_mode = CL_HALF_RTZ;
83*6467f958SSadaf Ebrahimi }
84*6467f958SSadaf Ebrahimi else
85*6467f958SSadaf Ebrahimi {
86*6467f958SSadaf Ebrahimi assert(false && "Unreachable");
87*6467f958SSadaf Ebrahimi }
88*6467f958SSadaf Ebrahimi return ret;
89*6467f958SSadaf Ebrahimi }
90*6467f958SSadaf Ebrahimi
main(int argc,const char * argv[])91*6467f958SSadaf Ebrahimi int main(int argc, const char *argv[])
92*6467f958SSadaf Ebrahimi {
93*6467f958SSadaf Ebrahimi gMTdata = init_genrand(0);
94*6467f958SSadaf Ebrahimi return runTestHarnessWithCheck(argc, argv, test_num, test_list, false, 0,
95*6467f958SSadaf Ebrahimi InitCL);
96*6467f958SSadaf Ebrahimi }
97