diff options
author | Jan Eilers <jan.eilers@arm.com> | 2019-08-16 10:45:30 +0100 |
---|---|---|
committer | Áron Virginás-Tar <aron.virginas-tar@arm.com> | 2019-08-27 09:15:37 +0000 |
commit | 146b2e15895aeedc58a8f5fcf50a7837ba9bf085 (patch) | |
tree | 5a29b17553794595a967b88a5a97d98497880264 /src/backends/backendsCommon | |
parent | 665a964aab8858447c3e1261f2c38d59b150da82 (diff) | |
download | armnn-146b2e15895aeedc58a8f5fcf50a7837ba9bf085.tar.gz |
IVGCVSW-3605 Add direct compatibility between Cl and Neon backends
* Adds compatibility between Cl and Neon
* Adds related unit test
Signed-off-by: Jan Eilers <jan.eilers@arm.com>
Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: Iaa454ea2a6392c89c0a83836c3156d4ddb354879
Diffstat (limited to 'src/backends/backendsCommon')
-rw-r--r-- | src/backends/backendsCommon/test/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/CompatibilityTests.cpp | 117 |
2 files changed, 122 insertions, 0 deletions
diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index d6f8a6f20b..293e5b5103 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -66,6 +66,11 @@ if (ARMCOMPUTEREF) ) endif() +if(ARMCOMPUTENEON AND ARMCOMPUTECL) + list(APPEND armnnBackendsCommonUnitTests_sources + CompatibilityTests.cpp) +endif() + add_library(armnnBackendsCommonUnitTests OBJECT ${armnnBackendsCommonUnitTests_sources}) target_include_directories(armnnBackendsCommonUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn) target_include_directories(armnnBackendsCommonUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) diff --git a/src/backends/backendsCommon/test/CompatibilityTests.cpp b/src/backends/backendsCommon/test/CompatibilityTests.cpp new file mode 100644 index 0000000000..599c9842b1 --- /dev/null +++ b/src/backends/backendsCommon/test/CompatibilityTests.cpp @@ -0,0 +1,117 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include <boost/test/unit_test.hpp> + +#include <cl/ClBackend.hpp> +#include <neon/NeonBackend.hpp> + +#include <Network.hpp> + +#include <vector> +#include <string> + +using namespace armnn; + +BOOST_AUTO_TEST_SUITE(BackendsCompatibility) + +BOOST_AUTO_TEST_CASE(Neon_Cl_DirectCompatibility_Test) +{ + auto neonBackend = std::make_unique<NeonBackend>(); + auto clBackend = std::make_unique<ClBackend>(); + + TensorHandleFactoryRegistry registry; + neonBackend->RegisterTensorHandleFactories(registry); + clBackend->RegisterTensorHandleFactories(registry); + + const BackendId& neonBackendId = neonBackend->GetId(); + const BackendId& clBackendId = clBackend->GetId(); + + BackendsMap backends; + backends[neonBackendId] = std::move(neonBackend); + backends[clBackendId] = std::move(clBackend); + + armnn::Graph graph; + + armnn::InputLayer* const inputLayer = graph.AddLayer<armnn::InputLayer>(0, "input"); + + inputLayer->SetBackendId(neonBackendId); + + armnn::SoftmaxDescriptor smDesc; + armnn::SoftmaxLayer* const softmaxLayer1 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax1"); + softmaxLayer1->SetBackendId(clBackendId); + + armnn::SoftmaxLayer* const softmaxLayer2 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax2"); + softmaxLayer2->SetBackendId(neonBackendId); + + armnn::SoftmaxLayer* const softmaxLayer3 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax3"); + softmaxLayer3->SetBackendId(clBackendId); + + armnn::SoftmaxLayer* const softmaxLayer4 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax4"); + softmaxLayer4->SetBackendId(neonBackendId); + + armnn::OutputLayer* const outputLayer = graph.AddLayer<armnn::OutputLayer>(0, "output"); + outputLayer->SetBackendId(clBackendId); + + inputLayer->GetOutputSlot(0).Connect(softmaxLayer1->GetInputSlot(0)); + softmaxLayer1->GetOutputSlot(0).Connect(softmaxLayer2->GetInputSlot(0)); + softmaxLayer2->GetOutputSlot(0).Connect(softmaxLayer3->GetInputSlot(0)); + softmaxLayer3->GetOutputSlot(0).Connect(softmaxLayer4->GetInputSlot(0)); + softmaxLayer4->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + + graph.TopologicalSort(); + + std::vector<std::string> errors; + auto result = SelectTensorHandleStrategy(graph, backends, registry, errors); + + BOOST_TEST(result.m_Error == false); + BOOST_TEST(result.m_Warning == false); + + OutputSlot& inputLayerOut = inputLayer->GetOutputSlot(0); + OutputSlot& softmaxLayer1Out = softmaxLayer1->GetOutputSlot(0); + OutputSlot& softmaxLayer2Out = softmaxLayer2->GetOutputSlot(0); + OutputSlot& softmaxLayer3Out = softmaxLayer3->GetOutputSlot(0); + OutputSlot& softmaxLayer4Out = softmaxLayer4->GetOutputSlot(0); + + // Check that the correct factory was selected + BOOST_TEST(inputLayerOut.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory"); + BOOST_TEST(softmaxLayer1Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory"); + BOOST_TEST(softmaxLayer2Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory"); + BOOST_TEST(softmaxLayer3Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory"); + BOOST_TEST(softmaxLayer4Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory"); + + // Check that the correct strategy was selected + BOOST_TEST((inputLayerOut.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility)); + BOOST_TEST((softmaxLayer1Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility)); + BOOST_TEST((softmaxLayer2Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility)); + BOOST_TEST((softmaxLayer3Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility)); + BOOST_TEST((softmaxLayer4Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility)); + + graph.AddCompatibilityLayers(backends, registry); + + // Test for copy layers + int copyCount= 0; + graph.ForEachLayer([©Count](Layer* layer) + { + if (layer->GetType() == LayerType::MemCopy) + { + copyCount++; + } + }); + BOOST_TEST(copyCount == 0); + + // Test for import layers + int importCount= 0; + graph.ForEachLayer([&importCount](Layer *layer) + { + if (layer->GetType() == LayerType::MemImport) + { + importCount++; + } + }); + BOOST_TEST(importCount == 0); +} + +BOOST_AUTO_TEST_SUITE_END() |