aboutsummaryrefslogtreecommitdiff
path: root/tests/cancel_inference_test.cpp
diff options
context:
space:
mode:
authorDavide Grohmann <davide.grohmann@arm.com>2022-08-24 17:01:40 +0200
committerDavide Grohmann <davide.grohmann@arm.com>2022-09-08 09:41:00 +0200
commit6d2e5b7b85573a2b22a4a165400574cff99d4065 (patch)
tree9f1b0287f9f31a7a75f86a78d8bf1506599eb9bb /tests/cancel_inference_test.cpp
parentf03642331f1028bdeba1c24bc5d9bd65b42c7603 (diff)
downloadethos-u-linux-driver-stack-6d2e5b7b85573a2b22a4a165400574cff99d4065.tar.gz
Add cancel inference tests
These tests are run with a special custom firmware Change-Id: I0dfcae1fbaa1287d4b52fd8f6c802bebb5248d3b
Diffstat (limited to 'tests/cancel_inference_test.cpp')
-rw-r--r--tests/cancel_inference_test.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/tests/cancel_inference_test.cpp b/tests/cancel_inference_test.cpp
new file mode 100644
index 0000000..36514f4
--- /dev/null
+++ b/tests/cancel_inference_test.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2022 Arm Limited.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ethosu.hpp>
+#include <uapi/ethosu.h>
+
+#include <cstring>
+#include <iostream>
+#include <list>
+#include <memory>
+#include <sstream>
+#include <stdio.h>
+#include <string>
+#include <unistd.h>
+
+#include "input.h"
+#include "model.h"
+#include "output.h"
+#include "test_assertions.hpp"
+
+using namespace EthosU;
+
+namespace {
+
+int64_t defaultTimeout = 60000000000;
+
+void testCancelInference(const Device &device) {
+ try {
+ auto networkBuffer = std::make_shared<Buffer>(device, sizeof(networkModelData));
+ networkBuffer->resize(sizeof(networkModelData));
+ std::memcpy(networkBuffer->data(), networkModelData, sizeof(networkModelData));
+ auto network = std::make_shared<Network>(device, networkBuffer);
+
+ std::vector<std::shared_ptr<Buffer>> inputBuffers;
+ std::vector<std::shared_ptr<Buffer>> outputBuffers;
+
+ auto inputBuffer = std::make_shared<Buffer>(device, sizeof(inputData));
+ inputBuffer->resize(sizeof(inputData));
+ std::memcpy(inputBuffer->data(), inputData, sizeof(inputData));
+
+ inputBuffers.push_back(inputBuffer);
+ outputBuffers.push_back(std::make_shared<Buffer>(device, sizeof(expectedOutputData)));
+ std::vector<uint8_t> enabledCounters(Inference::getMaxPmuEventCounters());
+
+ auto inference = std::make_shared<Inference>(network,
+ inputBuffers.begin(),
+ inputBuffers.end(),
+ outputBuffers.begin(),
+ outputBuffers.end(),
+ enabledCounters,
+ false);
+
+ InferenceStatus status = inference->status();
+ TEST_ASSERT(status == InferenceStatus::RUNNING);
+
+ bool success = inference->cancel();
+ TEST_ASSERT(success);
+
+ status = inference->status();
+ TEST_ASSERT(status == InferenceStatus::ABORTED);
+
+ bool timedout = inference->wait(defaultTimeout);
+ TEST_ASSERT(!timedout);
+
+ } catch (std::exception &e) { throw TestFailureException("Inference run test: ", e.what()); }
+}
+
+void testRejectInference(const Device &device) {
+ try {
+ auto networkBuffer = std::make_shared<Buffer>(device, sizeof(networkModelData));
+ networkBuffer->resize(sizeof(networkModelData));
+ std::memcpy(networkBuffer->data(), networkModelData, sizeof(networkModelData));
+ auto network = std::make_shared<Network>(device, networkBuffer);
+
+ std::vector<std::shared_ptr<Buffer>> inputBuffers;
+ std::vector<std::shared_ptr<Buffer>> outputBuffers;
+
+ auto inputBuffer = std::make_shared<Buffer>(device, sizeof(inputData));
+ inputBuffer->resize(sizeof(inputData));
+ std::memcpy(inputBuffer->data(), inputData, sizeof(inputData));
+
+ inputBuffers.push_back(inputBuffer);
+ outputBuffers.push_back(std::make_shared<Buffer>(device, sizeof(expectedOutputData)));
+ std::vector<uint8_t> enabledCounters(Inference::getMaxPmuEventCounters());
+
+ std::shared_ptr<Inference> inferences[5];
+
+ for (int i = 0; i < 5; i++) {
+ inferences[i] = std::make_shared<Inference>(network,
+ inputBuffers.begin(),
+ inputBuffers.end(),
+ outputBuffers.begin(),
+ outputBuffers.end(),
+ enabledCounters,
+ false);
+
+ InferenceStatus status = inferences[i]->status();
+ TEST_ASSERT(status == InferenceStatus::RUNNING);
+ }
+
+ auto inference = std::make_shared<Inference>(network,
+ inputBuffers.begin(),
+ inputBuffers.end(),
+ outputBuffers.begin(),
+ outputBuffers.end(),
+ enabledCounters,
+ false);
+
+ bool timedout = inference->wait(defaultTimeout);
+ TEST_ASSERT(!timedout);
+
+ InferenceStatus status = inference->status();
+ TEST_ASSERT(status == InferenceStatus::REJECTED);
+
+ for (int i = 0; i < 5; i++) {
+
+ bool success = inferences[i]->cancel();
+ TEST_ASSERT(success);
+
+ InferenceStatus status = inferences[i]->status();
+ TEST_ASSERT(status == InferenceStatus::ABORTED);
+
+ bool timedout = inference->wait(defaultTimeout);
+ TEST_ASSERT(!timedout);
+ }
+ } catch (std::exception &e) { throw TestFailureException("Inference run test: ", e.what()); }
+}
+
+} // namespace
+
+int main() {
+ Device device;
+
+ try {
+ testCancelInference(device);
+ testRejectInference(device);
+ } catch (TestFailureException &e) {
+ std::cerr << "Test failure: " << e.what() << std::endl;
+ return 1;
+ }
+
+ return 0;
+}