1 // 2 // Copyright © 2017 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #include <TestUtils.hpp> 7 8 #include <Optimizer.hpp> 9 10 #include <doctest/doctest.h> 11 12 using namespace armnn; 13 14 TEST_SUITE("Optimizer") 15 { 16 using namespace armnn::optimizations; 17 18 TEST_CASE("OptimizeInverseConversionsTest") 19 { 20 armnn::Graph graph; 21 22 auto output = graph.AddLayer<armnn::OutputLayer>(0, "output"); 23 24 graph.InsertNewLayer<armnn::InputLayer>(output->GetInputSlot(0), 0, "input"); 25 26 // Fp32ToFp16 conversion followed by an inverse Fp16ToFp32 conversion 27 graph.InsertNewLayer<armnn::ConvertFp32ToFp16Layer>(output->GetInputSlot(0), "convert1"); 28 graph.InsertNewLayer<armnn::ConvertFp16ToFp32Layer>(output->GetInputSlot(0), "convert2"); 29 30 graph.InsertNewLayer<armnn::Convolution2dLayer>(output->GetInputSlot(0), Convolution2dDescriptor(), "conv"); 31 32 // Fp16ToFp32 conversion followed by an inverse Fp32ToFp16 conversion 33 graph.InsertNewLayer<armnn::ConvertFp16ToFp32Layer>(output->GetInputSlot(0), "convert3"); 34 graph.InsertNewLayer<armnn::ConvertFp32ToFp16Layer>(output->GetInputSlot(0), "convert4"); 35 36 CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, 37 &IsLayerOfType<armnn::ConvertFp32ToFp16Layer>, 38 &IsLayerOfType<armnn::ConvertFp16ToFp32Layer>, &IsLayerOfType<armnn::Convolution2dLayer>, 39 &IsLayerOfType<armnn::ConvertFp16ToFp32Layer>, 40 &IsLayerOfType<armnn::ConvertFp32ToFp16Layer>, &IsLayerOfType<armnn::OutputLayer>)); 41 42 armnn::Optimizer::Pass( 43 graph, armnn::MakeOptimizations(OptimizeInverseConversionsFp16(), OptimizeInverseConversionsFp32())); 44 45 // Check that all consecutive inverse conversions are removed 46 CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, 47 &IsLayerOfType<armnn::Convolution2dLayer>, &IsLayerOfType<armnn::OutputLayer>)); 48 } 49 50 }