aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeresa Charlin <teresa.charlinreyes@arm.com>2024-04-24 13:30:58 +0100
committerTeresaARM <teresa.charlinreyes@arm.com>2024-04-24 15:59:21 +0000
commitce48d1dda2d6b32477de129a05ca3adee0f87690 (patch)
tree30f6067a3402378a0596019dbf390cdad811ad52
parent7db70891f2577fa0f65f4088f9587e69463b43e5 (diff)
downloadarmnn-ce48d1dda2d6b32477de129a05ca3adee0f87690.tar.gz
IVGCVSW-8206 CreateRescaleTosaOperator() modified
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com> Signed-off-by: Cathal Corbett <cathal.corbett@arm.com> Change-Id: I520a9d6cc95faeefaf82947a0547292e869aa523
-rw-r--r--src/backends/tosaCommon/operatorMappings/ActivationOperator.cpp43
-rw-r--r--src/backends/tosaCommon/operatorMappings/Conv2dOperator.cpp12
-rw-r--r--src/backends/tosaCommon/operatorMappings/QuantizeOperator.cpp12
-rw-r--r--src/backends/tosaCommon/operatorMappings/TosaRescaleOperatorUtils.hpp50
4 files changed, 41 insertions, 76 deletions
diff --git a/src/backends/tosaCommon/operatorMappings/ActivationOperator.cpp b/src/backends/tosaCommon/operatorMappings/ActivationOperator.cpp
index c17c4c70fe..480cdf5b86 100644
--- a/src/backends/tosaCommon/operatorMappings/ActivationOperator.cpp
+++ b/src/backends/tosaCommon/operatorMappings/ActivationOperator.cpp
@@ -126,49 +126,43 @@ TosaSerializationBasicBlock* ConvertActivationToTosaOperator(const Layer* layer,
std::string outputNameRescaleIdentity = std::string("intermediate4_") + GetUniqueTosaMappingID();
std::string outputNameRescaleMaxMin = std::string("intermediate5_") + GetUniqueTosaMappingID();
- DType rescale_type = DType::DType_INT32;
- float alpha = activationDescriptor->m_A;
- double scale_alpha = inputs[0]->GetQuantizationScale() * alpha / outputs[0]->GetQuantizationScale();
- double scale_identity = inputs[0]->GetQuantizationScale() / outputs[0]->GetQuantizationScale();
- int32_t input_zp = inputs[0]->GetQuantizationOffset();
- int32_t output_zp = outputs[0]->GetQuantizationOffset();
+ DType rescale_type = DType::DType_INT32;
+ float alpha = activationDescriptor->m_A;
+ double scale_alpha = inputs[0]->GetQuantizationScale() * alpha / outputs[0]->GetQuantizationScale();
+ double scale_identity = inputs[0]->GetQuantizationScale() / outputs[0]->GetQuantizationScale();
+ int32_t input_zp = inputs[0]->GetQuantizationOffset();
+ int32_t output_zp = outputs[0]->GetQuantizationOffset();
// Value op_rescale_alpha_in =
// buildRescale(rewriter, op, rescale_type, input, scale_alpha,
// input_qtype.getZeroPoint(), 0, true, true);
TosaSerializationOperator* rescaleAlphaOp = nullptr;
- TosaSerializationTensor* rescaleAlphaTensor = nullptr;
CreateRescaleTosaOperator(inputName,
outputNameRescaleAlpha,
- rescale_type,
- inputShape0,
scale_alpha,
input_zp,
0,
true,
true,
- &rescaleAlphaOp,
- &rescaleAlphaTensor);
- tensors.push_back(rescaleAlphaTensor);
-
+ &rescaleAlphaOp);
+ tensors.push_back(new TosaSerializationTensor(outputNameRescaleAlpha,
+ GetTosaTensorShape(inputs[0]->GetShape()),
+ rescale_type, {}));
// Value op_rescale_identity_in =
// buildRescale(rewriter, op, rescale_type, input, scale_identity,
// input_qtype.getZeroPoint(), 0, true, true);
TosaSerializationOperator* rescaleIdentityOp = nullptr;
- TosaSerializationTensor* rescaleIdentityTensor = nullptr;
CreateRescaleTosaOperator(inputName,
outputNameRescaleIdentity,
- rescale_type,
- inputShape0,
scale_identity,
input_zp,
0,
true,
true,
- &rescaleIdentityOp,
- &rescaleIdentityTensor);
- tensors.push_back(rescaleIdentityTensor);
-
+ &rescaleIdentityOp);
+ tensors.push_back(new TosaSerializationTensor(outputNameRescaleIdentity,
+ GetTosaTensorShape(inputs[0]->GetShape()),
+ rescale_type, {}));
// Value result_int32;
// if (alpha <= 1.0) {
// auto max_op = CreateOpAndInfer<tosa::MaximumOp>(
@@ -199,19 +193,18 @@ TosaSerializationBasicBlock* ConvertActivationToTosaOperator(const Layer* layer,
{outputNameRescaleMaxMin});
}
- tensors.push_back(new TosaSerializationTensor(outputNameRescaleMaxMin, inputShape0, rescale_type, {}));
+ tensors.push_back(new TosaSerializationTensor(outputNameRescaleMaxMin,
+ GetTosaTensorShape(inputs[0]->GetShape()),
+ rescale_type, {}));
// Value output = buildRescaleFromInt32(rewriter, op, output_type, result_int32,
// 1.0, output_qtype.getZeroPoint());
TosaSerializationOperator* rescaleOutputOp = nullptr;
CreateFromInt32RescaleTosaOperator(outputNameRescaleMaxMin,
outputName,
- outputDType0,
- outputShape0,
1.0,
output_zp,
- &rescaleOutputOp,
- nullptr);
+ &rescaleOutputOp);
// operatorInputNames/operatorOutputNames ends up being the same as
// blockInputNames/blockOutputNames for one-to-one ArmNN to Tosa mappings
diff --git a/src/backends/tosaCommon/operatorMappings/Conv2dOperator.cpp b/src/backends/tosaCommon/operatorMappings/Conv2dOperator.cpp
index 1c8682b1ab..96701d4384 100644
--- a/src/backends/tosaCommon/operatorMappings/Conv2dOperator.cpp
+++ b/src/backends/tosaCommon/operatorMappings/Conv2dOperator.cpp
@@ -140,7 +140,6 @@ TosaSerializationBasicBlock* ConvertConv2dToTosaOperator(const Layer* layer,
{convOutStr});
operators.push_back(conv2d_op);
-
if (isInputInt8)
{
int32_t output_zp = outputs[0]->GetQuantizationOffset();
@@ -149,11 +148,8 @@ TosaSerializationBasicBlock* ConvertConv2dToTosaOperator(const Layer* layer,
const std::vector<float>& weight_scales = inputs[1]->GetQuantizationScales();
TosaSerializationOperator* rescaleOp = nullptr;
- TosaSerializationTensor* rescaleTensor = nullptr;
CreateRescaleTosaOperatorPerChannel(outputConv2dName,
outputName,
- DType_INT8,
- outputShape0,
0,
output_zp,
true,
@@ -161,11 +157,13 @@ TosaSerializationBasicBlock* ConvertConv2dToTosaOperator(const Layer* layer,
input_scale,
output_scale,
weight_scales,
- &rescaleOp,
- &rescaleTensor);
+ &rescaleOp);
operators.push_back(rescaleOp);
- tensors.push_back(rescaleTensor);
+ tensors.push_back(new TosaSerializationTensor(outputName,
+ outputShape0,
+ DType_INT8, {}));
}
+
// operatorInputNames/operatorOutputNames ends up being the same as
// blockInputNames/blockOutputNames for one-to-one ArmNN to TOSA mappings
return new TosaSerializationBasicBlock(blockName, // name
diff --git a/src/backends/tosaCommon/operatorMappings/QuantizeOperator.cpp b/src/backends/tosaCommon/operatorMappings/QuantizeOperator.cpp
index 1a104d8423..1242d3b2c6 100644
--- a/src/backends/tosaCommon/operatorMappings/QuantizeOperator.cpp
+++ b/src/backends/tosaCommon/operatorMappings/QuantizeOperator.cpp
@@ -55,7 +55,7 @@ TosaSerializationBasicBlock* ConvertQuantizeToTosaOperator(const Layer* layer,
std::vector<int32_t> inputShape0 = GetTosaTensorShape(inputInfo.GetShape());
DType inputDType0 = ArmNNToDType(inputInfo.GetDataType());
- float isFloatInput = inputDType0 == DType::DType_FP16 || inputDType0 == DType::DType_FP32;
+ bool isFloatInput = inputDType0 == DType::DType_FP16 || inputDType0 == DType::DType_FP32;
// Only add input tensors if connected layer is an input layer.
// As intermediate or constant tensors will be created separately.
@@ -147,19 +147,17 @@ TosaSerializationBasicBlock* ConvertQuantizeToTosaOperator(const Layer* layer,
int32_t output_zp = outputs[0]->GetQuantizationOffset();
TosaSerializationOperator* rescaleOp = nullptr;
- TosaSerializationTensor* rescaleTensor = nullptr;
CreateRescaleTosaOperator(inputName,
outputName,
- outputDType0,
- inputShape0,
scale_alpha,
input_zp,
output_zp,
true,
true,
- &rescaleOp,
- &rescaleTensor);
- tensors.push_back(rescaleTensor);
+ &rescaleOp);
+ tensors.push_back(new TosaSerializationTensor(outputName,
+ inputShape0,
+ outputDType0, {}));
// operatorInputNames/operatorOutputNames ends up being the same as
// blockInputNames/blockOutputNames for one-to-one ArmNN to TOSA mappings
diff --git a/src/backends/tosaCommon/operatorMappings/TosaRescaleOperatorUtils.hpp b/src/backends/tosaCommon/operatorMappings/TosaRescaleOperatorUtils.hpp
index 56337cfdf4..c37d6519bb 100644
--- a/src/backends/tosaCommon/operatorMappings/TosaRescaleOperatorUtils.hpp
+++ b/src/backends/tosaCommon/operatorMappings/TosaRescaleOperatorUtils.hpp
@@ -9,8 +9,6 @@
inline void CreateRescaleTosaOperator(const std::string& inputName,
const std::string& outputName,
- DType output_type,
- const std::vector<int32_t>& shape,
const std::vector<int32_t>& multipliers,
const std::vector<int32_t>& shifts,
int32_t input_zp,
@@ -18,8 +16,7 @@ inline void CreateRescaleTosaOperator(const std::string& inputName,
bool double_round,
bool scale32,
bool per_channel,
- TosaSerializationOperator** op,
- TosaSerializationTensor** tensor)
+ TosaSerializationOperator** op)
{
if (!op)
{
@@ -42,21 +39,10 @@ inline void CreateRescaleTosaOperator(const std::string& inputName,
{
throw armnn::Exception("CreateRescaleTosaOperator: failed to created operator");
}
- if (tensor != nullptr)
- {
- // tensor
- *tensor = new TosaSerializationTensor(outputName, shape, output_type, {});
- if (! (*tensor))
- {
- throw armnn::Exception("CreateRescaleTosaOperator: failed to created tensor");
- }
- }
}
inline void CreateRescaleTosaOperator(const std::string& inputName,
const std::string& outputName,
- DType output_type,
- const std::vector<int32_t>& shape,
int32_t scale_multiplier,
int32_t scale_shift,
int32_t input_zp,
@@ -64,13 +50,12 @@ inline void CreateRescaleTosaOperator(const std::string& inputName,
bool double_round,
bool scale32,
bool per_channel,
- TosaSerializationOperator** op,
- TosaSerializationTensor** tensor)
+ TosaSerializationOperator** op)
{
const std::vector<int32_t> multipliers{scale_multiplier};
const std::vector<int32_t> shifts{scale_shift};
- CreateRescaleTosaOperator(inputName, outputName, output_type, shape, multipliers, shifts,
- input_zp, output_zp, double_round, scale32, per_channel, op, tensor);
+ CreateRescaleTosaOperator(inputName, outputName, multipliers, shifts,
+ input_zp, output_zp, double_round, scale32, per_channel, op);
}
/// The following is taken from mlir/lib/Dialect/Tosa/Utils/QuantUtils.cpp in the LLVM project
@@ -165,15 +150,12 @@ static void ComputeMultiplierAndShiftTosaScale16(double scale,
inline void CreateRescaleTosaOperator(const std::string& inputName,
const std::string& outputName,
- DType output_type,
- const std::vector<int32_t>& shape,
double scale,
int32_t input_zp,
int32_t output_zp,
bool double_round,
bool scale32,
- TosaSerializationOperator** op,
- TosaSerializationTensor** tensor)
+ TosaSerializationOperator** op)
{
int32_t multiplier;
int32_t shift;
@@ -187,14 +169,12 @@ inline void CreateRescaleTosaOperator(const std::string& inputName,
ComputeMultiplierAndShiftTosaScale16(scale, multiplier, shift);
}
- CreateRescaleTosaOperator(inputName, outputName, output_type, shape, multiplier, shift,
- input_zp, output_zp, double_round, scale32, false, op, tensor);
+ CreateRescaleTosaOperator(inputName, outputName, multiplier, shift,
+ input_zp, output_zp, double_round, scale32, false, op);
}
inline void CreateRescaleTosaOperatorPerChannel(const std::string& inputName,
const std::string& outputName,
- DType output_type,
- const std::vector<int32_t>& shape,
int32_t input_zp,
int32_t output_zp,
bool double_round,
@@ -202,8 +182,7 @@ inline void CreateRescaleTosaOperatorPerChannel(const std::string& inputName,
double input_scale,
double output_scale,
const std::vector<float>& weight_scales,
- TosaSerializationOperator** op,
- TosaSerializationTensor** tensor)
+ TosaSerializationOperator** op)
{
std::vector<int32_t> op_tensor_multipliers;
std::vector<int32_t> op_tensor_shifts;
@@ -229,19 +208,16 @@ inline void CreateRescaleTosaOperatorPerChannel(const std::string& inputName,
op_tensor_shifts.push_back(shift);
}
- CreateRescaleTosaOperator(inputName, outputName, output_type, shape, op_tensor_multipliers, op_tensor_shifts,
- input_zp, output_zp, double_round, scale32, true, op, tensor);
+ CreateRescaleTosaOperator(inputName, outputName, op_tensor_multipliers, op_tensor_shifts,
+ input_zp, output_zp, double_round, scale32, true, op);
}
inline void CreateFromInt32RescaleTosaOperator(const std::string& inputName,
const std::string& outputName,
- DType output_type,
- const std::vector<int32_t>& shape,
double output_scale,
int32_t output_zp,
- TosaSerializationOperator** op,
- TosaSerializationTensor** tensor)
+ TosaSerializationOperator** op)
{
- CreateRescaleTosaOperator(inputName, outputName, output_type, shape, output_scale,
- 0, output_zp, true, true, op, tensor);
+ CreateRescaleTosaOperator(inputName, outputName, output_scale,
+ 0, output_zp, true, true, op);
}