bench_runner.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * Runner for littlefs benchmarks
  3. *
  4. * Copyright (c) 2022, The littlefs authors.
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. #ifndef BENCH_RUNNER_H
  8. #define BENCH_RUNNER_H
  9. // override LFS_TRACE
  10. void bench_trace(const char *fmt, ...);
  11. #define LFS_TRACE_(fmt, ...) \
  12. bench_trace("%s:%d:trace: " fmt "%s\n", \
  13. __FILE__, \
  14. __LINE__, \
  15. __VA_ARGS__)
  16. #define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "")
  17. #define LFS_EMUBD_TRACE(...) LFS_TRACE_(__VA_ARGS__, "")
  18. // provide BENCH_START/BENCH_STOP macros
  19. void bench_start(void);
  20. void bench_stop(void);
  21. #define BENCH_START() bench_start()
  22. #define BENCH_STOP() bench_stop()
  23. // note these are indirectly included in any generated files
  24. #include "bd/lfs_emubd.h"
  25. #include <stdio.h>
  26. // give source a chance to define feature macros
  27. #undef _FEATURES_H
  28. #undef _STDIO_H
  29. // generated bench configurations
  30. struct lfs_config;
  31. enum bench_flags {
  32. BENCH_REENTRANT = 0x1,
  33. };
  34. typedef uint8_t bench_flags_t;
  35. typedef struct bench_define {
  36. intmax_t (*cb)(void *data);
  37. void *data;
  38. } bench_define_t;
  39. struct bench_case {
  40. const char *name;
  41. const char *path;
  42. bench_flags_t flags;
  43. size_t permutations;
  44. const bench_define_t *defines;
  45. bool (*filter)(void);
  46. void (*run)(struct lfs_config *cfg);
  47. };
  48. struct bench_suite {
  49. const char *name;
  50. const char *path;
  51. bench_flags_t flags;
  52. const char *const *define_names;
  53. size_t define_count;
  54. const struct bench_case *cases;
  55. size_t case_count;
  56. };
  57. // deterministic prng for pseudo-randomness in benches
  58. uint32_t bench_prng(uint32_t *state);
  59. #define BENCH_PRNG(state) bench_prng(state)
  60. // access generated bench defines
  61. intmax_t bench_define(size_t define);
  62. #define BENCH_DEFINE(i) bench_define(i)
  63. // a few preconfigured defines that control how benches run
  64. #define READ_SIZE_i 0
  65. #define PROG_SIZE_i 1
  66. #define BLOCK_SIZE_i 2
  67. #define BLOCK_COUNT_i 3
  68. #define CACHE_SIZE_i 4
  69. #define LOOKAHEAD_SIZE_i 5
  70. #define BLOCK_CYCLES_i 6
  71. #define ERASE_VALUE_i 7
  72. #define ERASE_CYCLES_i 8
  73. #define BADBLOCK_BEHAVIOR_i 9
  74. #define POWERLOSS_BEHAVIOR_i 10
  75. #define READ_SIZE bench_define(READ_SIZE_i)
  76. #define PROG_SIZE bench_define(PROG_SIZE_i)
  77. #define BLOCK_SIZE bench_define(BLOCK_SIZE_i)
  78. #define BLOCK_COUNT bench_define(BLOCK_COUNT_i)
  79. #define CACHE_SIZE bench_define(CACHE_SIZE_i)
  80. #define LOOKAHEAD_SIZE bench_define(LOOKAHEAD_SIZE_i)
  81. #define BLOCK_CYCLES bench_define(BLOCK_CYCLES_i)
  82. #define ERASE_VALUE bench_define(ERASE_VALUE_i)
  83. #define ERASE_CYCLES bench_define(ERASE_CYCLES_i)
  84. #define BADBLOCK_BEHAVIOR bench_define(BADBLOCK_BEHAVIOR_i)
  85. #define POWERLOSS_BEHAVIOR bench_define(POWERLOSS_BEHAVIOR_i)
  86. #define BENCH_IMPLICIT_DEFINES \
  87. BENCH_DEF(READ_SIZE, PROG_SIZE) \
  88. BENCH_DEF(PROG_SIZE, BLOCK_SIZE) \
  89. BENCH_DEF(BLOCK_SIZE, 0) \
  90. BENCH_DEF(BLOCK_COUNT, (1024*1024)/BLOCK_SIZE) \
  91. BENCH_DEF(CACHE_SIZE, lfs_max(64,lfs_max(READ_SIZE,PROG_SIZE))) \
  92. BENCH_DEF(LOOKAHEAD_SIZE, 16) \
  93. BENCH_DEF(BLOCK_CYCLES, -1) \
  94. BENCH_DEF(ERASE_VALUE, 0xff) \
  95. BENCH_DEF(ERASE_CYCLES, 0) \
  96. BENCH_DEF(BADBLOCK_BEHAVIOR, LFS_EMUBD_BADBLOCK_PROGERROR) \
  97. BENCH_DEF(POWERLOSS_BEHAVIOR, LFS_EMUBD_POWERLOSS_NOOP)
  98. #define BENCH_GEOMETRY_DEFINE_COUNT 4
  99. #define BENCH_IMPLICIT_DEFINE_COUNT 11
  100. #endif