技术标签: linux 时间戳计数器
从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号(CLK, CLK是微处理器中一条用于接收外部振荡器的时钟信号输入引线)到来时加一。
通过它可以计算CPU的主频,比如:如果微处理器的主频是1MHZ的话,那么TSC就会在1秒内增加1000000。除了计算CPU的主频外,还可以通过TSC来测试微处理器其他处理单元的运算速度,资料[2]介绍了这个内容。
那么如何获取TSC的值呢?rdtsc,一条读取TSC的指令,它把TSC的低32位存放在eax寄存器中,把TSC的高32位存放在edx中,更详细的描述见资料[1]。
下面来看看rdtsc的具体用法,在linux源代码include/asm-i386/msr.h中,可以找到这么三个关于rdtsc的宏定义:
#define rdtsc(low,high) \
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
#define rdtscl(low) \
__asm__ __volatile__("rdtsc" : "=a" (low) : : "edx")
#define rdtscll(val) \
__asm__ __volatile__("rdtsc" : "=A" (val))
第三个正是我们需要的,为了方便在我们自己的应用程序中使用,通过资料[3]我们把它简单的封装一下:
typedef unsigned long long cycles_t;
inline cycles_t currentcycles() {
cycles_t result;
__asm__ __volatile__ ("rdtsc" : "=A" (result));
return result;
}
下面来介绍一个实例,用rdtsc来计算CPU的主频。计算方法就是根据TSC的工作原理来的。我们在时间间隔1秒的前后分别记下TSC的值,然后求差并除以1000000。这样就可以计算出以MHZ为单位的主频了。大概的算法如下:
t1 = currentcycles();
sleep(1);
t2 = currentcycles();
printf("cpu MHz : %lld\n", (t2-t1)/1000000);
不过考虑到sleep是基于alarm和pause实现的,我们这里直接通过alarm来产生1秒的时间间隔了。
Code:/**
* readTSC.c -- read the time stamp counter using the rdtsc instruction
*
* falcon * 2008-04-07
*
* ref: 1. [url]http://z.cs.utexas.edu/users/habals/blog/index.php/linux/70[/url]
* 2. [url][/url]
* */
#include /* printf */
#include /* alarm, pause */
#include #include /* signal,kill */
typedef unsigned long long cycles_t;
inline cycles_t currentcycles() {
cycles_t result;
__asm__ __volatile__ ("rdtsc" : "=A" (result));
return result;
}
cycles_t t1, t2;
void handler(int signo)
{
t2 = currentcycles();
printf("cpu MHz : %lld\n", (t2-t1)/1000000);
kill(getpid(), SIGINT);
}
int main(void)
{
signal(SIGALRM, handler);
t1 = currentcycles();
alarm(1);
while(1) pause();
return 0;
}
[Ctrl+A Select All]
这里是执行情况:
$ make readTSC
cc readTSC.c -o readTSC
$ ./readTSC
cpu MHz : 2199
$ cat /proc/cpuinfo | grep MHz
cpu MHz : 2200.103
我们算出来的主频跟内核proc文件系统中记录的值差不多,不过内核里头计算的要大一些,可能内核在计算主频时用了浮点运算的缘故。实际上我们计算的值也比真实的要大,因为在t1和t2之间,除了1s外,我们调用了alarm,而且进行了除法运算,因此实际时间要大于1秒,所以实际主频就会更小一些。
参考资料:
[1] RDTSC instruction[2] Using the RDTSC Instruction for Performance Monitoring
[3] Use RDTSC instruction to measure time on x86 architecturehttp://z.cs.utexas.edu/users/habals/blog/index.php/linux/70
在拳击比赛中,臂短的拳手总是寻机在近距离中进攻,这是以短胜长的技法。而在其他领域,当我们与人竞争时,采取示短致长之韬略制胜的概率也很大。明代《兵经百字测字》:“两将相持,必有所测。测于敌者,避实而击疏;测于敌之测我者,示短以致长。测蹈于虚,反为敌诡。必一测而两备之,虞乎不虞,全术也,将道也。”这是在判断了敌方怎样判断我们意图的情况下所采取的策略,故意显示自己的弱点来欺骗对方,以发挥自己的长处。因
题目查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数查询同时存在" 01 “课程和” 02 "课程的情况查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )查询不存在" 01 “课程但存在” 02 "课程的情况解释...
百度知道贴过来的1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效);在 /etc/sysconfig/clock 中 UTC=false 时,date、hwcloc
错误:android 编译时make[5]: arm-eabi-gcc: Command not found在 buliding preloader.... 的时候出错了,查看log提示 make[5]: arm-eabi-gcc: Command not found意思是说找不到这个编译工具。可能是路径没有配置好。解决办法:在 ~/.bashrc 文件中配置编译工具 arm-e
1.首先获取百度 JavaScriptAPI首先用浏览器打开http://api.map.baidu.com/api?v=1.3如下图所示其中http://api.map.baidu.com/getscript?v=1.3&key=&services=&t=20121108061854这个链接就是我们要找的API文件,同样在浏览器中打开它...
以下教程简单易懂,不需要复杂的环境配置即可完成个人网站的搭建。Step1:购买阿里云的服务器这里我选择了“轻量应用服务器”(如果是搭建个人网站,容量小一点就行,不需要太大),镜像选择:WordPress 4.8.1 即可Step2:购买了以后就获得了服务器的ip地址,接着我们进入控制台,进入PHP应用详细界面,按照里面的操作步骤:这里阿里云已经把SQL数据库,PHP环境都给你配置好了,你不需要自己配置。得到密码后进入网站管理页面,然后按照要求输入账号密码(登录成功后密码可以不改.
智慧城市需要高度可扩展和互联的技术,以在多个城市管理模块中高效运行。边缘人工智能和深度学习等计算机视觉的最新技术将人工智能视觉与物联网相结合。这些新技术使城市处理大量复杂的视觉数据成为可能。智慧城市中的计算机视觉技术在过去的二十年里,智慧城市解决方案应运而生,由物联网 (IoT)、人工智能 (AI)、深度学习和云计算等技术支持。它们为解决基础设施、社会发展和其他挑战提供了巨大的潜力。借助智能技术,智慧社区可以在智能互联传感系统的帮助下改善能源分配、简化垃圾收集流程、减少交通拥堵、改善空气质量等。
Iviews视频搜索引擎想起当年大学生活,特别喜欢和小伙伴一起去影院看电影,每次看到一部让自己心生感触的电影,总会去一刷再刷······如今事过境迁,我写出了个资源搜索引擎,可以更方便我观看电影视频,在此我想把它推广给更多的人。这个搜索引擎可以搜索全网的视频资源,直接搜索,直接观看网址: wsfengfan474.xyz ...
描述(文章来源:EEWORLD)MathWorks推出了2020a版本,具有用于深度学习的扩展AI功能。工程师现在可以在更新的Deep Network Designer应用程序中训练神经网络,在新的Experiment Manager应用程序中管理多个深度学习实验,并从更多的网络选项中进行选择以生成深度学习代码。除了为所有MATLAB和Simulink用户提供的新功能和更新功能之外,R2020a还...
● 创建一个新组stuff,要求组id为1010.● 查看/etc/group文件的最后一行,看看是如何设置的。● 创建新用户user1,user2,默认设置● 查看/etc/group文件的最后3行,得到什么结论● 创建一个新用户user3,并把他的基本组和附加组都设为stuff● 查看/etc/group文件中的最后5行,看看有什么变化。是否存在user3组?● 把user1加入stuff组● 查看一下/etc/group文件中stuff组成员列表是否有变化,/etc/passwd
rem(fontsizeoftherootelement)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(fontsizeoftheelement)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。以下代码可以适配不同大小屏幕宽度。这种方式在浏览器中兼容性较差,但在...