17 #include <common/include/LabelsAndEventClasses.hpp> 18 #include <common/include/Processes.hpp> 26 #include <valgrind/memcheck.h> 29 #include <doctest/doctest.h> 38 runtime->m_LoadedNetworks.reserve(1);
45 TEST_CASE(
"RuntimeUnloadNetwork")
54 mockNetwork1->AddInputLayer(0,
"test layer");
56 runtime->LoadNetwork(networkIdentifier1,
Optimize(*mockNetwork1, backends, runtime->GetDeviceSpec()));
61 mockNetwork2->AddInputLayer(0,
"test layer");
62 runtime->LoadNetwork(networkIdentifier2,
Optimize(*mockNetwork2, backends, runtime->GetDeviceSpec()));
70 TEST_CASE(
"RuntimePreImportInputs")
77 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
78 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 2 layer");
79 auto addLayer = testNetwork->AddAdditionLayer(
"add layer");
80 auto outputLayer = testNetwork->AddOutputLayer(2,
"output layer");
84 inputLayer1->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0));
85 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
87 inputLayer2->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1));
88 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
90 addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
91 addLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
97 runtime->LoadNetwork(networkId,
98 Optimize(*testNetwork, backends, runtime->GetDeviceSpec()),
102 std::vector<int> inputData1(4, 10);
103 std::vector<int> inputData2(4, 20);
104 std::vector<int> output(4);
110 auto importedInputVec1 = runtime->ImportInputs(networkId, {{0, inputTensor1}},
MemorySource::Malloc);
111 CHECK(importedInputVec1.size() == 1);
112 CHECK(importedInputVec1[0] == 0);
114 auto memHandle = runtime->CreateWorkingMemHandle(networkId);
116 runtime->Execute(*memHandle.get(), {{1, inputTensor2}}, {{2, outputTensor}}, {0 });
117 for (
auto val: output) {
121 auto importedInputVec2 = runtime->ImportInputs(networkId, {{1, inputTensor2}},
MemorySource::Malloc);
122 CHECK(importedInputVec2.size() == 1);
123 CHECK(importedInputVec2[0] == 1);
125 runtime->Execute(*memHandle.get(), {{0, inputTensor1}}, {{2, outputTensor}}, {1 });
126 for (
auto val: output) {
130 runtime->Execute(*memHandle.get(), {}, {{2, outputTensor}}, {0, 1});
131 for (
auto val: output) {
135 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {}, {{2, outputTensor}}, {0, 0});,
138 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {{1, inputTensor2}}, {{2, outputTensor}}, {1});,
141 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {{1, inputTensor2}}, {{2, outputTensor}}, {10});,
144 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {{-2, inputTensor2}}, {{2, outputTensor}}, {1});,
147 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {{-2, inputTensor2}}, {{2, outputTensor}}, {10});,
149 auto importedInputVec3 = runtime->ImportInputs(networkId, {{1, inputTensor2}},
MemorySource::Malloc);
150 CHECK(importedInputVec3[0] == 2);
152 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {}, {{2, outputTensor}}, {0, 1, 2});,
155 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(),
161 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {}, {{2, outputTensor}}, {0});,
163 runtime->ClearImportedInputs(networkId, {1});
164 runtime->Execute(*memHandle.get(), {{1, inputTensor2}}, {{2, outputTensor}}, {0}, {});
165 for (
auto val: output) {
169 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {}, {{2, outputTensor}}, {0, 1}, {});,
179 TEST_CASE(
"RuntimePreImportOutputs")
189 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
190 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
194 activationDescriptor.
m_A = 2.0f;
195 activationDescriptor.
m_B = 0.0f;
196 auto activationLayer1 = testNetwork->AddActivationLayer(activationDescriptor,
"add layer");
197 auto outputLayer1 = testNetwork->AddOutputLayer(2,
"output layer");
199 inputLayer1->GetOutputSlot(0).Connect(activationLayer1->GetInputSlot(0));
201 activationLayer1->GetOutputSlot(0).Connect(outputLayer1->GetInputSlot(0));
202 activationLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
204 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 1 layer");
206 activationDescriptor.
m_A = 4.0f;
207 activationDescriptor.
m_B = 2.0f;
208 auto activationLayer2 = testNetwork->AddActivationLayer(activationDescriptor,
"add layer");
209 auto outputLayer2 = testNetwork->AddOutputLayer(3,
"output layer");
211 inputLayer2->GetOutputSlot(0).Connect(activationLayer2->GetInputSlot(0));
212 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
214 activationLayer2->GetOutputSlot(0).Connect(outputLayer2->GetInputSlot(0));
215 activationLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
221 runtime->LoadNetwork(networkId,
222 Optimize(*testNetwork, backends, runtime->GetDeviceSpec()),
226 std::vector<float> inputData1(4, 1.0f);
227 std::vector<float> inputData2(4, 3.0f);
229 std::vector<float> outputData1(4);
230 std::vector<float> outputData2(4);
232 ConstTensor inputTensor1(tensorInfo, inputData1.data());
233 ConstTensor inputTensor2(tensorInfo, inputData2.data());
235 Tensor outputTensor1{tensorInfo, outputData1.data()};
236 Tensor outputTensor2{tensorInfo, outputData2.data()};
238 InputTensors inputTensors = {{0, inputTensor1}, {1, inputTensor2}};
240 std::pair<LayerBindingId, class Tensor> output1{2, outputTensor1};
241 std::pair<LayerBindingId, class Tensor> output2{3, outputTensor2};
243 auto testOutputs = [&]()
245 for (
auto val : outputData1)
250 for (
auto val : outputData2)
256 auto memHandle = runtime->CreateWorkingMemHandle(networkId);
258 runtime->Execute(*memHandle.get(),inputTensors, {output1, output2});
261 auto importedOutputVec = runtime->ImportOutputs(networkId, {output1, output2 },
MemorySource::Malloc);
262 CHECK(importedOutputVec.size() == 2);
263 CHECK(importedOutputVec[0] == 0);
264 CHECK(importedOutputVec[1] == 1);
266 runtime->Execute(*memHandle.get(), inputTensors, {}, {}, importedOutputVec);
269 runtime->Execute(*memHandle.get(), inputTensors, {output1}, {}, {1});
272 runtime->Execute(*memHandle.get(), inputTensors, {output2}, {}, {0});
276 CHECK(importedInputVec.size() == 2);
277 CHECK(importedInputVec[0] == 0);
278 CHECK(importedInputVec[1] == 1);
280 runtime->Execute(*memHandle.get(), {}, {}, importedInputVec, importedOutputVec);
283 runtime->Execute(*memHandle.get(), {{0, inputTensor1}}, {output2}, {1}, {0});
287 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {output1, output2}, {}, {0, 1});,
291 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {output2}, {}, {1});,
295 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {output1, output1}, {}, {});,
299 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {}, {}, {0, 0}),
303 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {output1}, {}, {3});,
307 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {{4, outputTensor2}}, {}, {1});,
311 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {{0, outputTensor2}}, {}, {1});,
315 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {{0, outputTensor2}}, {}, {1});,
319 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), {{2, inputTensor1}}, {{0, outputTensor2}}, {1}, {1, 0});,
322 runtime->ClearImportedOutputs(networkId, {1});
324 runtime->Execute(*memHandle.get(), inputTensors, {output2}, {}, {0});
328 CHECK_THROWS_AS(runtime->Execute(*memHandle.get(), inputTensors, {}, {}, importedOutputVec),
343 #ifdef ARMNN_LEAK_CHECKING_ENABLED 345 struct DisableGlobalLeakChecking
347 DisableGlobalLeakChecking()
353 TEST_CASE_FIXTURE(DisableGlobalLeakChecking,
"RuntimeHeapMemoryUsageSanityChecks")
361 std::unique_ptr<char[]> dummyAllocation(
new char[1000]);
374 #endif // ARMNN_LEAK_CHECKING_ENABLED 380 TEST_CASE(
"RuntimeMemoryLeak")
386 unsigned long leakedBefore = 0;
387 unsigned long leakedAfter = 0;
392 unsigned long reachableBefore = 0;
393 unsigned long reachableAfter = 0;
396 unsigned long dubious = 0;
397 unsigned long suppressed = 0;
411 mockNetwork1->AddInputLayer(0,
"test layer");
418 VALGRIND_DO_QUICK_LEAK_CHECK;
419 VALGRIND_COUNT_LEAKS(leakedBefore, dubious, reachableBefore, suppressed);
425 VALGRIND_DO_ADDED_LEAK_CHECK;
426 VALGRIND_COUNT_LEAKS(leakedAfter, dubious, reachableAfter, suppressed);
430 CHECK(leakedBefore == leakedAfter);
431 CHECK(reachableBefore == reachableAfter);
438 #endif // WITH_VALGRIND 440 TEST_CASE(
"RuntimeCpuRef")
442 using namespace armnn;
471 CHECK(runtime->LoadNetwork(netId, std::move(optNet)) ==
Status::Success);
474 TEST_CASE(
"RuntimeFallbackToCpuRef")
476 using namespace armnn;
506 CHECK(runtime->LoadNetwork(netId, std::move(optNet)) ==
Status::Success);
509 TEST_CASE(
"IVGCVSW_1929_QuantizedSoftmaxIssue")
512 using namespace armnn;
536 std::vector<std::string> errMessages;
542 runtime->GetDeviceSpec(),
545 FAIL(
"An exception should have been thrown");
551 CHECK(errMessages.size() > 0);
554 TEST_CASE(
"RuntimeBackendOptions")
556 using namespace armnn;
570 options1.
AddOption({
"Option3",
"some_value" });
573 backendOptions.push_back(options1);
582 CHECK(backendOptions[0].
GetBackendId().Get() ==
"FakeBackend1");
583 CHECK(backendOptions[0].GetOption(0).GetName() ==
"Option1");
584 CHECK(backendOptions[0].GetOption(0).GetValue().IsFloat() ==
true);
585 CHECK(backendOptions[0].GetOption(0).GetValue().AsFloat() == 1.3f);
587 CHECK(backendOptions[0].GetOption(1).GetName() ==
"Option2");
588 CHECK(backendOptions[0].GetOption(1).GetValue().IsBool() ==
true);
589 CHECK(backendOptions[0].GetOption(1).GetValue().AsBool() ==
true);
591 CHECK(backendOptions[0].GetOption(2).GetName() ==
"Option3");
592 CHECK(backendOptions[0].GetOption(2).GetValue().IsString() ==
true);
593 CHECK(backendOptions[0].GetOption(2).GetValue().AsString() ==
"some_value");
596 CHECK(backendOptions[1].
GetBackendId().Get() ==
"FakeBackend1");
597 CHECK(backendOptions[1].GetOption(0).GetName() ==
"Option4");
598 CHECK(backendOptions[1].GetOption(0).GetValue().IsInt() ==
true);
599 CHECK(backendOptions[1].GetOption(0).GetValue().AsInt() == 42);
602 TEST_CASE(
"ProfilingDisable")
604 using namespace armnn;
606 LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
641 auto readableBuffer = bufferManager.GetReadableBuffer();
644 CHECK(!readableBuffer);
647 TEST_CASE(
"ProfilingEnableCpuRef")
649 using namespace armnn;
674 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor,
"normalization");
688 ProfilingGuid optNetGuid = optNet->GetGuid();
695 auto readableBuffer = bufferManager.GetReadableBuffer();
698 CHECK(readableBuffer !=
nullptr);
700 unsigned int size = readableBuffer->GetSize();
702 const unsigned char* readableData = readableBuffer->GetReadableData();
703 CHECK(readableData !=
nullptr);
705 unsigned int offset = 0;
716 arm::pipe::EmptyOptional(),
718 LabelsAndEventClasses::NETWORK_GUID,
719 LabelsAndEventClasses::TYPE_GUID,
725 arm::pipe::EmptyOptional(),
726 arm::pipe::EmptyOptional(),
732 arm::pipe::EmptyOptional(),
735 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
740 int processID = arm::pipe::GetCurrentProcessId();
741 std::stringstream ss;
743 std::string processIdLabel = ss.str();
748 arm::pipe::EmptyOptional(),
750 arm::pipe::EmptyOptional(),
751 LabelsAndEventClasses::PROCESS_ID_GUID,
761 arm::pipe::EmptyOptional(),
"input", readableData, offset);
765 arm::pipe::EmptyOptional(),
768 LabelsAndEventClasses::NAME_GUID,
774 arm::pipe::EmptyOptional(),
776 LabelsAndEventClasses::LAYER_GUID,
777 LabelsAndEventClasses::TYPE_GUID,
783 arm::pipe::EmptyOptional(),
786 LabelsAndEventClasses::CHILD_GUID,
796 arm::pipe::EmptyOptional(),
"normalization", readableData, offset);
800 arm::pipe::EmptyOptional(),
802 normalizationLayerNameGuid,
803 LabelsAndEventClasses::NAME_GUID,
809 arm::pipe::EmptyOptional(),
811 LabelsAndEventClasses::LAYER_GUID,
812 LabelsAndEventClasses::TYPE_GUID,
818 arm::pipe::EmptyOptional(),
821 LabelsAndEventClasses::CHILD_GUID,
827 arm::pipe::EmptyOptional(),
830 LabelsAndEventClasses::CONNECTION_GUID,
837 arm::pipe::EmptyOptional(), readableData, offset);
841 arm::pipe::EmptyOptional(),
842 normalizationWorkloadGuid,
843 LabelsAndEventClasses::WORKLOAD_GUID,
844 LabelsAndEventClasses::TYPE_GUID,
850 arm::pipe::EmptyOptional(),
"CpuRef", readableData, offset);
854 arm::pipe::EmptyOptional(),
855 normalizationWorkloadGuid,
857 LabelsAndEventClasses::BACKENDID_GUID,
863 arm::pipe::EmptyOptional(),
865 normalizationWorkloadGuid,
866 LabelsAndEventClasses::CHILD_GUID,
876 arm::pipe::EmptyOptional(),
"output", readableData, offset);
880 arm::pipe::EmptyOptional(),
883 LabelsAndEventClasses::NAME_GUID,
889 arm::pipe::EmptyOptional(),
891 LabelsAndEventClasses::LAYER_GUID,
892 LabelsAndEventClasses::TYPE_GUID,
898 arm::pipe::EmptyOptional(),
901 LabelsAndEventClasses::CHILD_GUID,
907 arm::pipe::EmptyOptional(),
910 LabelsAndEventClasses::CONNECTION_GUID,
914 bufferManager.MarkRead(readableBuffer);
917 std::vector<float> inputData(16);
918 std::vector<float> outputData(16);
924 {0,
ConstTensor(inputTensorInfo, inputData.data())}
935 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
936 CHECK(inputReadableBuffer !=
nullptr);
939 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
940 CHECK(outputReadableBuffer !=
nullptr);
943 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
944 CHECK(inferenceReadableBuffer !=
nullptr);
947 size = inputReadableBuffer->GetSize();
950 readableData = inputReadableBuffer->GetReadableData();
951 CHECK(readableData !=
nullptr);
961 arm::pipe::EmptyOptional(), readableData, offset);
965 arm::pipe::EmptyOptional(),
967 LabelsAndEventClasses::WORKLOAD_GUID,
968 LabelsAndEventClasses::TYPE_GUID,
974 arm::pipe::EmptyOptional(),
"CpuRef", readableData, offset);
978 arm::pipe::EmptyOptional(),
981 LabelsAndEventClasses::BACKENDID_GUID,
987 arm::pipe::EmptyOptional(),
990 LabelsAndEventClasses::CHILD_GUID,
994 bufferManager.MarkRead(inputReadableBuffer);
997 size = outputReadableBuffer->GetSize();
1000 readableData = outputReadableBuffer->GetReadableData();
1001 CHECK(readableData !=
nullptr);
1011 arm::pipe::EmptyOptional(), readableData, offset);
1015 arm::pipe::EmptyOptional(),
1017 LabelsAndEventClasses::WORKLOAD_GUID,
1018 LabelsAndEventClasses::TYPE_GUID,
1027 arm::pipe::EmptyOptional(),
1030 LabelsAndEventClasses::BACKENDID_GUID,
1036 arm::pipe::EmptyOptional(),
1039 LabelsAndEventClasses::CHILD_GUID,
1043 bufferManager.MarkRead(outputReadableBuffer);
1046 size = inferenceReadableBuffer->GetSize();
1047 CHECK(size == 976 + 8 * ThreadIdSize);
1049 readableData = inferenceReadableBuffer->GetReadableData();
1050 CHECK(readableData !=
nullptr);
1060 arm::pipe::EmptyOptional(), readableData, offset);
1064 arm::pipe::EmptyOptional(),
1066 LabelsAndEventClasses::INFERENCE_GUID,
1067 LabelsAndEventClasses::TYPE_GUID,
1073 arm::pipe::EmptyOptional(),
1076 LabelsAndEventClasses::EXECUTION_OF_GUID,
1083 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1087 arm::pipe::EmptyOptional(),
1090 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1098 arm::pipe::EmptyOptional(), readableData, offset);
1102 arm::pipe::EmptyOptional(),
1103 inputWorkloadExecutionGuid,
1104 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1105 LabelsAndEventClasses::TYPE_GUID,
1111 arm::pipe::EmptyOptional(),
1113 inputWorkloadExecutionGuid,
1114 LabelsAndEventClasses::CHILD_GUID,
1120 arm::pipe::EmptyOptional(),
1122 inputWorkloadExecutionGuid,
1123 LabelsAndEventClasses::EXECUTION_OF_GUID,
1130 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1134 arm::pipe::EmptyOptional(),
1135 inputWorkloadExecutionGuid,
1136 inputWorkloadExecutionSOLEventId,
1137 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1144 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1148 arm::pipe::EmptyOptional(),
1149 inputWorkloadExecutionGuid,
1150 inputWorkloadExecutionEOLEventId,
1151 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1158 arm::pipe::EmptyOptional(), readableData, offset);
1162 arm::pipe::EmptyOptional(),
1163 normalizeWorkloadExecutionGuid,
1164 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1165 LabelsAndEventClasses::TYPE_GUID,
1171 arm::pipe::EmptyOptional(),
1173 normalizeWorkloadExecutionGuid,
1174 LabelsAndEventClasses::CHILD_GUID,
1180 arm::pipe::EmptyOptional(),
1181 normalizationWorkloadGuid,
1182 normalizeWorkloadExecutionGuid,
1183 LabelsAndEventClasses::EXECUTION_OF_GUID,
1190 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1194 arm::pipe::EmptyOptional(),
1195 normalizeWorkloadExecutionGuid,
1196 normalizationWorkloadExecutionSOLEventGuid,
1197 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1204 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1208 arm::pipe::EmptyOptional(),
1209 normalizeWorkloadExecutionGuid,
1210 normalizationWorkloadExecutionEOLEventGuid,
1211 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1218 arm::pipe::EmptyOptional(), readableData, offset);
1222 arm::pipe::EmptyOptional(),
1223 outputWorkloadExecutionGuid,
1224 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1225 LabelsAndEventClasses::TYPE_GUID,
1231 arm::pipe::EmptyOptional(),
1233 outputWorkloadExecutionGuid,
1234 LabelsAndEventClasses::CHILD_GUID,
1240 arm::pipe::EmptyOptional(),
1242 outputWorkloadExecutionGuid,
1243 LabelsAndEventClasses::EXECUTION_OF_GUID,
1250 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1254 arm::pipe::EmptyOptional(),
1255 outputWorkloadExecutionGuid,
1256 outputWorkloadExecutionSOLEventGuid,
1257 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1264 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1268 arm::pipe::EmptyOptional(),
1269 outputWorkloadExecutionGuid,
1270 outputWorkloadExecutionEOLEventGuid,
1271 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1278 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1282 arm::pipe::EmptyOptional(),
1284 inferenceEOLEventGuid,
1285 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1289 bufferManager.MarkRead(inferenceReadableBuffer);
1292 TEST_CASE(
"ProfilingPostOptimisationStructureCpuRef")
1297 TEST_CASE(
"RuntimeOptimizeImportOff_LoadNetworkImportOn")
1307 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
1308 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 2 layer");
1309 auto addLayer = testNetwork->AddAdditionLayer(
"add layer");
1310 auto outputLayer = testNetwork->AddOutputLayer(2,
"output layer");
1314 inputLayer1->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0));
1315 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1317 inputLayer2->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1));
1318 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1320 addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1321 addLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1336 runtime->LoadNetwork(networkId, std::move(optNet), er, networkProperties1);
1337 CHECK(er.find(
"However, it was disabled when this network was optimized") != -1);
1340 TEST_CASE(
"RuntimeOptimizeExportOff_LoadNetworkExportOn")
1350 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
1351 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 2 layer");
1352 auto addLayer = testNetwork->AddAdditionLayer(
"add layer");
1353 auto outputLayer = testNetwork->AddOutputLayer(2,
"output layer");
1357 inputLayer1->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0));
1358 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1360 inputLayer2->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1));
1361 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1363 addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1364 addLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1379 runtime->LoadNetwork(networkId, std::move(optNet), er, networkProperties1);
1380 CHECK(er.find(
"However, it was disabled when this network was optimized") != -1);
1383 TEST_CASE(
"RuntimeOptimizeImportOn_LoadNetworkImportOff")
1393 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
1394 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 2 layer");
1395 auto addLayer = testNetwork->AddAdditionLayer(
"add layer");
1396 auto outputLayer = testNetwork->AddOutputLayer(2,
"output layer");
1400 inputLayer1->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0));
1401 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1403 inputLayer2->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1));
1404 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1406 addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1407 addLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1422 runtime->LoadNetwork(networkId, std::move(optNet), er, networkProperties1);
1423 CHECK(er.find(
"However, it was enabled when this network was optimized") != -1);
1426 TEST_CASE(
"RuntimeOptimizeExportOn_LoadNetworkExportOff")
1436 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
1437 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 2 layer");
1438 auto addLayer = testNetwork->AddAdditionLayer(
"add layer");
1439 auto outputLayer = testNetwork->AddOutputLayer(2,
"output layer");
1443 inputLayer1->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0));
1444 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1446 inputLayer2->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1));
1447 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1449 addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1450 addLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1465 runtime->LoadNetwork(networkId, std::move(optNet), er, networkProperties1);
1466 CHECK(er.find(
"However, it was enabled when this network was optimized") != -1);
1469 TEST_CASE(
"SyncExecutePreImportInputsHappyPath")
1484 auto inputLayer1 = testNetwork->AddInputLayer(0,
"input 1 layer");
1485 auto inputLayer2 = testNetwork->AddInputLayer(1,
"input 2 layer");
1486 auto addLayer = testNetwork->AddAdditionLayer(
"add layer");
1487 auto outputLayer = testNetwork->AddOutputLayer(2,
"output layer");
1491 inputLayer1->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0));
1492 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1494 inputLayer2->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1));
1495 inputLayer2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1497 addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1498 addLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1504 runtime->LoadNetwork(networkId,
Optimize(*testNetwork, backends, runtime->GetDeviceSpec()), er, networkProperties);
1506 std::vector<int> inputData1(4, 10);
1507 std::vector<int> inputData2(4, 20);
1508 std::vector<int> output(4);
1516 CHECK_THROWS_AS(runtime->ImportInputs(networkId, { { 0, inputTensor1 }, { 0, inputTensor1 }, { 0, inputTensor1 } },
1521 std::vector<ImportedOutputId> importedInputVec =
1523 CHECK(importedInputVec.size() == 1);
1524 CHECK(importedInputVec[0] == 0);
1531 auto ret = runtime->EnqueueWorkload(networkId, inputTensors, outputTensors, importedInputVec,
1532 std::vector<ImportedOutputId>());
TEST_SUITE("TestConstTensorLayerVisitor")
#define ARMNN_SCOPED_LEAK_CHECKER(TAG)
#define ARMNN_LOCAL_LEAK_CHECKING_ONLY()
armnn::TensorInfo GetInputTensorInfo(NetworkId networkId, LayerBindingId layerId) const
static IRuntimePtr Create(const CreationOptions &options)
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
BufferManager & GetProfilingBufferManager()
void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
CPU Execution: Reference C++ kernels.
Status UnloadNetwork(NetworkId networkId)
Unloads a network from the Runtime.
ProfilingGuid VerifyTimelineEntityBinaryPacketData(arm::pipe::Optional< ProfilingGuid > guid, const unsigned char *readableData, unsigned int &offset)
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Status LoadNetwork(NetworkId &networkIdOut, IOptimizedNetworkPtr network)
Loads a complete network into the Runtime.
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
armnn::TensorInfo GetOutputTensorInfo(NetworkId networkId, LayerBindingId layerId) const
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
bool m_EnableProfiling
Indicates whether external profiling is enabled or not.
virtual void SetTensorInfo(const TensorInfo &tensorInfo)=0
#define ARMNN_LEAK_CHECKER_IS_ACTIVE()
A tensor defined by a TensorInfo (shape and data type) and a mutable backing store.
void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType, arm::pipe::Optional< ProfilingGuid > relationshipGuid, arm::pipe::Optional< ProfilingGuid > headGuid, arm::pipe::Optional< ProfilingGuid > tailGuid, arm::pipe::Optional< ProfilingGuid > attributeGuid, const unsigned char *readableData, unsigned int &offset)
#define ARMNN_OBJECTS_LEAKED_IN_SCOPE()
TEST_CASE_FIXTURE(ClContextControlFixture, "CopyBetweenNeonAndGpu")
std::vector< BackendOptions > m_BackendOptions
Pass backend specific options.
const char * GetBackendId()
void RuntimeLoadedNetworksReserve(armnn::RuntimeImpl *runtime)
void AddOption(BackendOption &&option)
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
const IDeviceSpec & GetDeviceSpec() const
virtual LayerGuid GetGuid() const =0
Returns the unique id of the layer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
ProfilingGuid VerifyTimelineLabelBinaryPacketData(arm::pipe::Optional< ProfilingGuid > guid, const std::string &label, const unsigned char *readableData, unsigned int &offset)
ProfilingOptions ConvertExternalProfilingOptions(const armnn::IRuntime::CreationOptions::ExternalProfilingOptions &options)
ArmNN performs an optimization on each model/network before it gets loaded for execution.
An ActivationDescriptor for the ActivationLayer.
min(a, max(b, input)) ReLu1 & ReLu6.
void VerifyTimelineHeaderBinary(const unsigned char *readableData, unsigned int &offset, uint32_t packetDataLength)
Struct for the users to pass backend specific options.
float m_A
Alpha upper bound value used by the activation functions. (BoundedReLu, Linear, TanH, Elu).
Status EnqueueWorkload(NetworkId networkId, const InputTensors &inputTensors, const OutputTensors &outputTensors, std::vector< ImportedInputId > preImportedInputIds={}, std::vector< ImportedOutputId > preImportedOutputIds={})
void ForceTransitionToState(ProfilingState newState)
CPU Execution: NEON: ArmCompute.
#define ARMNN_NO_LEAKS_IN_SCOPE()
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
void SetConstant(const bool IsConstant=true)
Marks the data corresponding to this tensor info as constant.
bool m_TimelineEnabled
Indicates whether external timeline profiling is enabled or not.
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
virtual int Connect(IInputSlot &destination)=0
A NormalizationDescriptor for the NormalizationLayer.
ExternalProfilingOptions m_ProfilingOptions
arm::pipe::IProfilingService & GetProfilingService(armnn::RuntimeImpl *runtime)
ProfilingGuid VerifyTimelineEventBinaryPacket(arm::pipe::Optional< uint64_t > timestamp, arm::pipe::Optional< int > threadId, arm::pipe::Optional< ProfilingGuid > eventGuid, const unsigned char *readableData, unsigned int &offset)
static INetworkPtr Create(NetworkOptions networkOptions={})
float m_B
Beta lower bound value used by the activation functions. (BoundedReLu, Linear, TanH).
A SoftmaxDescriptor for the SoftmaxLayer.
#define ARMNN_BYTES_LEAKED_IN_SCOPE()
ActivationFunction m_Function
The activation function to use (Sigmoid, TanH, Linear, ReLu, BoundedReLu, SoftReLu, LeakyReLu, Abs, Sqrt, Square, Elu).