ARM 中是否有与 rdtsc 等效的指令? [英] Is there an equivalent instruction to rdtsc in ARM?

查看:40
本文介绍了ARM 中是否有与 rdtsc 等效的指令?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于我的项目我必须使用内联汇编指令例如rdtsc来计算一些C/C++指令的执行时间.

For my project I must use inline assembly instructions such as rdtsc to calculate the execution time of some C/C++ instructions.

以下代码似乎适用于 Intel 但不适用于 ARM 处理器:

The following code seems to work on Intel but not on ARM processors:

{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);}
//The C++ statement to measure its execution time
{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);}
time = t1-t0;

我的问题是:

如何写一个类似于上面的内联汇编代码(计算一条指令的执行时间)在ARM处理器上工作?

How to write an inline assembly code similar to the above (to calculate the execution elapsed time of an instruction) to work on ARM processors?

推荐答案

您应该阅读协处理器 p15(不是实际的协处理器)的 PMCCNTR 寄存器,只是 CPU 函数的一个入口点)来获取循环计数.请注意,只有在以下情况下才可用于非特权应用:

You should read the PMCCNTR register of a co-processor p15 (not an actual co-processor, just an entry point for CPU functions) to obtain a cycle count. Note that it is available to an unprivileged app only if:

  1. 允许无特权的 PMCCNTR 读取:

PMUSERENR 寄存器的位 0 必须设置为 1 (官方文档)

Bit 0 of PMUSERENR register must be set to 1 (official docs)

PMCCNTR 实际上是在计算周期数:

PMCCNTR is actually counting cycles:

PMCNTENSET 寄存器的第 31 位必须设置为 1 (官方文档)

Bit 31 of PMCNTENSET register must be set to 1 (official docs)

这是一个真实示例 它是如何完成的.

This is a real-world example of how it`s done.

这篇关于ARM 中是否有与 rdtsc 等效的指令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆