Sta*_*tan 2 c assembly microbenchmark arm64 apple-m1
我想在我的代码中插入一些时间测量。在 x64 上我使用 __rdtscp。mac m1/m2 有类似的东西吗?具体来说,不是系统调用和高分辨率。
只需使用clock_gettime(CLOCK_MONOTONIC,...)
它是一个VDSO
函数。这意味着内核将代码注入到“做正确的事情”的用户空间程序中,因此用户空间程序可以访问时间戳计数器而无需执行系统调用。
在 x86 上,它[通常]会调用rdtsc
[或 PET],并调整计数器值以表示纳秒。
在arm上,TSC是一个控制寄存器,只能在内核模式下访问。但是,高端臂架构允许将其映射为用户空间的 R/O 访问。内核启用映射。然后,VDSO 片段将知道如何通过映射访问这些值。
\n打电话的clock_gettime
速度很快。速度如此之快以至于不值得尝试直接访问计数器寄存器。
另外,直接访问计数器也没有多大意义,因为我们仍然必须将其转换为某种标准单位(例如纳秒)。VDSO 片段将执行此操作。
\n更新:
\n\n\nmacOS 上也是 VDSO 调用吗?\xe2\x80\x93\xc2\xa0\n模糊
\n
我的直接经验是在 nVidia Jetson [linux 下] 上使用 ARM。
\n但是,据我所知,macOS 提供了[必须提供] clock_gettime
。
在较旧的内核上,它可能必须发出等效的系统调用。
\n但是,由于该架构提供了用户空间直接访问给定操作系统/内核的方法,因此有充分的理由相信 VDSO 方法在 macOS 下也可用。事实上,确实如此:https ://www.unix.com/man-page/osx/7/vdso/
\n查看具体机制的方法是构建一个使用clock_gettime
并[使用gdb
]单步执行的程序。然后,就可以反gdb
汇编clock_gettime
代码了。
我们必须使用gdb
[vs. objdump
和/或readelf
] 用于反汇编,因为该代码片段是由内核动态加载/注入的,因此通过静态分析不容易访问它。
此外,注入的代码可以是特定于处理器模型的。内核在引导期间探测 CPU 架构及其功能。它根据找到的功能制作片段。
\n使用gdb
是我检查[大约 3 年前的商业产品]的方式,以验证它是否可以在没有clock_gettime
系统调用的情况下访问硬件,并且它提供了正确的纳秒值。在这种特殊情况下,我还查看了内核源代码中的架构特定部分。