On Fri, 7 Jun 2024, Rémi Denis-Courmont wrote:
Le 7 juin 2024 12:12:45 GMT+03:00, "Martin Storsjö" <mar...@martin.st> a écrit :
The default timer register pmccntr_el0 usually requires enabling
access with e.g. a kernel module.
---
cntvct_el0 has significantly better resolution than
av_gettime_relative (while the unscaled nanosecond output of
clock_gettime is much higher resolution).
In one tested case, the cntvct_el0 timer has a frequency of 25 MHz
(readable via the register cntfrq_el0).
---
libavutil/aarch64/timer.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/libavutil/aarch64/timer.h b/libavutil/aarch64/timer.h
index fadc9568f8..966f17081a 100644
--- a/libavutil/aarch64/timer.h
+++ b/libavutil/aarch64/timer.h
@@ -33,7 +33,16 @@ static inline uint64_t read_time(void)
uint64_t cycle_counter;
__asm__ volatile(
"isb \t\n"
+#if defined(__ANDROID__)
+ // cntvct_el0 has lower resolution than pmccntr_el0, but is usually
+ // accessible from user space by default.
+ "mrs %0, cntvct_el0 "
+#else
+ // pmccntr_el0 has higher resolution, but is usually not accessible
+ // from user space by default (but access can be enabled with a custom
+ // kernel module).
"mrs %0, pmccntr_el0 "
+#endif
It feels a little newbie-hostile choice to pick something that's broken
by default but only on non-Android Linux.
Actually, on aarch64 Windows (both native Windows, and Linux binaries in
WSL), pmccntr_el0 is accessible in user mode (and this is a documented
feature, not an accident). Hence the "usually" in the comments.
But yes, the default is a bit hostile in that sense, as it's usually not
usable as such on Linux.
This patch is at least a small baby step in a different direction; more
configurability probably would be good, but I didn't want to take on
fixing that here. But for those actually working on assembly, pmccntr_el0
still is the best and usually worth the hassle - so we want to get rid of
it entirely.
Is there at least a runtime warning?
Since ac40c3bb07781e72f3eb1e30ea450019cc1f6302 we do have a runtime test
in checkasm, if --bench is passed, giving the user a somewhat generic
message, rather than crashing. (For other code using START/STOP_TIMER,
there's no runtime check/warning though.)
// Martin
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".