In my ARMNN network initialization routine I am creating an ARMNN runtime like this:
armnn::IRuntimePtr runtime = armnn::IRuntime::Create(armnn::IRuntime::CreationOptions());
armnn::IOptimizedNetworkPtr optNet = Optimize(*network, backends, runtime->GetDeviceSpec(), armnn::OptimizerOptions());
runtime->LoadNetwork(networkId, std::move(optNet), errorMessage);
I need to run the network in another C++ function. How can I pass the runtime pointer to that other function? Or, is there a way for the other function to retrieve the pointer to the runtime?
The ArmNN team are very responsive to issues on their github: https://github.com/ARM-software/armnn/issues so questions for ArmNN are usually best there as first port of call for fastest response from those who know it best.
On the github site is also the documentation for ArmNN: https://github.com/ARM-software/armnn/wiki/Documentation where you can get more on all the classes for the different releases. Presuming you're looking at latest, 21.05, I looked up IRuntime and IRuntimePtr is just a std::unique_ptr of IRuntime, so it'll need to be passed into functions in the same way as unique_ptrs require. Unique pointers being unique, there can only be one of them and they can't be passed by value. The "good" way to do that is with a std::move(ptr) when calling the function (as you've got for optNet there in LoadNetwork()). The "bad" way is to pass it as a reference.
Unless you've already tried that and I'm missing something?
Thanks for your reply.
std::move(runtime) would work if I wanted to call the network execution function directly from the network initialization routine. But what I would like to do is to have the initialization routine *save* the pointer to the runitme, and then having the execution function use that pointer to run the network. I can't use a static variable to save the pointer to the runtime in the initialization routine. And I can't seem to find a way to retrieve the pointer to the already created runtime. That is what I am struggling with...
Any idea how to do it?
I'm a little confused, but it does sound like you're fighting the concept of unique pointers - you definitely can't save them for later.
There is armnn::IRuntime::CreateRaw to give you a Runtime* - would that work for you?
That's exactly what I was looking for. Thank you, Ben, for your very prompt assistance!