我在ARM的网站上发现
PMCCNTR_EL0
寄存器保存着处理器的周期计数值。但为了访问它,必须实现FEAT_PMUv3
。但我无法访问寄存器。 Apple 是否限制访问寄存器?
我需要计算周期数来对函数进行基准测试:
for (i = 0; i < 1000000; i++){
c1 = get_cycle_count();
function_to_benchmark();
c2 = get_cycle_count();
count_array[i] = c2 - c1;
}
我希望函数
get_cycle_count()
在我的 C 程序中使用汇编返回 PMCCNTR_EL0
的 uint64 值。
我找到了 this C++ 实现,但无法为 C 复制它。
以下示例展示了如何使用 C 中的内联汇编获取系统寄存器的值:
#include <stdint.h>
#include <stdio.h>
int main() {
uint64_t value;
asm("mrs %0, CNTVCT_EL0" : "=r"(value));
printf("CNTVCT_EL0 = 0x%016lX\n", value);
}
根据您的情况将
CNTVCT_EL0
替换为 PMCCNTR_EL0
,将所需值移至 value
。
需要考虑的另一件事是,系统可以限制对此寄存器的访问,如数据表的伪代码中所指定。我不知道这在 macOS 上的表现如何,因为我没有这样的系统来测试。