1 // Copyright (c) 2016-2017 Intel Corporation
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
16 #include "include/reshape_dims.cl"
17 #include "include/fetch.cl"
19 #include "include/data_types.cl"
21 ///////////////////////// Input Index /////////////////////////
22 inline uint FUNC(get_input_index)(uint b, uint f, uint y, uint x)
25 return GET_DATA_INDEX(INPUT0, b, f, y, x);
26 #elif defined INPUT0_LAYOUT_BS_F_BSV8__AF8 || \
27 defined INPUT0_LAYOUT_BS_F_BSV16__AF8
28 return GET_DATA_BS_FYX_BSV8_INDEX(INPUT0, b, f, y, x, SUB_GROUP_SIZE);
29 #elif defined INPUT0_LAYOUT_BF8_XY16
30 return GET_DATA_BF8_XY16_INDEX(INPUT0, b, f, y, x);
31 #elif defined INPUT0_LAYOUT_BYXF_AF32
32 return GET_DATA_BYXF_AF32_INDEX(INPUT0, b, f, y, x);
33 #elif defined INPUT0_LAYOUT_BYX8_F4
34 return GET_DATA_BYX8_F4_INDEX(INPUT0, b, f, y, x);
35 #elif defined INPUT0_LAYOUT_FS_BS_YX_BSV4_FSV32
36 return GET_DATA_FS_BS_YX_BSV4_FSV32_INDEX(INPUT0, b, f, y, x);
37 #elif defined INPUT0_LAYOUT_B_FS_YX_FSV4
38 return GET_DATA_B_FS_YX_FSV4_INDEX(INPUT0, b, f, y, x);
40 #error reorder_data.cl: input format - not supported
44 ///////////////////////// Output Index /////////////////////////
46 inline uint FUNC(get_output_index)(uint b, uint f, uint y, uint x)
49 return GET_DATA_INDEX(OUTPUT, b, f, y, x);
50 #elif defined OUTPUT_LAYOUT_BS_F_BSV8__AF8 || \
51 defined OUTPUT_LAYOUT_BS_F_BSV16__AF8
52 return GET_DATA_BS_FYX_BSV8_INDEX(OUTPUT, b, f, y, x, SUB_GROUP_SIZE);
53 #elif defined OUTPUT_LAYOUT_BF8_XY16
54 return GET_DATA_BF8_XY16_INDEX(OUTPUT, b, f, y, x);
55 #elif defined OUTPUT_LAYOUT_BYXF_AF32
56 return GET_DATA_BYXF_AF32_INDEX(OUTPUT, b, f, y, x);
57 #elif defined OUTPUT_LAYOUT_BYX8_F4
58 return GET_DATA_BYX8_F4_INDEX(OUTPUT, b, f, y, x);
59 #elif defined OUTPUT_LAYOUT_FS_BS_YX_BSV4_FSV32
60 return GET_DATA_FS_BS_YX_BSV4_FSV32_INDEX(OUTPUT, b, f, y, x);
61 #elif defined OUTPUT_LAYOUT_B_FS_YX_FSV4
62 return GET_DATA_B_FS_YX_FSV4_INDEX(OUTPUT, b, f, y, x);
64 #error reorder_data.cl: output format - not supported
68 __attribute__((intel_reqd_sub_group_size(16)))
69 KERNEL (reorder_data_byxf_f32_to_byx8_f4_i8)(
70 const __global INPUT_REORDER_TYPE* input,
71 __global OUTPUT_REORDER_TYPE* output
72 #ifdef MEAN_SUBTRACT_IN_BUFFER
73 , __global MEAN_SUBTRACT_TYPE* mean_subtract
77 const uint x = get_global_id(0);
78 const uint y = get_group_id(1);
79 const uint b = get_group_id(2);
81 const uint input_idx = FUNC_CALL(get_input_index)(b, 0, y, x);
82 const uint output_idx = FUNC_CALL(get_output_index)(b, 0, y, x);
84 #if defined MEAN_SUBTRACT_INSIDE_PARAMS
86 res.s0 = TO_MEAN_TYPE(input[input_idx]);
87 res.s0 = MEAN_OP(res.s0, VALUE_TO_SUBTRACT[0 % VALUE_TO_SUBTRACT_SIZE]);
88 res.s1 = TO_MEAN_TYPE(input[input_idx+1]);
89 res.s1 = MEAN_OP(res.s1, VALUE_TO_SUBTRACT[1 % VALUE_TO_SUBTRACT_SIZE]);
90 res.s2 = TO_MEAN_TYPE(input[input_idx+2]);
91 res.s2 = MEAN_OP(res.s2, VALUE_TO_SUBTRACT[2 % VALUE_TO_SUBTRACT_SIZE]);
93 #elif defined MEAN_SUBTRACT_IN_BUFFER
94 #if defined MEAN_PER_FEATURE
95 MAKE_VECTOR_TYPE(MEAN_SUBTRACT_TYPE, 4) res;
96 res.s0 = TO_MEAN_TYPE(input[input_idx]);
97 res.s0 = MEAN_OP(res.s0, mean_subtract[0]);
98 res.s1 = TO_MEAN_TYPE(input[input_idx+1]);
99 res.s1 = MEAN_OP(res.s1, mean_subtract[1]);
100 res.s2 = TO_MEAN_TYPE(input[input_idx+2]);
101 res.s2 = MEAN_OP(res.s2, mean_subtract[2]);
104 MAKE_VECTOR_TYPE(MEAN_SUBTRACT_TYPE, 4) res;
105 res.s0 = TO_MEAN_TYPE(input[input_idx]);
106 res.s1 = TO_MEAN_TYPE(input[input_idx+1]);
107 res.s2 = TO_MEAN_TYPE(input[input_idx+2]);
111 msv = FUNC_CALL(reshape_dims)(b,0,y,x, INPUT0_SIZE_Y, INPUT0_SIZE_X, MEAN_SUBTRACT_SIZE_Y, MEAN_SUBTRACT_SIZE_X, INPUT0_DIMS, MEAN_SUBTRACT_DIMS);
112 res.s0 = MEAN_OP(res.s0, mean_subtract[GET_DATA_INDEX_SAFE(MEAN_SUBTRACT, msv[0], msv[1], msv[2], msv[3])]);
114 msv = FUNC_CALL(reshape_dims)(b,1,y,x, INPUT0_SIZE_Y, INPUT0_SIZE_X, MEAN_SUBTRACT_SIZE_Y, MEAN_SUBTRACT_SIZE_X, INPUT0_DIMS, MEAN_SUBTRACT_DIMS);
115 res.s1 = MEAN_OP(res.s1, mean_subtract[GET_DATA_INDEX_SAFE(MEAN_SUBTRACT, msv[0], msv[1], msv[2], msv[3])]);
117 msv = FUNC_CALL(reshape_dims)(b,2,y,x, INPUT0_SIZE_Y, INPUT0_SIZE_X, MEAN_SUBTRACT_SIZE_Y, MEAN_SUBTRACT_SIZE_X, INPUT0_DIMS, MEAN_SUBTRACT_DIMS);
118 res.s2 = MEAN_OP(res.s2, mean_subtract[GET_DATA_INDEX_SAFE(MEAN_SUBTRACT, msv[0], msv[1], msv[2], msv[3])]);
121 MAKE_VECTOR_TYPE(CALC_TYPE, 4) res;
122 res.s0 = TO_CALC_TYPE(input[input_idx]);
123 res.s1 = TO_CALC_TYPE(input[input_idx+1]);
124 res.s2 = TO_CALC_TYPE(input[input_idx+2]);
129 out_vals.s0 = ACTIVATION(TO_OUTPUT_REORDER_TYPE(res.s0), NL_M ,NL_N);
130 out_vals.s1 = ACTIVATION(TO_OUTPUT_REORDER_TYPE(res.s1), NL_M ,NL_N);
131 out_vals.s2 = ACTIVATION(TO_OUTPUT_REORDER_TYPE(res.s2), NL_M ,NL_N);
134 __global uint* dst = (__global uint*)output;
135 dst[output_idx/4] = as_uint(out_vals);