1 // Copyright (c) 2018 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.
15 #include "include/include_all.cl"
18 KERNEL(index_select_gpu_ref)(
19 const __global UNIT_TYPE* input,
21 const __global int* indices,
23 __global UNIT_TYPE* output)
26 const uint input_sx = INPUT0_SIZE_X;
27 const uint input_sy = INPUT0_SIZE_Y;
28 const uint input_sf = INPUT0_FEATURE_NUM;
29 const uint input_sb = INPUT0_BATCH_NUM;
31 const uint out_b = (uint) get_global_id(0);
32 const uint indices_idx = (uint) get_global_id(1);
33 const uint feature_idx = (uint) get_global_id(2);
37 const uint indices_value = REVERSE_AXIS_SIZE - 1 - indices_idx;
39 const uint indices_value = indices[indices_idx];
43 uint indices_value[4] = {
44 #ifdef REVERSE_INDEX_SELECT_AXIS_BATCH_SIZE
45 REVERSE_INDEX_SELECT_AXIS_BATCH_SIZE - 1 - out_b,
49 #ifdef REVERSE_INDEX_SELECT_AXIS_FEATURE_SIZE
50 REVERSE_INDEX_SELECT_AXIS_FEATURE_SIZE - 1 - feature_idx,
54 #ifdef REVERSE_INDEX_SELECT_AXIS_Y_SIZE
55 REVERSE_INDEX_SELECT_AXIS_Y_SIZE - 1 - indices_idx,
66 for(uint x = 0; x < input_sx; x++)
68 #ifdef REVERSE_INDEX_SELECT_AXIS_X_SIZE
69 indices_value[3] = REVERSE_INDEX_SELECT_AXIS_X_SIZE - 1 - x;
73 output[GET_DATA_INDEX(OUTPUT, out_b, feature_idx, indices_idx, x)] = input[GET_DATA_INDEX(INPUT0, indices_value[0], indices_value[1], indices_value[2], indices_value[3])];
77 #ifdef INDEX_SELECT_AXIS_BATCH
78 for(uint x = 0; x < input_sx; x++)
80 for(uint y = 0; y < input_sy; y++)
82 output[GET_DATA_INDEX(OUTPUT, indices_idx, feature_idx, y, x)] = input[GET_DATA_INDEX(INPUT0, indices_value, feature_idx, y, x)];
85 #elif defined INDEX_SELECT_AXIS_FEATURE
86 for(uint x = 0; x < input_sx; x++)
88 output[GET_DATA_INDEX(OUTPUT, out_b, indices_idx, feature_idx, x)] = input[GET_DATA_INDEX(INPUT0, out_b, indices_value, feature_idx, x)];
90 #elif defined INDEX_SELECT_AXIS_X
91 for(uint i = 0; i < input_sy; i++)
93 output[GET_DATA_INDEX(OUTPUT, out_b, feature_idx, i, indices_idx)] = input[GET_DATA_INDEX(INPUT0, out_b, feature_idx, i, indices_value)];
95 #elif defined INDEX_SELECT_AXIS_Y
97 for(uint i = 0; i < input_sx; i++)
99 output[GET_DATA_INDEX(OUTPUT, out_b, feature_idx, indices_idx, i)] = input[GET_DATA_INDEX(INPUT0, out_b, feature_idx, indices_value, i)];