aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonny Svärd <jonny.svaerd@arm.com>2022-04-19 15:35:01 +0200
committerJonny Svärd <jonny.svaerd@arm.com>2022-04-21 15:50:16 +0200
commit44b250be84b2e3bbd421fcc25134fe672eda4027 (patch)
tree2c8a19995cc48b85579b366db25e9822f437c4f4
parent65520055f422dac8d3c1a87314d98846a3bce3b5 (diff)
downloadethos-u-core-platform-44b250be84b2e3bbd421fcc25134fe672eda4027.tar.gz
Add simple async API testing to driver_unit_tests
Change-Id: Iae5733efb40a8fd11e7108e93cc719f67b4f1be3
-rw-r--r--applications/driver_unit_tests/command_stream.cpp25
-rw-r--r--applications/driver_unit_tests/command_stream.hpp4
-rw-r--r--applications/driver_unit_tests/conv.cpp81
3 files changed, 98 insertions, 12 deletions
diff --git a/applications/driver_unit_tests/command_stream.cpp b/applications/driver_unit_tests/command_stream.cpp
index 76dba6f..a2cb63e 100644
--- a/applications/driver_unit_tests/command_stream.cpp
+++ b/applications/driver_unit_tests/command_stream.cpp
@@ -133,6 +133,31 @@ int CommandStream::run(size_t repeat) {
return 0;
}
+int CommandStream::run_async() {
+ // Base pointer array
+ uint64_t baseAddress[ETHOSU_BASEP_INDEXES];
+ size_t baseAddressSize[ETHOSU_BASEP_INDEXES];
+
+ for (size_t i = 0; i < ETHOSU_BASEP_INDEXES; i++) {
+ baseAddress[i] = reinterpret_cast<uint64_t>(basePointers[i].data);
+ baseAddressSize[i] = reinterpret_cast<size_t>(basePointers[i].size);
+ }
+
+ int error = ethosu_invoke_async(
+ drv, commandStream.data, commandStream.size, baseAddress, baseAddressSize, ETHOSU_BASEP_INDEXES, nullptr);
+
+ if (error != 0) {
+ printf("Inference invoke async failed. error=%d\n", error);
+ return 1;
+ }
+
+ return 0;
+}
+
+int CommandStream::wait_async(bool block) {
+ return ethosu_wait(drv, block);
+}
+
DataPointer &CommandStream::getCommandStream() {
return commandStream;
}
diff --git a/applications/driver_unit_tests/command_stream.hpp b/applications/driver_unit_tests/command_stream.hpp
index 1783f4c..7163b9d 100644
--- a/applications/driver_unit_tests/command_stream.hpp
+++ b/applications/driver_unit_tests/command_stream.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2021-2022 Arm Limited.
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -92,6 +92,8 @@ public:
virtual ~CommandStream();
int run(size_t repeat = 1);
+ int run_async();
+ int wait_async(bool block = true);
DataPointer &getCommandStream();
BasePointers &getBasePointers();
diff --git a/applications/driver_unit_tests/conv.cpp b/applications/driver_unit_tests/conv.cpp
index aa4a442..63515fa 100644
--- a/applications/driver_unit_tests/conv.cpp
+++ b/applications/driver_unit_tests/conv.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2021-2022 Arm Limited.
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -322,6 +322,9 @@ int main() {
PmuEvents({ETHOSU_PMU_CYCLE, ETHOSU_PMU_NPU_IDLE, ETHOSU_PMU_NPU_ACTIVE}));
const size_t repeat = 100;
+ uint64_t cycleCount = 0;
+ int errors = 0;
+ int res;
// Input data located inside the scratch buffer
DataPointer inputPointer(scratch, sizeof(input0));
@@ -332,22 +335,78 @@ int main() {
// Expected output data
DataPointer expectedPointer(expected0, sizeof(expected0));
+ printf("Running %d iterations using sync API...\n", repeat);
+
// Clear PMU
cs.getPmu().clear();
// Run inference
- int ret = cs.run(repeat);
- uint64_t cycleCount = cs.getPmu().getCycleCount();
+ res = cs.run(repeat);
+ if (res == 0) {
+ cycleCount = cs.getPmu().getCycleCount();
+
+ // Print PMU counters
+ cs.getPmu().print();
+ printf("cycleCount=%llu, cycleCountPerJob=%llu\n", cycleCount, cycleCount / repeat);
+
+ // Compare output with expected data
+ if (outputPointer != expectedPointer) {
+ printf("Output mismatch for sync test\n");
+ res = 1;
+ }
+ }
+ errors = res;
+ printf("\n");
+
+ // Test using the async API
+ printf("Running %d iterations using async API...\n", repeat);
+
+ // Clear PMU
+ cs.getPmu().clear();
+
+ // Dummy wait loop count for inference to complete
+ int wait_loops = 0;
+
+ // Run async job
+ for (size_t r = repeat; r > 0; r--) {
+ res = cs.run_async();
+ if (res != 0) {
+ // Invoke async failed
+ errors++;
+ break;
+ }
+
+ // Wait for inference to complete
+ while ((res = cs.wait_async(false)) == 1) {
+ // CPU is free to do other work while waiting for inference completion
+ wait_loops++;
+ }
+
+ // Check inference result
+ if (res != 0) {
+ printf("Async inference test failed\n");
+ errors++;
+ break;
+ }
+ }
+
+ // Print async results on success
+ if (res == 0) {
+ cycleCount = cs.getPmu().getCycleCount();
+
+ // Print PMU counters
+ cs.getPmu().print();
+ printf("cycleCount=%llu, cycleCountPerJob=%llu\n", cycleCount, cycleCount / repeat);
- // Print PMU counters
- cs.getPmu().print();
- printf("cycleCount=%llu, cycleCountPerJob=%llu\n", cycleCount, cycleCount / repeat);
+ printf("wait_loops=%d\n", wait_loops);
- // Compare outut with expected data
- if (outputPointer != expectedPointer) {
- printf("Output mismatch\n");
- return 1;
+ // Compare output with expected data
+ if (outputPointer != expectedPointer) {
+ printf("Output mismatch for async test\n");
+ errors++;
+ }
}
+ printf("\n");
- return ret;
+ return errors;
}