有谁知道,可用于测量时间的x86指令? 是由软件导致任务切换访问的计时器?
Answer 1:
的方式来衡量时间在x86平台上:
实时时钟 - 时间和日期为您的操作系统的源。 1秒精度。 在可被用于测量绝对时刻的标准PC的唯一时间源。
8254计数器/定时器 -一个标准计数器/定时器芯片由于PC的曙光(现为芯片组内的功能块),其已经存在于主板。 这是IRQ0,定时器中断,做任务切换中最年长的操作系统的传统来源。
RDTSC汇编指令 - 计数CPU时钟周期。 一看便知匿名ymous张贴一些使用细节。 相当多的精度的最高水平,你可以找到x86上的时间源。 但是,它也有一些陷阱与准确性。 也是最方便的选择,如果你正在写汇编。
RDTSCP汇编指令 - 到RDTSC类似,不过是系列化,从而解决了一些与RDTSC准确性的问题。 只有在最新的处理器中。
HPET -介绍各地的个人电脑的酷睿时代。 旨在成为令人尊敬的现代8254操作系统将以此作为自己的任务调度中断替换(Vista和更高版本)
在芯片组专有定时器 - 一些芯片组都有内置的电源管理和多媒体功能专用的定时器。 有时你可以征用这些为自己的应用程序,假设你正在处理一个固定功能的嵌入式系统,而不是一个通用的PC。
请注意,并非所有这些选项将提供您根据您的操作系统和硬件上。 如果你是一个现代操作系统(Windows和Linux)下运行,它会采取8254 / HPET为自己的时间需求的控制,因此,他们会为你不可用。
下现代操作系统,通常最好使用OS提供的定时功能。 操作系统开发者可能已经摸索出了很多,你将在你自己,如果你尝试使用它遇到的各种问题。 (注意,OS可以提供多个定时的功能。挑选一个适合于应用程序。)
Answer 2:
您可以使用rdtsc
。只是从现值减去前值的时间差之间计算。
载荷处理器的时间戳计数器(64位MSR)到EDX的当前值:EAX寄存器。 EDX寄存器加载有高阶的MSR和EAX寄存器的32位中装入低位32位。 (在支持英特尔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);;
}
Answer 3:
这里是一个FORTRAN程序调用该做的:
汇编指令RDTSC返回一个64位整数这是自今年点CPU时钟计数的数量。 如果您的FORTRAN有64位整数,KOUNT是刚刚宣布的说法是INTEGER * 8。 否则宣告它是两个32位INTEGER * 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 4