aboutsummaryrefslogtreecommitdiff
path: root/src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp')
-rw-r--r--src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp b/src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp
index b0d27cbc87..79bc9a5674 100644
--- a/src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp
+++ b/src/core/CL/kernels/CLWidthConcatenate2TensorsKernel.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018 ARM Limited.
+ * Copyright (c) 2018-2019 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -49,9 +49,11 @@ std::pair<Status, Window> validate_and_configure_window(ITensorInfo *input1, ITe
{
// The window needs to be based on the output
Window win = calculate_max_window(*output, Steps(num_elems_processed_per_iteration));
- AccessWindowStatic input1_access(input1, 0, 0, ceil_to_multiple(input1->dimension(0), num_elems_processed_per_iteration) + num_elems_processed_per_iteration, input1->dimension(1));
- AccessWindowStatic input2_access(input2, -num_elems_processed_per_iteration, 0, ceil_to_multiple(input2->dimension(0), num_elems_processed_per_iteration) + num_elems_processed_per_iteration,
- input2->dimension(1));
+ AccessWindowStatic input1_access(input1, 0, 0, ceil_to_multiple(input1->dimension(0), num_elems_processed_per_iteration), input1->dimension(1));
+ const unsigned int input2_right_padding = (output->dimension(0) / num_elems_processed_per_iteration) * num_elems_processed_per_iteration - input1->dimension(
+ 0) + num_elems_processed_per_iteration - input2->dimension(0);
+ AccessWindowStatic input2_access(input2, -(input1->dimension(0) % num_elems_processed_per_iteration),
+ 0, input2->dimension(0) + input2_right_padding, input2->dimension(1));
AccessWindowHorizontal output_access(output, 0, num_elems_processed_per_iteration);
bool window_changed = update_window_and_padding(win, input1_access, input2_access, output_access);
@@ -118,6 +120,14 @@ void CLWidthConcatenate2TensorsKernel::configure(const ICLTensor *input1, const
ICLKernel::configure_internal(std::get<1>(win_config));
+ // Pass paddings as arguments to the kernel
+ const unsigned int input1_width = input1->info()->dimension(0);
+ const unsigned int input1_right_padding = ceil_to_multiple(input1_width, num_elems_processed_per_iteration) - input1_width;
+ const unsigned int input2_left_padding = input1_width % num_elems_processed_per_iteration;
+ unsigned int idx0 = 3 * num_arguments_per_4D_tensor();
+ _kernel.setArg<cl_uint>(idx0++, input1_right_padding);
+ _kernel.setArg<cl_uint>(idx0++, input2_left_padding);
+
// Set config_id for enabling LWS tuning
_config_id = "concatenate_width_x2_";
_config_id += lower_string(string_from_data_type(input1->info()->data_type()));