[FFmpeg-devel] [PATCH 5/6] checkasm: allow run-time fallback to AV_READ_TIME

Rémi Denis-Courmont remi at remlab.net
Wed Jul 19 22:55:39 EEST 2023


On Linux RISC-V, depending on kernel version and configuration, the
cycle counters may be available:
- via Linux perf (as on Arm),
- directly with RDCYCLE (which is considered legacy),
- neither (if admistratively disabled), or
- or both (in legacy compatibility mode).

This allows to try Linux perf, with a fallback to RDCYCLE. Without
this, benchmarking would breakdown in upcoming Linux RISC-V kernel
releases. This also paves the way for falling back from the cycle
counter on Arm or RISC-V, whence they too are disabled.
---
 tests/checkasm/checkasm.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c
index fad660a924..3c8aa8631e 100644
--- a/tests/checkasm/checkasm.c
+++ b/tests/checkasm/checkasm.c
@@ -714,37 +714,43 @@ static int bench_init_linux(void)
     state.close = checkasm_bench_linux_perf_close;
     return 0;
 }
-#elif CONFIG_MACOS_KPERF
+#endif
+#if CONFIG_MACOS_KPERF
 static int bench_init_kperf(void)
 {
     ff_kperf_init();
     state.start = state.stop = ff_kperf_cycles;
     return 0;
 }
-#else
+#endif
+#ifdef AV_READ_TIME
 static int bench_init_ffmpeg(void)
 {
-#ifdef AV_READ_TIME
     printf("benchmarking with native FFmpeg timers\n");
+    state.start = state.stop = AV_READ_TIME;
     return 0;
-#else
-    fprintf(stderr, "checkasm: --bench is not supported on your system\n");
-    return -1;
-#endif
 }
 #endif
 
 static int bench_init(void)
 {
+    int ret = -1;
 #if CONFIG_LINUX_PERF
-    int ret = bench_init_linux();
-#elif CONFIG_MACOS_KPERF
-    int ret = bench_init_kperf();
-#else
-    int ret = bench_init_ffmpeg();
+    if (ret < 0)
+        ret = bench_init_linux();
+#endif
+#if CONFIG_MACOS_KPERF
+    if (ret < 0)
+        ret = bench_init_kperf();
 #endif
+#ifdef AV_READ_TIME
     if (ret < 0)
-        return ret;
+        ret = bench_init_ffmpeg();
+#endif
+    if (ret < 0) {
+        fputs("checkasm: --bench is not supported on your system\n", stderr);
+        return -1;
+    }
 
     state.nop_time = measure_nop_time();
     printf("nop: %d.%d\n", state.nop_time/10, state.nop_time%10);
-- 
2.40.1



More information about the ffmpeg-devel mailing list