} // namespace
-inline const TensorInfo GetOverriddenDataType(const TensorInfo& info, Optional<DataType> type)
+inline void ReportUntouchedLayers(OptimizationViews& optimizationViews, std::map<LayerGuid, Layer*> untouched)
{
- if (!type)
+ std::vector<Layer*> untouchedVector;
+ for (const auto& pair : untouched)
{
- return info;
+ Layer* layer = pair.second;
+ SubgraphView subgraphView(CreateInputsFrom({layer}),
+ CreateOutputsFrom({layer}),
+ {layer});
+ optimizationViews.AddUntouchedSubgraph(std::move(subgraphView));
}
-
- return TensorInfo(info.GetShape(), type.value(), info.GetQuantizationScale(), info.GetQuantizationOffset());
-}
-
-inline armnn::Optional<armnn::DataType> GetOptionalBiasTypeFromWeightsType(armnn::Optional<armnn::DataType> weightsType)
-{
- if (!weightsType)
- {
- return weightsType;
- }
-
- switch(weightsType.value())
- {
- case armnn::DataType::BFloat16:
- case armnn::DataType::Float16:
- case armnn::DataType::Float32:
- return weightsType;
- case armnn::DataType::QAsymmS8:
- case armnn::DataType::QAsymmU8:
- case armnn::DataType::QSymmS8:
- case armnn::DataType::QSymmS16:
- return armnn::DataType::Signed32;
- default:
- ARMNN_ASSERT_MSG(false, "GetBiasTypeFromWeightsType(): Unsupported data type.");
- }
- return armnn::EmptyOptional();
}
template<typename LayerType>
auto it = subgraph.end();
bool isFastMathEnabled = false;
+ std::map<LayerGuid, Layer*> untouched;
+ while (it != subgraph.begin())
+ {
+ --it;
+ Layer& base = **it;
+ untouched.insert({base.GetGuid(), &base});
+ }
+
+ it = subgraph.end();
#if defined(ARMCOMPUTECL_ENABLED)
IBackendInternal::IBackendSpecificModelContextPtr modelContextPtr = CreateBackendSpecificModelContext(modelOptions);
}
}
#endif
-
while (it != subgraph.begin())
{
--it;
if (baseLayer->GetParameters().m_BiasEnabled)
{
- biases = GetOverriddenDataType(baseLayer->m_Bias->GetTensorInfo(),
- GetOptionalBiasTypeFromWeightsType(
- baseLayer->m_Weight->GetTensorInfo().GetDataType()));
+ biases = baseLayer->m_Bias->GetTensorInfo();
}
arm_compute::Status status = ClConvolution2dWorkloadValidate(
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::DepthwiseConvolution2d)
if (baseLayer->GetParameters().m_BiasEnabled)
{
- biases = GetOverriddenDataType(baseLayer->m_Bias->GetTensorInfo(),
- GetOptionalBiasTypeFromWeightsType(
- baseLayer->m_Weight->GetTensorInfo().GetDataType()));
+ biases = baseLayer->m_Bias->GetTensorInfo();
}
arm_compute::Status status = ClDepthwiseConvolutionWorkloadValidate(
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::FullyConnected)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::BatchNormalization)
replacementLayer->m_Gamma = std::move(baseLayer->m_Gamma);
replacementLayer->m_Mean = std::move(baseLayer->m_Mean);
replacementLayer->m_Variance = std::move(baseLayer->m_Variance);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Addition)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Division)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Multiplication)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Subtraction)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
}
}
}
}
- // end each optimization
+
if (optimizationViews.GetSubstitutions().empty())
{
optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph));
}
+ else
+ {
+ ReportUntouchedLayers(optimizationViews, untouched);
+ }
return optimizationViews;
}
OptimizationViews optimizationViews;
auto it = subgraph.end();
+ std::map<LayerGuid, Layer*> untouched;
while (it != subgraph.begin())
{
--it;
Layer& base = **it;
+ untouched.insert({base.GetGuid(), &base});
+ }
+
+ it = subgraph.end();
+ while (it != subgraph.begin())
+ {
+ --it;
+ Layer& base = **it;
if ((base.GetType() == LayerType::DepthwiseConvolution2d || base.GetType() == LayerType::Convolution2d
|| base.GetType() == LayerType::BatchNormalization || base.GetType() == LayerType::FullyConnected
if (baseLayer->GetParameters().m_BiasEnabled)
{
- biases = GetOverriddenDataType(baseLayer->m_Bias->GetTensorInfo(),
- GetOptionalBiasTypeFromWeightsType(
- baseLayer->m_Weight->GetTensorInfo().GetDataType()));
+ biases = baseLayer->m_Bias->GetTensorInfo();
}
arm_compute::Status status = NeonConvolution2dWorkloadValidate(
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::DepthwiseConvolution2d)
if (baseLayer->GetParameters().m_BiasEnabled)
{
- biases = GetOverriddenDataType(baseLayer->m_Bias->GetTensorInfo(),
- GetOptionalBiasTypeFromWeightsType(
- baseLayer->m_Weight->GetTensorInfo().GetDataType()));
+ biases = baseLayer->m_Bias->GetTensorInfo();
}
arm_compute::Status status = NeonDepthwiseConvolutionWorkloadValidate(
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::FullyConnected)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::BatchNormalization)
replacementLayer->m_Gamma = std::move(baseLayer->m_Gamma);
replacementLayer->m_Mean = std::move(baseLayer->m_Mean);
replacementLayer->m_Variance = std::move(baseLayer->m_Variance);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Addition)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Division)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Multiplication)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
else if (base.GetType() == LayerType::Subtraction)
activationLayer,
activationDesc,
name);
+ untouched.erase(baseLayer->GetGuid());
+ untouched.erase(activationLayer->GetGuid());
}
}
}
{
optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph));
}
+ else
+ {
+ ReportUntouchedLayers(optimizationViews, untouched);
+ }
return optimizationViews;
}