[sw] Reduce the number of runs in memory_perftest
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/lib/base/memory_perftest.c b/sw/device/lib/base/memory_perftest.c
index 65ea1cb..2004393 100644
--- a/sw/device/lib/base/memory_perftest.c
+++ b/sw/device/lib/base/memory_perftest.c
@@ -13,7 +13,10 @@
#include "sw/device/lib/testing/test_framework/check.h"
#include "sw/device/lib/testing/test_framework/ottf_main.h"
-#define PERFTEST_BUF_LEN 1000
+enum {
+ kBufLen = 1000,
+ kNumRuns = 10,
+};
typedef struct perf_test {
// A human-readable name for this particular test, e.g. "memcpy".
@@ -27,7 +30,7 @@
// A function that exercises the function under test, e.g. memcpy. This
// function pointer must not be NULL. The runtime of this function will be
// measured.
- void (*func)(uint8_t *buf1, uint8_t *buf2, size_t len);
+ void (*func)(uint8_t *buf1, uint8_t *buf2, size_t num_runs);
// The expected number of CPU cycles that `func` will take to run.
size_t expected_num_cycles;
@@ -35,19 +38,18 @@
// Run the given `perf_test_t` and return the number of cycles it took.
static inline uint64_t perf_test_run(const perf_test_t *test, uint8_t *buf1,
- uint8_t *buf2, size_t len) {
+ uint8_t *buf2, size_t num_runs) {
CHECK(test->setup_buf1 != NULL);
CHECK(test->setup_buf2 != NULL);
CHECK(test->func != NULL);
uint64_t total_clock_cycles = 0;
- for (size_t i = 0; i <= len; ++i) {
- // Set up each buffer from [0..i].
- test->setup_buf1(buf1, i);
- test->setup_buf2(buf2, i);
+ for (size_t i = 0; i < num_runs; ++i) {
+ test->setup_buf1(buf1, kBufLen);
+ test->setup_buf2(buf2, kBufLen);
uint64_t start_cycles = ibex_mcycle_read();
- test->func(buf1, buf2, i);
+ test->func(buf1, buf2, kBufLen);
uint64_t end_cycles = ibex_mcycle_read();
// Even if the 64-bit cycle counter overflowed while running the test, the
@@ -141,68 +143,87 @@
// If you observe the cycle count is smaller the hardcoded expectation, that's
// probably a good thing; please update the expectation!
static const perf_test_t kPerfTests[] = {
- {.label = "memcpy",
- .setup_buf1 = &fill_buf_deterministic_values,
- .setup_buf2 = &fill_buf_deterministic_values,
- .func = &test_memcpy,
- .expected_num_cycles = 10538542},
- {.label = "memcpy_zeroes",
- .setup_buf1 = &fill_buf_deterministic_values,
- .setup_buf2 = &fill_buf_zeroes,
- .func = &test_memcpy,
- .expected_num_cycles = 10538542},
- {.label = "memset",
- .setup_buf1 = &fill_buf_zeroes,
- .setup_buf2 = &fill_buf_deterministic_values,
- .func = &test_memset,
- .expected_num_cycles = 6537542},
- {.label = "memset_zeroes",
- .setup_buf1 = &fill_buf_zeroes,
- .setup_buf2 = &fill_buf_zeroes,
- .func = &test_memset,
- .expected_num_cycles = 6537542},
- {.label = "memcmp_pathological",
- .setup_buf1 = &fill_buf_zeroes_then_one,
- .setup_buf2 = &fill_buf_zeroes,
- .func = &test_memcmp,
- .expected_num_cycles = 10541545},
- {.label = "memcmp_zeroes",
- .setup_buf1 = &fill_buf_zeroes,
- .setup_buf2 = &fill_buf_zeroes,
- .func = &test_memcmp,
- .expected_num_cycles = 10538545},
- {.label = "memrcmp_pathological",
- .setup_buf1 = &fill_buf_zeroes,
- .setup_buf2 = &fill_buf_one_then_zeroes,
- .func = &test_memrcmp,
- .expected_num_cycles = 10043043},
- {.label = "memrcmp_zeroes",
- .setup_buf1 = &fill_buf_zeroes,
- .setup_buf2 = &fill_buf_zeroes,
- .func = &test_memrcmp,
- .expected_num_cycles = 10040043},
- {.label = "memchr_pathological",
- .setup_buf1 = &fill_buf_deterministic_values,
- .setup_buf2 = &fill_buf_zeroes,
- .func = &test_memchr,
- .expected_num_cycles = 2399078},
- {.label = "memrchr_pathological",
- .setup_buf1 = &fill_buf_deterministic_values,
- .setup_buf2 = &fill_buf_deterministic_values,
- .func = &test_memrchr,
- .expected_num_cycles = 2158742},
+ {
+ .label = "memcpy",
+ .setup_buf1 = &fill_buf_deterministic_values,
+ .setup_buf2 = &fill_buf_deterministic_values,
+ .func = &test_memcpy,
+ .expected_num_cycles = 190290,
+ },
+ {
+ .label = "memcpy_zeroes",
+ .setup_buf1 = &fill_buf_deterministic_values,
+ .setup_buf2 = &fill_buf_zeroes,
+ .func = &test_memcpy,
+ .expected_num_cycles = 190290,
+ },
+ {
+ .label = "memset",
+ .setup_buf1 = &fill_buf_zeroes,
+ .setup_buf2 = &fill_buf_deterministic_values,
+ .func = &test_memset,
+ .expected_num_cycles = 140310,
+ },
+ {
+ .label = "memset_zeroes",
+ .setup_buf1 = &fill_buf_zeroes,
+ .setup_buf2 = &fill_buf_zeroes,
+ .func = &test_memset,
+ .expected_num_cycles = 140310,
+ },
+ {
+ .label = "memcmp_pathological",
+ .setup_buf1 = &fill_buf_zeroes_then_one,
+ .setup_buf2 = &fill_buf_zeroes,
+ .func = &test_memcmp,
+ .expected_num_cycles = 190340,
+ },
+ {
+ .label = "memcmp_zeroes",
+ .setup_buf1 = &fill_buf_zeroes,
+ .setup_buf2 = &fill_buf_zeroes,
+ .func = &test_memcmp,
+ .expected_num_cycles = 190320,
+ },
+ {
+ .label = "memrcmp_pathological",
+ .setup_buf1 = &fill_buf_zeroes,
+ .setup_buf2 = &fill_buf_one_then_zeroes,
+ .func = &test_memrcmp,
+ .expected_num_cycles = 220320,
+ },
+ {
+ .label = "memrcmp_zeroes",
+ .setup_buf1 = &fill_buf_zeroes,
+ .setup_buf2 = &fill_buf_zeroes,
+ .func = &test_memrcmp,
+ .expected_num_cycles = 220280,
+ },
+ {
+ .label = "memchr_pathological",
+ .setup_buf1 = &fill_buf_deterministic_values,
+ .setup_buf2 = &fill_buf_zeroes,
+ .func = &test_memchr,
+ .expected_num_cycles = 11940,
+ },
+ {
+ .label = "memrchr_pathological",
+ .setup_buf1 = &fill_buf_deterministic_values,
+ .setup_buf2 = &fill_buf_deterministic_values,
+ .func = &test_memrchr,
+ .expected_num_cycles = 44940,
+ },
};
-static uint8_t buf1[PERFTEST_BUF_LEN];
-static uint8_t buf2[PERFTEST_BUF_LEN];
+static uint8_t buf1[kBufLen];
+static uint8_t buf2[kBufLen];
bool test_main(void) {
bool all_expectations_match = true;
for (size_t i = 0; i < ARRAYSIZE(kPerfTests); ++i) {
const perf_test_t *test = &kPerfTests[i];
- const uint64_t num_cycles =
- perf_test_run(test, buf1, buf2, PERFTEST_BUF_LEN);
+ const uint64_t num_cycles = perf_test_run(test, buf1, buf2, kNumRuns);
if (num_cycles != test->expected_num_cycles) {
all_expectations_match = false;
// Cast cycle counts to `uint32_t` before printing because `base_printf()`