有人知道可以用来测量时间的x86指令吗?导致任务切换的定时器是否可通过软件访问?
发布于 2012-09-04 13:00:07
在x86平台上测量时间的方法:
请注意,并不是所有这些选项都可供您使用,具体取决于操作系统和硬件。如果您在现代操作系统(Windows,Linux)下运行,它将根据自己的计时需要控制8254/HPET,因此您将无法使用它们。
在现代操作系统下,通常最好使用操作系统提供的定时功能.操作系统开发人员可能已经解决了许多问题,如果您尝试使用它,您将独自遇到这些问题。(请注意,操作系统可以提供多个定时功能。选择适合您的应用程序的。)
发布于 2012-09-01 17:07:42
您可以使用rdtsc.Just从现值中扣除以前的值来计算时间差。
将处理器的时间戳计数器(64位MSR)的当前值加载到EDX:EAX寄存器中。EDX寄存器用MSR的高阶32位加载,EAX寄存器用低阶32位加载。(在支持Intel 64体系结构的处理器上,每个RAX和RDX的高级32位都被清除。)
这是实现此指令的C代码 :-
unsigned long long int rdtsc(void)
{
unsigned long long int x;
unsigned a, d;
__asm__ volatile("rdtsc" : "=a" (a), "=d" (d));
return ((unsigned long long)a) | (((unsigned long long)d) << 32);;
}发布于 2013-01-23 05:29:04
下面是执行此操作的FORTRAN可调用例程:
汇编程序指令RDTSC返回一个64位整数,即自年点开始的CPU时钟计数数。如果FORTRAN有64位整数,则参数KOUNT被声明为整数*8,否则声明为由两个32位整数*4组成的数组。
所以在你的FORTRAN程序中
CALL TIMERR(KOUNT)在开始时,保存KOUNT的值,然后在末尾重复。然后减去两个64位值来确定经过的时间。我通常只费心减去两个较低的单词,因为我的时间通常小于2^32系统时钟。
它也可以从C呼叫,但我不会说C。
; C This assembler routine looks to FORTRAN like this:
; SUBROUTINE TIMERR(KOUNT)
; INTEGER*4 KOUNT(2); or INTEGER*8 KOUNT
; ...get a 64-but system time value into KOUNT......
; RETURN
; END
;
.Code
_TIMERR@4: RDTSC
Push Eax
Push Ecx
Push Edx
Mov Ecx, [Esp + 16]
Mov [Ecx], Eax
Mov [Ecx + 4], Edx
Pop Edx
Pop Ecx
Pop Eax
Ret 4https://stackoverflow.com/questions/12229644
复制相似问题