Skip to content

Commit d90eec2

Browse files
IVGCVSW-8638 Remove Async API
!armnn:12979 Signed-off-by: Cian McGriskin <[email protected]> Change-Id: I534d071765e6024de2a5d02b0d9c8124a4192612
1 parent e79ce5d commit d90eec2

12 files changed

+50
-681
lines changed

1.2/ArmnnDriverImpl.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,7 @@ Return<V1_0::ErrorStatus> ArmnnDriverImpl::prepareArmnnModel_1_2(
233233
// Load it into the runtime.
234234
armnn::NetworkId netId = 0;
235235
std::string msg;
236-
armnn::INetworkProperties networkProperties(options.isAsyncModelExecutionEnabled(),
237-
MemorySource::Undefined,
236+
armnn::INetworkProperties networkProperties(MemorySource::Undefined,
238237
MemorySource::Undefined,
239238
options.IsGpuProfilingEnabled());
240239

@@ -269,8 +268,6 @@ Return<V1_0::ErrorStatus> ArmnnDriverImpl::prepareArmnnModel_1_2(
269268
model,
270269
options.GetRequestInputsAndOutputsDumpDir(),
271270
options.IsGpuProfilingEnabled(),
272-
options.isAsyncModelExecutionEnabled(),
273-
options.getNoOfArmnnThreads(),
274271
options.isImportEnabled(),
275272
options.isExportEnabled()));
276273

@@ -612,8 +609,7 @@ Return<V1_0::ErrorStatus> ArmnnDriverImpl::prepareModelFromCache(
612609
// Load it into the runtime.
613610
armnn::NetworkId netId = 0;
614611
std::string msg;
615-
armnn::INetworkProperties networkProperties(options.isAsyncModelExecutionEnabled(),
616-
MemorySource::Undefined,
612+
armnn::INetworkProperties networkProperties(MemorySource::Undefined,
617613
MemorySource::Undefined,
618614
options.IsGpuProfilingEnabled());
619615

@@ -638,8 +634,6 @@ Return<V1_0::ErrorStatus> ArmnnDriverImpl::prepareModelFromCache(
638634
runtime.get(),
639635
options.GetRequestInputsAndOutputsDumpDir(),
640636
options.IsGpuProfilingEnabled(),
641-
options.isAsyncModelExecutionEnabled(),
642-
options.getNoOfArmnnThreads(),
643637
options.isImportEnabled(),
644638
options.isExportEnabled(),
645639
true));

1.3/ArmnnDriverImpl.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ Return<V1_3::ErrorStatus> ArmnnDriverImpl::prepareArmnnModel_1_3(
246246
// Load it into the runtime.
247247
armnn::NetworkId netId = 0;
248248
std::string msg;
249-
armnn::INetworkProperties networkProperties(options.isAsyncModelExecutionEnabled(),
250-
MemorySource::Undefined,
249+
armnn::INetworkProperties networkProperties(MemorySource::Undefined,
251250
MemorySource::Undefined,
252251
options.IsGpuProfilingEnabled());
253252

@@ -283,8 +282,6 @@ Return<V1_3::ErrorStatus> ArmnnDriverImpl::prepareArmnnModel_1_3(
283282
options.GetRequestInputsAndOutputsDumpDir(),
284283
options.IsGpuProfilingEnabled(),
285284
priority,
286-
options.isAsyncModelExecutionEnabled(),
287-
options.getNoOfArmnnThreads(),
288285
options.isImportEnabled(),
289286
options.isExportEnabled()));
290287

@@ -628,8 +625,7 @@ Return<V1_3::ErrorStatus> ArmnnDriverImpl::prepareModelFromCache_1_3(
628625
// Load it into the runtime.
629626
armnn::NetworkId netId = 0;
630627
std::string msg;
631-
armnn::INetworkProperties networkProperties(options.isAsyncModelExecutionEnabled(),
632-
MemorySource::Undefined,
628+
armnn::INetworkProperties networkProperties(MemorySource::Undefined,
633629
MemorySource::Undefined,
634630
options.IsGpuProfilingEnabled());
635631

@@ -654,8 +650,6 @@ Return<V1_3::ErrorStatus> ArmnnDriverImpl::prepareModelFromCache_1_3(
654650
options.GetRequestInputsAndOutputsDumpDir(),
655651
options.IsGpuProfilingEnabled(),
656652
V1_3::Priority::MEDIUM,
657-
options.isAsyncModelExecutionEnabled(),
658-
options.getNoOfArmnnThreads(),
659653
options.isImportEnabled(),
660654
options.isExportEnabled(),
661655
true));

ArmnnDevice.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,7 @@ ArmnnDevice::ArmnnDevice(DriverOptions options)
9898
}
9999
else
100100
{
101-
if (m_Options.isAsyncModelExecutionEnabled() &&
102-
armnn::HasMatchingCapability(armnn::BackendOptions::BackendOption{"AsyncExecution", false},
103-
backend))
104-
{
105-
ALOGV("ArmnnDevice: ArmNN does not support AsyncExecution with the following backend: %s",
106-
backend.Get().c_str());
107-
}
108-
else
109-
{
110-
backends.push_back(backend);
111-
}
101+
backends.push_back(backend);
112102
}
113103
}
114104
}

ArmnnDriverImpl.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ Return<V1_0::ErrorStatus> ArmnnDriverImpl<HalPolicy>::prepareModel(
171171
// Load it into the runtime.
172172
armnn::NetworkId netId = 0;
173173
std::string msg;
174-
armnn::INetworkProperties networkProperties(options.isAsyncModelExecutionEnabled(),
175-
armnn::MemorySource::Undefined,
174+
armnn::INetworkProperties networkProperties(armnn::MemorySource::Undefined,
176175
armnn::MemorySource::Undefined);
177176

178177
try
@@ -204,8 +203,6 @@ Return<V1_0::ErrorStatus> ArmnnDriverImpl<HalPolicy>::prepareModel(
204203
model,
205204
options.GetRequestInputsAndOutputsDumpDir(),
206205
options.IsGpuProfilingEnabled(),
207-
options.isAsyncModelExecutionEnabled(),
208-
options.getNoOfArmnnThreads(),
209206
options.isImportEnabled(),
210207
options.isExportEnabled()));
211208

ArmnnPreparedModel.cpp

Lines changed: 22 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,6 @@ template<typename HalVersion>
9191
RequestThread<ArmnnPreparedModel, HalVersion, CallbackContext_1_0>
9292
ArmnnPreparedModel<HalVersion>::m_RequestThread;
9393

94-
template<typename HalVersion>
95-
std::unique_ptr<armnn::Threadpool> ArmnnPreparedModel<HalVersion>::m_Threadpool(nullptr);
96-
9794
template<typename HalVersion>
9895
template <typename TensorBindingCollection>
9996
void ArmnnPreparedModel<HalVersion>::DumpTensorsIfRequired(char const* tensorNamePrefix,
@@ -118,8 +115,6 @@ ArmnnPreparedModel<HalVersion>::ArmnnPreparedModel(armnn::NetworkId networkId,
118115
const HalModel& model,
119116
const std::string& requestInputsAndOutputsDumpDir,
120117
const bool gpuProfilingEnabled,
121-
const bool asyncModelExecutionEnabled,
122-
const unsigned int numberOfThreads,
123118
const bool importEnabled,
124119
const bool exportEnabled)
125120
: m_NetworkId(networkId)
@@ -128,32 +123,11 @@ ArmnnPreparedModel<HalVersion>::ArmnnPreparedModel(armnn::NetworkId networkId,
128123
, m_RequestCount(0)
129124
, m_RequestInputsAndOutputsDumpDir(requestInputsAndOutputsDumpDir)
130125
, m_GpuProfilingEnabled(gpuProfilingEnabled)
131-
, m_AsyncModelExecutionEnabled(asyncModelExecutionEnabled)
132126
, m_EnableImport(importEnabled)
133127
, m_EnableExport(exportEnabled)
134128
{
135129
// Enable profiling if required.
136130
m_Runtime->GetProfiler(m_NetworkId)->EnableProfiling(m_GpuProfilingEnabled);
137-
138-
if (m_AsyncModelExecutionEnabled)
139-
{
140-
std::vector<std::shared_ptr<armnn::IWorkingMemHandle>> memHandles;
141-
for (unsigned int i=0; i < numberOfThreads; ++i)
142-
{
143-
memHandles.emplace_back(m_Runtime->CreateWorkingMemHandle(networkId));
144-
}
145-
146-
if (!m_Threadpool)
147-
{
148-
m_Threadpool = std::make_unique<armnn::Threadpool>(numberOfThreads, runtime, memHandles);
149-
}
150-
else
151-
{
152-
m_Threadpool->LoadMemHandles(memHandles);
153-
}
154-
155-
m_WorkingMemHandle = memHandles.back();
156-
}
157131
}
158132

159133
template<typename HalVersion>
@@ -170,12 +144,6 @@ ArmnnPreparedModel<HalVersion>::~ArmnnPreparedModel()
170144

171145
// Unload the network associated with this model.
172146
m_Runtime->UnloadNetwork(m_NetworkId);
173-
174-
// Unload the network memhandles from the threadpool
175-
if (m_AsyncModelExecutionEnabled)
176-
{
177-
m_Threadpool->UnloadMemHandles(m_NetworkId);
178-
}
179147
}
180148

181149
template<typename HalVersion>
@@ -295,14 +263,6 @@ Return<V1_0::ErrorStatus> ArmnnPreparedModel<HalVersion>::execute(
295263
CallbackContext_1_0 armnnCb;
296264
armnnCb.callback = cb;
297265

298-
if (m_AsyncModelExecutionEnabled)
299-
{
300-
ALOGV("ArmnnPreparedModel::execute(...) before ScheduleGraphForExecution");
301-
ScheduleGraphForExecution(pMemPools, pInputTensors, pOutputTensors, armnnCb);
302-
ALOGV("ArmnnPreparedModel::execute(...) after ScheduleGraphForExecution");
303-
return V1_0::ErrorStatus::NONE;
304-
}
305-
306266
// post the request for asynchronous execution
307267
ALOGV("ArmnnPreparedModel::execute(...) before PostMsg");
308268
m_RequestThread.PostMsg(this, pMemPools, pInputTensors, pOutputTensors, armnnCb);
@@ -327,30 +287,21 @@ void ArmnnPreparedModel<HalVersion>::ExecuteGraph(
327287
try
328288
{
329289
armnn::Status status;
330-
if (m_AsyncModelExecutionEnabled)
290+
291+
// Create a vector of Input and Output Ids which can be imported. An empty vector means all will be copied.
292+
std::vector<armnn::ImportedInputId> importedInputIds;
293+
if (m_EnableImport)
331294
{
332-
ARMNN_NO_DEPRECATE_WARN_BEGIN
333-
ALOGW("ArmnnPreparedModel::ExecuteGraph m_AsyncModelExecutionEnabled true");
334-
status = m_Runtime->Execute(*m_WorkingMemHandle, inputTensors, outputTensors);
335-
ARMNN_NO_DEPRECATE_WARN_END
295+
importedInputIds = m_Runtime->ImportInputs(m_NetworkId, inputTensors, armnn::MemorySource::Malloc);
336296
}
337-
else
297+
std::vector<armnn::ImportedOutputId> importedOutputIds;
298+
if (m_EnableExport)
338299
{
339-
ALOGW("ArmnnPreparedModel::ExecuteGraph m_AsyncModelExecutionEnabled false");
340-
// Create a vector of Input and Output Ids which can be imported. An empty vector means all will be copied.
341-
std::vector<armnn::ImportedInputId> importedInputIds;
342-
if (m_EnableImport)
343-
{
344-
importedInputIds = m_Runtime->ImportInputs(m_NetworkId, inputTensors, armnn::MemorySource::Malloc);
345-
}
346-
std::vector<armnn::ImportedOutputId> importedOutputIds;
347-
if (m_EnableExport)
348-
{
349-
importedOutputIds = m_Runtime->ImportOutputs(m_NetworkId, outputTensors, armnn::MemorySource::Malloc);
350-
}
351-
status = m_Runtime->EnqueueWorkload(m_NetworkId, inputTensors, outputTensors,
352-
importedInputIds, importedOutputIds);
300+
importedOutputIds = m_Runtime->ImportOutputs(m_NetworkId, outputTensors, armnn::MemorySource::Malloc);
353301
}
302+
status = m_Runtime->EnqueueWorkload(m_NetworkId, inputTensors, outputTensors,
303+
importedInputIds, importedOutputIds);
304+
354305
if (status != armnn::Status::Success)
355306
{
356307
ALOGW("EnqueueWorkload failed");
@@ -427,30 +378,21 @@ bool ArmnnPreparedModel<HalVersion>::ExecuteWithDummyInputs()
427378
try
428379
{
429380
armnn::Status status;
430-
if (m_AsyncModelExecutionEnabled)
381+
382+
// Create a vector of Input and Output Ids which can be imported. An empty vector means all will be copied.
383+
std::vector<armnn::ImportedInputId> importedInputIds;
384+
if (m_EnableImport)
431385
{
432-
ARMNN_NO_DEPRECATE_WARN_BEGIN
433-
ALOGW("ArmnnPreparedModel::ExecuteGraph m_AsyncModelExecutionEnabled true");
434-
status = m_Runtime->Execute(*m_WorkingMemHandle, inputTensors, outputTensors);
435-
ARMNN_NO_DEPRECATE_WARN_END
386+
importedInputIds = m_Runtime->ImportInputs(m_NetworkId, inputTensors, armnn::MemorySource::Malloc);
436387
}
437-
else
388+
std::vector<armnn::ImportedOutputId> importedOutputIds;
389+
if (m_EnableExport)
438390
{
439-
ALOGW("ArmnnPreparedModel::ExecuteGraph m_AsyncModelExecutionEnabled false");
440-
// Create a vector of Input and Output Ids which can be imported. An empty vector means all will be copied.
441-
std::vector<armnn::ImportedInputId> importedInputIds;
442-
if (m_EnableImport)
443-
{
444-
importedInputIds = m_Runtime->ImportInputs(m_NetworkId, inputTensors, armnn::MemorySource::Malloc);
445-
}
446-
std::vector<armnn::ImportedOutputId> importedOutputIds;
447-
if (m_EnableExport)
448-
{
449-
importedOutputIds = m_Runtime->ImportOutputs(m_NetworkId, outputTensors, armnn::MemorySource::Malloc);
450-
}
451-
status = m_Runtime->EnqueueWorkload(m_NetworkId, inputTensors, outputTensors,
452-
importedInputIds, importedOutputIds);
391+
importedOutputIds = m_Runtime->ImportOutputs(m_NetworkId, outputTensors, armnn::MemorySource::Malloc);
453392
}
393+
status = m_Runtime->EnqueueWorkload(m_NetworkId, inputTensors, outputTensors,
394+
importedInputIds, importedOutputIds);
395+
454396
if (status != armnn::Status::Success)
455397
{
456398
ALOGW("ExecuteWithDummyInputs: EnqueueWorkload failed");
@@ -470,73 +412,11 @@ ARMNN_NO_DEPRECATE_WARN_END
470412
return true;
471413
}
472414

473-
/// Schedule the graph prepared from the request for execution
474-
template<typename HalVersion>
475-
template<typename CallbackContext>
476-
void ArmnnPreparedModel<HalVersion>::ScheduleGraphForExecution(
477-
std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
478-
std::shared_ptr<armnn::InputTensors>& inputTensors,
479-
std::shared_ptr<armnn::OutputTensors>& outputTensors,
480-
CallbackContext callbackContext)
481-
{
482-
ALOGV("ArmnnPreparedModel::ScheduleGraphForExecution(...)");
483-
484-
DumpTensorsIfRequired("Input", *inputTensors);
485-
486-
487-
auto tpCb = std::make_shared<
488-
ArmnnThreadPoolCallback<CallbackContext_1_0>>(this,
489-
pMemPools,
490-
inputTensors,
491-
outputTensors,
492-
callbackContext);
493-
494-
m_Threadpool->Schedule(m_NetworkId,
495-
*tpCb->m_InputTensors,
496-
*tpCb->m_OutputTensors,
497-
armnn::QosExecPriority::Medium,
498-
tpCb);
499-
ALOGV("ArmnnPreparedModel::ScheduleGraphForExecution end");
500-
}
501-
502-
template<typename HalVersion>
503-
template <typename CallbackContext>
504-
void ArmnnPreparedModel<HalVersion>::ArmnnThreadPoolCallback<CallbackContext>::Notify(
505-
armnn::Status status, armnn::InferenceTimingPair timeTaken)
506-
{
507-
armnn::IgnoreUnused(status, timeTaken);
508-
ALOGV("ArmnnPreparedModel::ArmnnThreadPoolCallback_1_2 Notify");
509-
510-
m_Model->DumpTensorsIfRequired("Output", *m_OutputTensors);
511-
512-
// Commit output buffers.
513-
// Note that we update *all* pools, even if they aren't actually used as outputs -
514-
// this is simpler and is what the CpuExecutor does.
515-
for (android::nn::RunTimePoolInfo& pool : *m_MemPools)
516-
{
517-
// Type android::nn::RunTimePoolInfo has changed between Android P & Q and Android R, where
518-
// update() has been removed and flush() added.
519-
#if defined(ARMNN_ANDROID_R) || defined(ARMNN_ANDROID_S) // Use the new Android implementation.
520-
pool.flush();
521-
#else
522-
pool.update();
523-
#endif
524-
}
525-
526-
m_CallbackContext.callback(V1_0::ErrorStatus::NONE, "ArmnnPreparedModel::ArmnnThreadPoolCallback_1_2 Notify");
527-
return;
528-
}
529-
530415
///
531416
/// Class template specializations
532417
///
533418

534419
template class ArmnnPreparedModel<hal_1_0::HalPolicy>;
535-
template void ArmnnPreparedModel<hal_1_0::HalPolicy>::ScheduleGraphForExecution<CallbackContext_1_0>(
536-
std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
537-
std::shared_ptr<armnn::InputTensors>& inputTensors,
538-
std::shared_ptr<armnn::OutputTensors>& outputTensors,
539-
CallbackContext_1_0 callbackContext);
540420

541421
#ifdef ARMNN_ANDROID_NN_V1_1
542422
template class ArmnnPreparedModel<hal_1_1::HalPolicy>;

0 commit comments

Comments
 (0)