diff options
author | David Monahan <david.monahan@arm.com> | 2023-11-22 13:24:25 +0000 |
---|---|---|
committer | David Monahan <david.monahan@arm.com> | 2023-12-07 15:21:09 +0000 |
commit | 8a570466aca7ae1619fe8fa715b68419fceb142f (patch) | |
tree | 22d80676e01f4a92fc6d927b6c26d6e5939c5170 /src/backends/gpuFsa/test/GpuFsaOptimizedNetworkTests.cpp | |
parent | 748657f2941d28bec810b7eec21e46e288002036 (diff) | |
download | armnn-8a570466aca7ae1619fe8fa715b68419fceb142f.tar.gz |
IVGCVSW-8157 - Rebase existing GpuFsa patches to 23.11
Squashed commit of the following:
IVGCVSW-7159 Add GpuFsa backend skeleton
IVGCVSW-7380 Update the GpuFsa Skeleton to build and load ACL
IVGCVSW-7381 Add IsLayerSupported implementation to GpuFsa backend
IVGCVSW-7382 Implementation of Conv2d within GpuFsa
Signed-off-by: James Conroy <james.conroy@arm.com>
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: Id23d9ee598535de7b38a99ca223cdf0ad2102cef
Diffstat (limited to 'src/backends/gpuFsa/test/GpuFsaOptimizedNetworkTests.cpp')
-rw-r--r-- | src/backends/gpuFsa/test/GpuFsaOptimizedNetworkTests.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/backends/gpuFsa/test/GpuFsaOptimizedNetworkTests.cpp b/src/backends/gpuFsa/test/GpuFsaOptimizedNetworkTests.cpp new file mode 100644 index 0000000000..7e094cec1e --- /dev/null +++ b/src/backends/gpuFsa/test/GpuFsaOptimizedNetworkTests.cpp @@ -0,0 +1,137 @@ +// +// Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include <armnn/INetwork.hpp> + +#include <GraphUtils.hpp> +#include <TestUtils.hpp> + +#include <doctest/doctest.h> + +using namespace armnn; + +TEST_SUITE("GpuFsaOptimizedNetwork") +{ + +TEST_CASE("SingleConv2dSupportedOptimizedNetwork") +{ + IRuntime::CreationOptions options; + IRuntimePtr runtime(IRuntime::Create(options)); + INetworkPtr network(INetwork::Create()); + + TensorInfo inputInfo({ 1, 5, 5, 1 }, DataType::Float32); + TensorInfo outputInfo({ 1, 3, 3, 1 }, DataType::Float32); + TensorInfo weightsInfo({ 1, 3, 3, 1 }, DataType::Float32, 0.0f, 0, true); + TensorInfo biasesInfo({ 1 }, DataType::Float32, 0.0f, 0, true); + + Convolution2dDescriptor desc; + desc.m_BiasEnabled = true; + desc.m_DataLayout = DataLayout::NHWC; + + auto inputLayer = network->AddInputLayer(0, "input"); + auto weightLayer = network->AddConstantLayer(ConstTensor(weightsInfo, nullptr), "weights"); + auto biasLayer = network->AddConstantLayer(ConstTensor(biasesInfo, nullptr), "bias"); + auto convLayer = network->AddConvolution2dLayer(desc, "conv2d"); + auto outputLayer = network->AddOutputLayer(1, "output"); + + inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0)); + inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); + + weightLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1)); + weightLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo); + + biasLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2)); + biasLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo); + + convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); + + std::vector<BackendId> backends = { "GpuFsa" }; + + OptimizerOptionsOpaque optimizedOptions; + IOptimizedNetworkPtr optNet = Optimize(*network, backends, runtime->GetDeviceSpec(), optimizedOptions); + CHECK(optNet); + + Graph& graph = GetGraphForTesting(optNet.get()); + + // Check graph layer sequence to ensure that the network has been replaced with a PreCompiledLayer + CHECK(CheckSequence(graph.cbegin(), graph.cend(), + &IsLayerOfType<InputLayer>, + &IsLayerOfType<ConstantLayer>, + &IsLayerOfType<ConstantLayer>, + &IsLayerOfType<PreCompiledLayer>, + &IsLayerOfType<OutputLayer>)); +} + +TEST_CASE("TwoConv2dSupportedOptimizedNetwork") +{ + IRuntime::CreationOptions options; + IRuntimePtr runtime(IRuntime::Create(options)); + INetworkPtr network(INetwork::Create()); + + TensorInfo inputInfo({ 1, 5, 5, 1 }, DataType::Float32); + TensorInfo intermediateInfo({ 1, 3, 3, 1 }, DataType::Float32); + TensorInfo outputInfo({ 1, 1, 1, 1 }, DataType::Float32); + TensorInfo weightsInfo({ 1, 3, 3, 1 }, DataType::Float32, 0.0f, 0, true); + TensorInfo biasesInfo({ 1 }, DataType::Float32, 0.0f, 0, true); + + Convolution2dDescriptor desc; + desc.m_BiasEnabled = true; + desc.m_DataLayout = DataLayout::NHWC; + + auto inputLayer = network->AddInputLayer(0, "input"); + + auto weightLayer1 = network->AddConstantLayer(ConstTensor(weightsInfo, nullptr), "weights"); + auto biasLayer1 = network->AddConstantLayer(ConstTensor(biasesInfo, nullptr), "bias"); + auto convLayer1 = network->AddConvolution2dLayer(desc, "conv2d"); + + auto weightLayer2 = network->AddConstantLayer(ConstTensor(weightsInfo, nullptr), "weights"); + auto biasLayer2 = network->AddConstantLayer(ConstTensor(biasesInfo, nullptr), "bias"); + auto convLayer2 = network->AddConvolution2dLayer(desc, "conv2d"); + + auto outputLayer = network->AddOutputLayer(0, "output"); + + inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0)); + inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); + + weightLayer1->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(1)); + weightLayer1->GetOutputSlot(0).SetTensorInfo(weightsInfo); + + biasLayer1->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(2)); + biasLayer1->GetOutputSlot(0).SetTensorInfo(biasesInfo); + + convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0)); + convLayer1->GetOutputSlot(0).SetTensorInfo(intermediateInfo); + + weightLayer2->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(1)); + weightLayer2->GetOutputSlot(0).SetTensorInfo(weightsInfo); + + biasLayer2->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(2)); + biasLayer2->GetOutputSlot(0).SetTensorInfo(biasesInfo); + + convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + convLayer2->GetOutputSlot(0).SetTensorInfo(outputInfo); + + std::vector<BackendId> backends = { "GpuFsa" }; + + OptimizerOptionsOpaque optimizedOptions; + IOptimizedNetworkPtr optNet = Optimize(*network, backends, runtime->GetDeviceSpec(), optimizedOptions); + CHECK(optNet); + + Graph& graph = GetGraphForTesting(optNet.get()); + + // Check graph layer sequence to ensure that the network has been replaced with a PreCompiledLayer + CHECK(CheckSequence(graph.cbegin(), graph.cend(), + &IsLayerOfType<InputLayer>, + &IsLayerOfType<ConstantLayer>, + &IsLayerOfType<ConstantLayer>, + &IsLayerOfType<ConstantLayer>, + &IsLayerOfType<ConstantLayer>, + &IsLayerOfType<PreCompiledLayer>, + &IsLayerOfType<PreCompiledLayer>, + &IsLayerOfType<OutputLayer>)); +} + +}
\ No newline at end of file |