首页 > 其他分享 >x86下的tsc计时器

x86下的tsc计时器

时间:2024-12-15 17:21:04浏览次数:4  
标签:x86 void tsc 计时器 time toc rsp tic

tic-toc.s对外提供两个接口,void tic(void), uint64_t toc(void), 用法基本类似matlab的tic toc函数,toc函数返回的是cycles, 转换成时间需要除cpu tsc的频率,tsc频率一般不是cpu主频,而是最大频率的1/2,(cpu有最大和睡眠频率),获取tsc的频率可以通过接口dmesg | grep tsc bash 命令查看。

有些注意点:

  1. rdtsc不管在32bit还是64bit,都是通过2个32位的寄存器返回的。
  2. 使用时最好看一下当前lscpu是不是有constant_tsc nostop_tsc的flag, 没有可能会有问题
.section .data
.local s_time
.type s_time,@object
s_time:
 .zero 8
.size s_time, 8

.text
.global tic
.type tic,@function
tic:
 rdtsc
 leaq s_time(%rip), %rbx
 movl %edx, 4(%rbx)
 movl %eax, (%rbx)
 ret
.size tic,.-tic

.text
.global toc
.type toc,@function
toc:
 pushq %rbp
 movq %rsp, %rbp
 subq $8, %rsp
 rdtsc
 movl %edx, 4(%rsp)
 movl %eax, (%rsp)
 movq s_time(%rip), %rbx
 movq (%rsp), %rax
 subq %rbx, %rax
 #movq %rbx, s_time(%rip)
 addq $8, %rsp
 popq %rbp
 ret
.size toc,.-toc

一个main函数使用tic、toc的例子,

#include <stdint.h>
#include <stdio.h>
void tic(void);
uint64_t toc(void);

int main() {
 tic();
 int ans =0;
 for(int i=0; i<100; i++) ans += i;
 printf("%lu cycles passed\n", toc());

 tic();
 ans =0;
 for(int j=0; j<3000; j++)
 for(int i=0; i<1000000; i++) ans += i;
 printf("%.2f us passed\n", (double)toc()/2.112e3);

 return 0;
}

参考
【1】https://blog.csdn.net/Once_day/article/details/130959295
【2】https://blog.csdn.net/ithiker/article/details/119981737

标签:x86,void,tsc,计时器,time,toc,rsp,tic
From: https://www.cnblogs.com/zwlwf/p/18608206

相关文章

  • 【Docker】Docker如何在x86_64平台构建arm64镜像
    Buildx是DockerCLI的一个用于增强构建能力的扩展插件,旨在扩展和改进Docker的原生dockerbuild命令。Buildx允许开发人员构建跨平台镜像、多架构镜像,支持更灵活的构建配置,并且集成了许多现代构建工具和技术。安装使用Buildx需要Docker的版本>=19.03。WindowsandmacOSBuildx......
  • Windows高精度计时器(适用短且占用性能的方式)
    QueryPerformanceCounter:获取当前的高精度计时器值QueryPerformanceFrequency:获取高精度计时器的频率[DllImport("Kernel32.dll")]privatestaticexternboolQueryPerformanceCounter(outlonglpPerformanceCount);[DllImport("Kernel32.dll")]privatestaticextern......
  • ppdcheck.exe 是一个用于验证 PPD (PostScript Printer Description) 文件的命令行工
    ppdcheck.exe用法ppdcheck.exe[-选项]文件名...其中选项包括:-b 尝试首先读取缓存的二进制PPD数据。-k 保留二进制PPD数据。-p 使用PT扩展检查驱动程序的devmode大小。-vN 设置驱动程序版本为N。N可以是3或4,默认为v4。-wN 设置警告级别为N。-h ......
  • keepalived编译安装-CentOS X86
    环境信息操作系统:CentOSLinuxrelease7.9.2009(Core)架构:X86keepalived版本:2.3.1编译wgethttps://www.keepalived.org/software/keepalived-2.3.1.tar.gztarxvfkeepalived-2.3.1.tar.gzcdkeepalived-2.3.1/./configure--prefix=/usr/local/keepalivedmakema......
  • 【虚拟机】Windows(x86)上部署Win11 on ARM虚拟机
    参考链接:1.https://blog.csdn.net/XiaoYuHaoAiMin/article/details/1407012502. https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4530491488179269409&sourceFrom=search_a第一步:安装QEMU虚拟机1.下载链接:https://www.qemu.org/(这个链接找到的都是tar,还是直接......
  • Windows10 LTSC版本 无法访问网络中部分的共享文件夹
    问题:Windows电脑在网络中部分 共享文件夹可以访问,而另一部分电脑则无法访问,IP也能正常Ping通。但是访问的时候始终会提示错误码:0x80004005  或者 0x80070035 解决方法:1、修改注册表打开注册表,路径[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorksta......
  • 请使用js实现一个秒表计时器的程序
    <!DOCTYPEhtml><html><head><title>秒表计时器</title><style>#stopwatch{font-size:2em;font-family:monospace;/*使用等宽字体*/}</style></head><body><divid="stopwatch">00:00:00&......
  • 如何在x86模拟器和鸿蒙API9如何使用MQTT模块ohos_mqtt
    目录引言安装失败的原因如何编译so文件的x86_64版本下载源代码 安装NDK代码编译安装MQTT软件包避免MQTT软件包自动升级设置libs客户端程序的编写运行测试结语参考文献引言在上周的博客(如何在鸿蒙API9和x86模拟器中使用MQTT-CSDN博客)中介绍了我的学生有个需求......
  • MGTSC 212 using Excel
    MGTSC212Fall2024LabAssignment4Dueby11:59PM,06Dec.2024Totalpoints:80Perform.allcalculationsusingExcel, whencalculationsareneeded: noothersourceof answers requiring calculation will be permitted.Someof theanswerswillaut......
  • Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
    问题背景执行yumupdate出现如下报错排查虚拟机是否联网ping-c4www.baidu.com可以看到网络链接没有问题解决方案原因是国外的镜像源有问题,换成国内的即可。备份原有的镜像源sudomv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup......