diff options
author | Michalis Spyrou <michalis.spyrou@arm.com> | 2020-06-18 10:14:57 +0100 |
---|---|---|
committer | Michalis Spyrou <michalis.spyrou@arm.com> | 2020-06-19 14:35:22 +0000 |
commit | ce0c67559cf03965acc8f212263a9f53205a0a3f (patch) | |
tree | c37105c72538108c46e5964cf49d15acd2d85980 /src/core/NEON/kernels | |
parent | 3be0b8c8d4e90bd264e9575dc2b6994ce8e14d50 (diff) | |
download | ComputeLibrary-ce0c67559cf03965acc8f212263a9f53205a0a3f.tar.gz |
COMPMID-3377: Async support to NEElementwiseUnaryLayerKernel kernels/functions
Signed-off-by: Michalis Spyrou <michalis.spyrou@arm.com>
Change-Id: I208287b44ece051e95f891d43a691cb0ac6e56c5
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3419
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/core/NEON/kernels')
-rw-r--r-- | src/core/NEON/kernels/NEActivationLayerKernel.cpp | 6 | ||||
-rw-r--r-- | src/core/NEON/kernels/NEElementwiseOperationKernel.cpp | 44 | ||||
-rw-r--r-- | src/core/NEON/kernels/NEReshapeLayerKernel.cpp | 6 |
3 files changed, 25 insertions, 31 deletions
diff --git a/src/core/NEON/kernels/NEActivationLayerKernel.cpp b/src/core/NEON/kernels/NEActivationLayerKernel.cpp index 2c00a76305..43426dc122 100644 --- a/src/core/NEON/kernels/NEActivationLayerKernel.cpp +++ b/src/core/NEON/kernels/NEActivationLayerKernel.cpp @@ -855,8 +855,8 @@ Status NEActivationLayerKernel::validate(const ITensorInfo *input, const ITensor return Status{}; } -void NEActivationLayerKernel::run_op(const std::vector<InputTensor> &inputs, - const std::vector<OutputTensor> &outputs, +void NEActivationLayerKernel::run_op(const InputTensorMap &inputs, + const OutputTensorMap &outputs, const Window &window, const ThreadInfo &info) { // Early exit on disabled activation @@ -872,5 +872,5 @@ void NEActivationLayerKernel::run_op(const std::vector<InputTensor> &inputs, ARM_COMPUTE_ERROR_ON(inputs.empty() || outputs.empty()); - (this->*_func)(inputs[0].tensor, outputs[0].tensor, window); + (this->*_func)(inputs.at(TensorType::ACL_SRC), outputs.at(TensorType::ACL_DST), window); } diff --git a/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp b/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp index 7b2b5e4f19..b4f7a0a902 100644 --- a/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp +++ b/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp @@ -1055,13 +1055,13 @@ void elementwise_comp_op_quantized_signed(const ITensor *in1, const ITensor *in2 } std::function<void(const ITensor *, const ITensor *, ITensor *, const Window &)> -configure_func(const ITensor *input1, const ITensor *input2, ITensor *output, +configure_func(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, std::map<std::string, NEElementwiseOperationKernel::ElementwiseFunction *> map_function) { std::string function_to_call("op_"); - function_to_call += string_from_data_type(input1->info()->data_type()) + "_"; - function_to_call += string_from_data_type(input2->info()->data_type()) + "_"; - function_to_call += string_from_data_type(output->info()->data_type()); + function_to_call += string_from_data_type(input1->data_type()) + "_"; + function_to_call += string_from_data_type(input2->data_type()) + "_"; + function_to_call += string_from_data_type(output->data_type()); auto it = map_function.find(function_to_call); @@ -1078,7 +1078,7 @@ configure_func(const ITensor *input1, const ITensor *input2, ITensor *output, template <ArithmeticOperation op> std::function<void(const ITensor *, const ITensor *, ITensor *, const Window &)> -configure_arithm_func(const ITensor *input1, const ITensor *input2, ITensor *output) +configure_arithm_func(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { static std::map<std::string, NEElementwiseOperationKernel::ElementwiseFunction *> map_function = { @@ -1097,7 +1097,7 @@ configure_arithm_func(const ITensor *input1, const ITensor *input2, ITensor *out template <ComparisonOperation op> std::function<void(const ITensor *input1, const ITensor *input2, ITensor *output, const Window &window)> -configure_comp_func(const ITensor *input1, const ITensor *input2, ITensor *output) +configure_comp_func(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { static std::map<std::string, NEElementwiseOperationKernel::ElementwiseFunction *> map_function = { @@ -1140,41 +1140,36 @@ Status NEElementwiseOperationKernel::validate_arguments_common(const ITensorInfo return Status{}; } -void NEElementwiseOperationKernel::configure_common(const ITensor *input1, const ITensor *input2, ITensor *output) +void NEElementwiseOperationKernel::configure_common(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { ARM_COMPUTE_ERROR_ON_NULLPTR(input1, input2, output); // Configure kernel window - const std::pair<TensorShape, ValidRegion> broadcast_pair = ITensorInfo::broadcast_shape_and_valid_region(*input1->info(), *input2->info()); + const std::pair<TensorShape, ValidRegion> broadcast_pair = ITensorInfo::broadcast_shape_and_valid_region(*input1, *input2); const TensorShape &out_shape = broadcast_pair.first; const ValidRegion &valid_region = broadcast_pair.second; // Auto initialize output if not initialized - auto_init_if_empty(*output->info(), out_shape, 1, input1->info()->data_type()); + auto_init_if_empty(*output, out_shape, 1, input1->data_type()); Window win = calculate_max_window(valid_region); - _input1 = input1; - _input2 = input2; - _output = output; - INEKernel::configure(win); } -void NEElementwiseOperationKernel::run(const Window &window, const ThreadInfo &info) +void NEElementwiseOperationKernel::run_op(const InputTensorMap &inputs, const OutputTensorMap &outputs, const Window &window, const ThreadInfo &info) { ARM_COMPUTE_UNUSED(info, window); ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(INEKernel::window(), window); ARM_COMPUTE_ERROR_ON(_function == nullptr); - _function(_input1, _input2, _output, window); + _function(inputs.at(TensorType::ACL_SRC_0), inputs.at(TensorType::ACL_SRC_1), outputs.at(TensorType::ACL_DST), window); } /** Arithmetic operators (min, max, squared_diff) */ - -void NEArithmeticOperationKernel::configure(ArithmeticOperation op, const ITensor *input1, const ITensor *input2, ITensor *output) +void NEArithmeticOperationKernel::configure(ArithmeticOperation op, const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1->info(), *input2->info(), *output->info())); + ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1, *input2, *output)); configure_common(input1, input2, output); switch(op) { @@ -1215,9 +1210,9 @@ Status NEArithmeticOperationKernel::validate(ArithmeticOperation op, const ITens /** The division operator */ -void NEDivisionOperationKernel::configure(const ITensor *input1, const ITensor *input2, ITensor *output) +void NEDivisionOperationKernel::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1->info(), *input2->info(), *output->info())); + ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1, *input2, *output)); configure_common(input1, input2, output); _function = configure_arithm_func<ArithmeticOperation::DIV>(input1, input2, output); } @@ -1236,9 +1231,9 @@ Status NEDivisionOperationKernel::validate(const ITensorInfo *input1, const ITen } /** The power operator */ -void NEPowerOperationKernel::configure(const ITensor *input1, const ITensor *input2, ITensor *output) +void NEPowerOperationKernel::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1->info(), *input2->info(), *output->info())); + ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1, *input2, *output)); configure_common(input1, input2, output); _function = configure_arithm_func<ArithmeticOperation::POWER>(input1, input2, output); } @@ -1257,10 +1252,9 @@ Status NEPowerOperationKernel::validate(const ITensorInfo *input1, const ITensor } /** Comparison operators (equal, not equal, less than, greater than, less than or equal, greater than or equal) */ - -void NEComparisonOperationKernel::configure(ComparisonOperation op, const ITensor *input1, const ITensor *input2, ITensor *output) +void NEComparisonOperationKernel::configure(ComparisonOperation op, const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) { - ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1->info(), *input2->info(), *output->info())); + ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1, *input2, *output)); configure_common(input1, input2, output); switch(op) { diff --git a/src/core/NEON/kernels/NEReshapeLayerKernel.cpp b/src/core/NEON/kernels/NEReshapeLayerKernel.cpp index c141eecf75..eb1139d7a3 100644 --- a/src/core/NEON/kernels/NEReshapeLayerKernel.cpp +++ b/src/core/NEON/kernels/NEReshapeLayerKernel.cpp @@ -86,14 +86,14 @@ void NEReshapeLayerKernel::configure(const ITensorInfo *input, ITensorInfo *outp INEKernel::configure(win); } -void NEReshapeLayerKernel::run_op(const std::vector<InputTensor> &inputs, const std::vector<OutputTensor> &outputs, const Window &window, const ThreadInfo &info) +void NEReshapeLayerKernel::run_op(const InputTensorMap &inputs, const OutputTensorMap &outputs, const Window &window, const ThreadInfo &info) { ARM_COMPUTE_UNUSED(info); ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(INEKernel::window(), window); - const auto src = inputs[0].tensor; - auto dst = outputs[0].tensor; + const auto src = inputs.at(TensorType::ACL_SRC); + auto dst = outputs.at(TensorType::ACL_DST); switch(src->info()->data_type()) { |