如何使用asm从C中的arm64上的寄存器返回CPU周期计数? (苹果M2)

问题描述 投票:0回答:1

我在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 arm64
1个回答
0
投票

以下示例展示了如何使用 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 上的表现如何,因为我没有这样的系统来测试。

© www.soinside.com 2019 - 2024. All rights reserved.