| 235 | } |
| 236 | |
| 237 | void CLReductionOperationKernel::run(const Window &window, cl::CommandQueue &queue) |
| 238 | { |
| 239 | ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); |
| 240 | ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(IKernel::window(), window); |
| 241 | |
| 242 | const bool is_serial_op = needs_serialized_reduction(_op, _input->info()->data_type(), _reduction_axis); |
| 243 | switch (_reduction_axis) |
| 244 | { |
| 245 | case 0: |
| 246 | { |
| 247 | // We use parallel reduction only in non quantized types |
| 248 | if (is_serial_op) |
| 249 | { |
| 250 | // Get first input and output slices |
| 251 | Window window_in{window}; |
| 252 | window_in.set(Window::DimX, |
| 253 | Window::Dimension(0, _input->info()->dimension(0), _input->info()->dimension(0))); |
| 254 | |
| 255 | Window out_window{window}; |
| 256 | out_window.set(Window::DimX, Window::Dimension(0, 0, 0)); |
| 257 | |
| 258 | Window in_slice = window_in.first_slice_window_1D(); |
| 259 | Window out_slice = out_window.first_slice_window_1D(); |
| 260 | |
| 261 | do |
| 262 | { |
| 263 | unsigned int idx = 0; |
| 264 | add_1D_tensor_argument(idx, _input, in_slice); |
| 265 | add_1D_tensor_argument(idx, _output, out_slice); |
| 266 | enqueue(queue, *this, in_slice); |
| 267 | } while (window_in.slide_window_slice_1D(in_slice) && out_window.slide_window_slice_1D(out_slice)); |
| 268 | } |
| 269 | else |
| 270 | { |
| 271 | // Set out window |
| 272 | bool has_collapsed = true; |
| 273 | Window window_in = window.collapse_if_possible(window, 2, &has_collapsed); |
| 274 | ARM_COMPUTE_ERROR_ON(!has_collapsed); |
| 275 | |
| 276 | Window window_out = window_in; |
| 277 | window_out.set(0, Window::Dimension()); |
| 278 | |
| 279 | unsigned int idx = 0; |
| 280 | add_3D_tensor_argument(idx, _input, window_in); |
| 281 | add_3D_tensor_argument(idx, _output, window_out); |
| 282 | enqueue(queue, *this, window_in); |
| 283 | } |
| 284 | } |
| 285 | break; |
| 286 | case 1: |
| 287 | { |
| 288 | bool has_collapsed = true; |
| 289 | Window actual_window = window.collapse_if_possible(window, 2, &has_collapsed); |
| 290 | ARM_COMPUTE_ERROR_ON(!has_collapsed); |
| 291 | |
| 292 | actual_window = actual_window.shift_dimensions(1, Window::DimY); |
| 293 | |
| 294 | const ITensorInfo *input_info = _input->info(); |
nothing calls this directly
no test coverage detected