blob: 14841ec1e998b3a2bf8d85ee6a27e2e961b492e1 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Colm Donelan18e6f042023-01-24 22:10:12 +00002// Copyright © 2022-2023 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"
Teresa Charlin83b42912022-07-07 14:24:59 +01007#include "ArmNNExecutor.hpp"
8#if defined(ARMNN_TFLITE_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
Nikhil Raj Armf4ccb1f2022-07-05 09:29:18 +000013
Teresa Charlin83b42912022-07-07 14:24:59 +010014std::unique_ptr<IExecutor> BuildExecutor(ProgramOptions& programOptions)
Nikhil Raj Armf4ccb1f2022-07-05 09:29:18 +000015{
Teresa Charlin83b42912022-07-07 14:24:59 +010016 if (programOptions.m_ExNetParams.m_TfLiteExecutor == ExecuteNetworkParams::TfLiteExecutor::ArmNNTfLiteDelegate ||
17 programOptions.m_ExNetParams.m_TfLiteExecutor == ExecuteNetworkParams::TfLiteExecutor::TfliteInterpreter)
Nikhil Raj Armf4ccb1f2022-07-05 09:29:18 +000018 {
Nikhil Raj Armf4ccb1f2022-07-05 09:29:18 +000019#if defined(ARMNN_TFLITE_DELEGATE)
Colm Donelan35a06892023-02-06 15:01:57 +000020 return std::make_unique<TfLiteExecutor>(programOptions.m_ExNetParams, programOptions.m_RuntimeOptions);
Teresa Charlin83b42912022-07-07 14:24:59 +010021#else
22 ARMNN_LOG(fatal) << "Not built with Arm NN Tensorflow-Lite delegate support.";
Colm Donelan18e6f042023-01-24 22:10:12 +000023 return nullptr;
Teresa Charlin83b42912022-07-07 14:24:59 +010024#endif
Sadik Armagan19a1c032021-01-20 12:17:00 +000025 }
Finn Williamsf806c4d2021-02-22 15:13:12 +000026 else
27 {
Teresa Charlin83b42912022-07-07 14:24:59 +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.
Teresa Charlin83b42912022-07-07 14:24:59 +010036#ifdef NDEBUG
telsoa01c577f2c2018-08-31 09:22:23 +010037 armnn::LogSeverity level = armnn::LogSeverity::Info;
Teresa Charlin83b42912022-07-07 14:24:59 +010038#else
telsoa01c577f2c2018-08-31 09:22:23 +010039 armnn::LogSeverity level = armnn::LogSeverity::Debug;
Teresa Charlin83b42912022-07-07 14:24:59 +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
Teresa Charlin83b42912022-07-07 14:24:59 +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
Teresa Charlin83b42912022-07-07 14:24:59 +010057 std::vector<const void*> outputResults;
Colm Donelan78044812022-09-27 16:46:09 +010058 std::unique_ptr<IExecutor> executor;
59 try
Keith Davisf4874862021-08-09 16:49:18 +010060 {
Colm Donelan78044812022-09-27 16:46:09 +010061 executor = BuildExecutor(programOptions);
Colm Donelan18e6f042023-01-24 22:10:12 +000062 if ((!executor) || (executor->m_constructionFailed))
Colm Donelan78044812022-09-27 16:46:09 +010063 {
64 return EXIT_FAILURE;
65 }
66 }
67 catch (const std::exception& e)
68 {
69 ARMNN_LOG(fatal) << e.what();
Keith Davisf4874862021-08-09 16:49:18 +010070 return EXIT_FAILURE;
71 }
72
Colm Donelan78044812022-09-27 16:46:09 +010073
Teresa Charlin83b42912022-07-07 14:24:59 +010074 executor->PrintNetworkInfo();
75 outputResults = executor->Execute();
Jan Eilers45274902020-10-15 18:34:43 +010076
Teresa Charlin83b42912022-07-07 14:24:59 +010077 if (!programOptions.m_ExNetParams.m_ComparisonComputeDevices.empty() ||
78 programOptions.m_ExNetParams.m_CompareWithTflite)
Finn Williamsd7fcafa2020-04-23 17:55:18 +010079 {
Teresa Charlin83b42912022-07-07 14:24:59 +010080 ExecuteNetworkParams comparisonParams = programOptions.m_ExNetParams;
81 comparisonParams.m_ComputeDevices = programOptions.m_ExNetParams.m_ComparisonComputeDevices;
82
83 if (programOptions.m_ExNetParams.m_CompareWithTflite)
Finn Williamsf806c4d2021-02-22 15:13:12 +000084 {
Teresa Charlin83b42912022-07-07 14:24:59 +010085 comparisonParams.m_TfLiteExecutor = ExecuteNetworkParams::TfLiteExecutor::TfliteInterpreter;
Finn Williamsf806c4d2021-02-22 15:13:12 +000086 }
Teresa Charlin83b42912022-07-07 14:24:59 +010087
88 auto comparisonExecutor = BuildExecutor(programOptions);
89
90 if (!comparisonExecutor)
Sadik Armagan5d03e312020-11-17 16:43:56 +000091 {
Sadik Armagan5d03e312020-11-17 16:43:56 +000092 return EXIT_FAILURE;
Sadik Armagan5d03e312020-11-17 16:43:56 +000093 }
Teresa Charlin83b42912022-07-07 14:24:59 +010094
95 comparisonExecutor->PrintNetworkInfo();
96 comparisonExecutor->Execute();
97
98 comparisonExecutor->CompareAndPrintResult(outputResults);
telsoa014fcda012018-03-09 14:13:49 +000099 }
100}