xref: /aosp_15_r20/external/armnn/samples/DynamicSample.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020-2021,2023 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #include <armnn/INetwork.hpp>
6*89c4ff92SAndroid Build Coastguard Worker #include <armnn/IRuntime.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Utils.hpp>
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Descriptors.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
11*89c4ff92SAndroid Build Coastguard Worker 
12*89c4ff92SAndroid Build Coastguard Worker /// A simple example of using the ArmNN SDK API with the standalone sample dynamic backend.
13*89c4ff92SAndroid Build Coastguard Worker /// In this example, an addition layer is used to add 2 input tensors to produce a result output tensor.
main()14*89c4ff92SAndroid Build Coastguard Worker int main()
15*89c4ff92SAndroid Build Coastguard Worker {
16*89c4ff92SAndroid Build Coastguard Worker     using namespace armnn;
17*89c4ff92SAndroid Build Coastguard Worker 
18*89c4ff92SAndroid Build Coastguard Worker     // Construct ArmNN network
19*89c4ff92SAndroid Build Coastguard Worker     armnn::NetworkId networkIdentifier;
20*89c4ff92SAndroid Build Coastguard Worker     INetworkPtr myNetwork = INetwork::Create();
21*89c4ff92SAndroid Build Coastguard Worker 
22*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* input0 = myNetwork->AddInputLayer(0);
23*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* input1 = myNetwork->AddInputLayer(1);
24*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* add    = myNetwork->AddElementwiseBinaryLayer(BinaryOperation::Add);
25*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* output = myNetwork->AddOutputLayer(0);
26*89c4ff92SAndroid Build Coastguard Worker 
27*89c4ff92SAndroid Build Coastguard Worker     input0->GetOutputSlot(0).Connect(add->GetInputSlot(0));
28*89c4ff92SAndroid Build Coastguard Worker     input1->GetOutputSlot(0).Connect(add->GetInputSlot(1));
29*89c4ff92SAndroid Build Coastguard Worker     add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
30*89c4ff92SAndroid Build Coastguard Worker 
31*89c4ff92SAndroid Build Coastguard Worker     TensorInfo tensorInfo(TensorShape({2, 1}), DataType::Float32);
32*89c4ff92SAndroid Build Coastguard Worker     input0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
33*89c4ff92SAndroid Build Coastguard Worker     input1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
34*89c4ff92SAndroid Build Coastguard Worker     add->GetOutputSlot(0).SetTensorInfo(tensorInfo);
35*89c4ff92SAndroid Build Coastguard Worker 
36*89c4ff92SAndroid Build Coastguard Worker     // Create ArmNN runtime
37*89c4ff92SAndroid Build Coastguard Worker     IRuntime::CreationOptions options; // default options
38*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntimePtr run(armnn::IRuntime::Create(options));
39*89c4ff92SAndroid Build Coastguard Worker 
40*89c4ff92SAndroid Build Coastguard Worker     // Optimise ArmNN network
41*89c4ff92SAndroid Build Coastguard Worker     armnn::IOptimizedNetworkPtr optNet = Optimize(*myNetwork, {"SampleDynamic"}, run->GetDeviceSpec());
42*89c4ff92SAndroid Build Coastguard Worker     if (!optNet)
43*89c4ff92SAndroid Build Coastguard Worker     {
44*89c4ff92SAndroid Build Coastguard Worker         // This shouldn't happen for this simple sample, with reference backend.
45*89c4ff92SAndroid Build Coastguard Worker         // But in general usage Optimize could fail if the hardware at runtime cannot
46*89c4ff92SAndroid Build Coastguard Worker         // support the model that has been provided.
47*89c4ff92SAndroid Build Coastguard Worker         std::cerr << "Error: Failed to optimise the input network." << std::endl;
48*89c4ff92SAndroid Build Coastguard Worker         return 1;
49*89c4ff92SAndroid Build Coastguard Worker     }
50*89c4ff92SAndroid Build Coastguard Worker 
51*89c4ff92SAndroid Build Coastguard Worker     // Load graph into runtime
52*89c4ff92SAndroid Build Coastguard Worker     run->LoadNetwork(networkIdentifier, std::move(optNet));
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker     // input data
55*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> input0Data
56*89c4ff92SAndroid Build Coastguard Worker         {
57*89c4ff92SAndroid Build Coastguard Worker             5.0f, 3.0f
58*89c4ff92SAndroid Build Coastguard Worker         };
59*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> input1Data
60*89c4ff92SAndroid Build Coastguard Worker         {
61*89c4ff92SAndroid Build Coastguard Worker             10.0f, 8.0f
62*89c4ff92SAndroid Build Coastguard Worker         };
63*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputData(2);
64*89c4ff92SAndroid Build Coastguard Worker 
65*89c4ff92SAndroid Build Coastguard Worker     TensorInfo inputTensorInfo = run->GetInputTensorInfo(networkIdentifier, 0);
66*89c4ff92SAndroid Build Coastguard Worker     inputTensorInfo.SetConstant(true);
67*89c4ff92SAndroid Build Coastguard Worker     InputTensors inputTensors
68*89c4ff92SAndroid Build Coastguard Worker         {
69*89c4ff92SAndroid Build Coastguard Worker             {0,armnn::ConstTensor(inputTensorInfo, input0Data.data())},
70*89c4ff92SAndroid Build Coastguard Worker             {1,armnn::ConstTensor(inputTensorInfo, input1Data.data())}
71*89c4ff92SAndroid Build Coastguard Worker         };
72*89c4ff92SAndroid Build Coastguard Worker     OutputTensors outputTensors
73*89c4ff92SAndroid Build Coastguard Worker         {
74*89c4ff92SAndroid Build Coastguard Worker             {0,armnn::Tensor(run->GetOutputTensorInfo(networkIdentifier, 0), outputData.data())}
75*89c4ff92SAndroid Build Coastguard Worker         };
76*89c4ff92SAndroid Build Coastguard Worker 
77*89c4ff92SAndroid Build Coastguard Worker     // Execute network
78*89c4ff92SAndroid Build Coastguard Worker     run->EnqueueWorkload(networkIdentifier, inputTensors, outputTensors);
79*89c4ff92SAndroid Build Coastguard Worker 
80*89c4ff92SAndroid Build Coastguard Worker     std::cout << "Addition operator result is {" << outputData[0] << "," << outputData[1] << "}" << std::endl;
81*89c4ff92SAndroid Build Coastguard Worker     return 0;
82*89c4ff92SAndroid Build Coastguard Worker }
83