[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()`