aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp')
-rw-r--r--src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp160
1 files changed, 159 insertions, 1 deletions
diff --git a/src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp b/src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp
index 66ccdbf1d9..16b10c88ac 100644
--- a/src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp
+++ b/src/backends/backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp
@@ -24,6 +24,100 @@ namespace experimental
template<DataType ArmnnIType, DataType ArmnnOType,
typename TInput = ResolveType <ArmnnIType>, typename TOutput = ResolveType <ArmnnOType>>
+void AsyncThreadedEndToEndTestImpl(INetworkPtr network,
+ const std::vector<std::map<int, std::vector<TInput>>>& inputTensorData,
+ const std::vector<std::map<int, std::vector<TOutput>>>& expectedOutputData,
+ std::vector<BackendId> backends,
+ const size_t numberOfInferences,
+ float tolerance = 0.000001f)
+{
+ // Create Runtime in which test will run
+ IRuntime::CreationOptions options;
+ IRuntimePtr runtime(IRuntime::Create(options));
+
+ // Optimize the Network
+ IOptimizedNetworkPtr optNet = Optimize(*network, backends, runtime->GetDeviceSpec());
+
+
+ // Creates AsyncNetwork
+ NetworkId networkId = 0;
+ std::string errorMessage;
+ const INetworkProperties networkProperties(false, false, true);
+ runtime->LoadNetwork(networkId, std::move(optNet), errorMessage, networkProperties);
+
+ std::vector<InputTensors> inputTensorsVec;
+ std::vector<OutputTensors> outputTensorsVec;
+ std::vector<std::map<int, std::vector<TOutput>>> outputStorageVec;
+ std::vector<std::unique_ptr<IWorkingMemHandle>> workingMemHandles;
+
+ for (unsigned int i = 0; i < numberOfInferences; ++i)
+ {
+ InputTensors inputTensors;
+ OutputTensors outputTensors;
+ outputStorageVec.emplace_back(std::map<int, std::vector<TOutput>>());
+
+ inputTensors.reserve(inputTensorData.size());
+ for (auto&& it : inputTensorData[i])
+ {
+ inputTensors.push_back({it.first,
+ ConstTensor(runtime->GetInputTensorInfo(networkId, it.first), it.second.data())});
+ }
+
+ outputTensors.reserve(expectedOutputData.size());
+ for (auto&& it : expectedOutputData[i])
+ {
+ std::vector<TOutput> out(it.second.size());
+ outputStorageVec[i].emplace(it.first, out);
+ outputTensors.push_back({it.first,
+ Tensor(runtime->GetOutputTensorInfo(networkId, it.first),
+ outputStorageVec[i].at(it.first).data())});
+ }
+
+ inputTensorsVec.push_back(inputTensors);
+ outputTensorsVec.push_back(outputTensors);
+
+ workingMemHandles.push_back(runtime->CreateWorkingMemHandle(networkId));
+ }
+
+ std::vector<std::thread> threads;
+ for (unsigned int i = 0; i < numberOfInferences; ++i)
+ {
+ // Access the vectors before we do anything multi-threaded
+ InputTensors& inputTensors = inputTensorsVec[i];
+ OutputTensors& outputTensors = outputTensorsVec[i];
+ IWorkingMemHandle& workingMemHandle = *workingMemHandles[i].get();
+
+ threads.emplace_back([&]()
+ {
+ // Run the async network
+ runtime->Execute(workingMemHandle, inputTensors, outputTensors);
+ });
+ }
+
+ for (unsigned int i = 0; i < numberOfInferences; ++i)
+ {
+ threads[i].join();
+ }
+
+ // Checks the results.
+ for (unsigned int i = 0; i < numberOfInferences; ++i)
+ {
+ for (auto &&it : expectedOutputData[i])
+ {
+ std::vector<TOutput> out = outputStorageVec[i].at(it.first);
+ for (unsigned int j = 0; j < out.size(); ++j)
+ {
+ BOOST_CHECK(Compare<ArmnnOType>(it.second[j], out[j], tolerance) == true);
+ }
+ }
+ }
+
+}
+
+
+
+template<DataType ArmnnIType, DataType ArmnnOType,
+ typename TInput = ResolveType <ArmnnIType>, typename TOutput = ResolveType <ArmnnOType>>
void AsyncEndToEndTestImpl(INetworkPtr network,
const std::map<int, std::vector<TInput>>& inputTensorData,
const std::map<int, std::vector<TOutput>>& expectedOutputData,
@@ -169,7 +263,71 @@ void StridedSlicedEndToEndTest(const std::vector<BackendId>& backends)
std::map<int, std::vector<T>> inputTensorData = {{0, inputData}};
std::map<int, std::vector<T>> expectedOutputData = {{0, outputExpected}};
- AsyncEndToEndTestImpl<ArmnnType, ArmnnType>(move(net), inputTensorData, expectedOutputData, backends);
+ AsyncEndToEndTestImpl<ArmnnType, ArmnnType>(move(net), inputTensorData, expectedOutputData, backends, 1);
+}
+
+template<armnn::DataType ArmnnType>
+void StridedSlicedMultiThreadedEndToEndTest(const std::vector<BackendId>& backends)
+{
+ using namespace armnn;
+ using T = ResolveType<ArmnnType>;
+
+ const TensorShape& inputShape = {3, 2, 3, 1};
+ const TensorShape& outputShape = {1, 2, 3, 1};
+ const std::vector<int>& beginData = {1, 0, 0, 0};
+ const std::vector<int>& endData = {2, 2, 3, 1};
+ const std::vector<int>& stridesData = {1, 1, 1, 1};
+ int beginMask = 0;
+ int endMask = 0;
+ int shrinkAxisMask = 0;
+ int ellipsisMask = 0;
+ int newAxisMask = 0;
+
+ // Builds up the structure of the network
+ INetworkPtr net = CreateStridedSliceNetwork<ArmnnType>(inputShape,
+ outputShape,
+ beginData,
+ endData,
+ stridesData,
+ beginMask,
+ endMask,
+ shrinkAxisMask,
+ ellipsisMask,
+ newAxisMask);
+
+ BOOST_TEST_CHECKPOINT("create a network");
+
+ // Creates structures for input & output.
+ std::vector<T> inputData1{
+ 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+
+ 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
+
+ 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
+ };
+
+ std::vector<T> outputExpected1{ 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f };
+
+ // Creates structures for input & output.
+ std::vector<T> inputData2{
+ 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+
+ 8.0f, 8.0f, 8.0f, 7.0f, 7.0f, 7.0f,
+
+ 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
+ };
+
+ std::vector<T> outputExpected2{ 8.0f, 8.0f, 8.0f, 7.0f, 7.0f, 7.0f };
+
+ std::vector<std::map<int, std::vector<T>>> inputTensors;
+ std::vector<std::map<int, std::vector<T>>> outputTensors;
+
+ inputTensors.push_back(std::map<int, std::vector<T>> {{0, inputData1}});
+ inputTensors.push_back(std::map<int, std::vector<T>> {{0, inputData2}});
+ outputTensors.push_back(std::map<int, std::vector<T>> {{0, outputExpected1}});
+ outputTensors.push_back(std::map<int, std::vector<T>> {{0, outputExpected2}});
+
+ AsyncThreadedEndToEndTestImpl<ArmnnType, ArmnnType>(move(net), inputTensors, outputTensors, backends, 2);
}
} // experimental namespace