blob: 73cbbb8162eb140ce3659fef11370be1ba04ffea [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Finn Williams452c5802022-06-20 13:48:20 +01002// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa01c577f2c2018-08-31 09:22:23 +01005
Jan Eilers45274902020-10-15 18:34:43 +01006#include "ExecuteNetworkProgramOptions.hpp"
Finn Williams452c5802022-06-20 13:48:20 +01007#include "ArmNNExecutor.hpp"
8#if defined(ARMNN_TF_LITE_DELEGATE)
9#include "TfliteExecutor.hpp"
10#endif
Jan Eilers45274902020-10-15 18:34:43 +010011#include <armnn/Logging.hpp>
Jan Eilers45274902020-10-15 18:34:43 +010012
Sadik Armagan5d03e312020-11-17 16:43:56 +000013
Finn Williams452c5802022-06-20 13:48:20 +010014std::unique_ptr<IExecutor> BuildExecutor(ProgramOptions& programOptions)
Colm Donelan3cff15a2021-10-12 15:06:19 +010015{
Finn Williams452c5802022-06-20 13:48:20 +010016 if (programOptions.m_ExNetParams.m_TfLiteExecutor == ExecuteNetworkParams::TfLiteExecutor::ArmNNTfLiteDelegate ||
17 programOptions.m_ExNetParams.m_TfLiteExecutor == ExecuteNetworkParams::TfLiteExecutor::TfliteInterpreter)
Colm Donelan3cff15a2021-10-12 15:06:19 +010018 {
Finn Williams452c5802022-06-20 13:48:20 +010019#if defined(ARMNN_TF_LITE_DELEGATE)
20 return std::make_unique<TfLiteExecutor>(programOptions.m_ExNetParams);
21#else
22 ARMNN_LOG(fatal) << "Not built with Arm NN Tensorflow-Lite delegate support.";
23 return nullptr;
24#endif
Sadik Armagan19a1c032021-01-20 12:17:00 +000025 }
Finn Williamsf806c4d2021-02-22 15:13:12 +000026 else
27 {
Finn Williams452c5802022-06-20 13:48:20 +010028 return std::make_unique<ArmNNExecutor>(programOptions.m_ExNetParams, programOptions.m_RuntimeOptions);
Finn Williamsf806c4d2021-02-22 15:13:12 +000029 }
Jan Eilers45274902020-10-15 18:34:43 +010030}
31
James Conroy7b4886f2019-04-11 10:23:58 +010032// MAIN
telsoa01c577f2c2018-08-31 09:22:23 +010033int main(int argc, const char* argv[])
34{
35 // Configures logging for both the ARMNN library and this test program.
Jan Eilers45274902020-10-15 18:34:43 +010036 #ifdef NDEBUG
telsoa01c577f2c2018-08-31 09:22:23 +010037 armnn::LogSeverity level = armnn::LogSeverity::Info;
Jan Eilers45274902020-10-15 18:34:43 +010038 #else
telsoa01c577f2c2018-08-31 09:22:23 +010039 armnn::LogSeverity level = armnn::LogSeverity::Debug;
Jan Eilers45274902020-10-15 18:34:43 +010040 #endif
telsoa01c577f2c2018-08-31 09:22:23 +010041 armnn::ConfigureLogging(true, true, level);
telsoa01c577f2c2018-08-31 09:22:23 +010042
telsoa01c577f2c2018-08-31 09:22:23 +010043
Jan Eilers45274902020-10-15 18:34:43 +010044 // Get ExecuteNetwork parameters and runtime options from command line
Jan Eilersf17fcd52021-07-26 22:20:00 +010045 // This might throw an InvalidArgumentException if the user provided invalid inputs
Finn Williams452c5802022-06-20 13:48:20 +010046 ProgramOptions programOptions;
47 try
48 {
49 programOptions.ParseOptions(argc, argv);
50 }
51 catch (const std::exception &e)
52 {
Jan Eilersf17fcd52021-07-26 22:20:00 +010053 ARMNN_LOG(fatal) << e.what();
54 return EXIT_FAILURE;
55 }
Narumol Prangnawaratd8cc8112020-03-24 13:54:05 +000056
Finn Williams452c5802022-06-20 13:48:20 +010057 std::vector<const void *> outputResults;
58
59 auto executor = BuildExecutor(programOptions);
60 if (!executor)
Keith Davisf4874862021-08-09 16:49:18 +010061 {
Keith Davisf4874862021-08-09 16:49:18 +010062 return EXIT_FAILURE;
63 }
64
Finn Williams452c5802022-06-20 13:48:20 +010065 executor->PrintNetworkInfo();
66 outputResults = executor->Execute();
Jan Eilers45274902020-10-15 18:34:43 +010067
Finn Williams452c5802022-06-20 13:48:20 +010068 if (!programOptions.m_ExNetParams.m_ComparisonComputeDevices.empty() ||
69 programOptions.m_ExNetParams.m_CompareWithTflite)
Finn Williamsd7fcafa2020-04-23 17:55:18 +010070 {
Finn Williams452c5802022-06-20 13:48:20 +010071 ExecuteNetworkParams comparisonParams = programOptions.m_ExNetParams;
72 comparisonParams.m_ComputeDevices = programOptions.m_ExNetParams.m_ComparisonComputeDevices;
73
74 if (programOptions.m_ExNetParams.m_CompareWithTflite)
Finn Williamsf806c4d2021-02-22 15:13:12 +000075 {
Finn Williams452c5802022-06-20 13:48:20 +010076 comparisonParams.m_TfLiteExecutor = ExecuteNetworkParams::TfLiteExecutor::TfliteInterpreter;
Finn Williamsf806c4d2021-02-22 15:13:12 +000077 }
Finn Williams452c5802022-06-20 13:48:20 +010078
79 auto comparisonExecutor = BuildExecutor(programOptions);
80
81 if (!comparisonExecutor)
Sadik Armagan5d03e312020-11-17 16:43:56 +000082 {
Sadik Armagan5d03e312020-11-17 16:43:56 +000083 return EXIT_FAILURE;
Sadik Armagan5d03e312020-11-17 16:43:56 +000084 }
Finn Williams452c5802022-06-20 13:48:20 +010085
86 comparisonExecutor->PrintNetworkInfo();
87 comparisonExecutor->Execute();
88
89 comparisonExecutor->CompareAndPrintResult(outputResults);
telsoa014fcda012018-03-09 14:13:49 +000090 }
91}