c 语言 rdtsc 详解(from chat-GPT4)

以下内容来源 chat-GPT4,略微做了些格式整理

简介

rdtsc 指令是 x86 架构下的一条汇编指令,全称 “Read Time-Stamp Counter”,用于读取时间戳计数器(TSC)。时间戳计数器是一个 64 位的寄存器,CPU 的每个时钟周期会对其进行加一。rdtsc 通过读取这个计数器,可以测量程序某段代码的执行时间。

示例

在 C 语言中,要使用 rdtsc,通常需要借助内联汇编。以下是一个简单的示例:

#include <stdio.h>
#include <stdint.h>

static inline uint64_t rdtsc()
{
    uint32_t low, high;
    __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
    return (uint64_t)high << 32 | low;
}

int main()
{
    uint64_t start, end;

    start = rdtsc();
    // 需要测量的代码段
    end = rdtsc();

    printf("Cycles: %llu\n", end - start);

    return 0;
}

示例说明

  1. 使用内联汇编 __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
  2. 执行 rdtsc 指令。 该指令将 TSC 的低 32 位存储到 EAX 寄存器(或 RAX 寄存器,在 64 位架构下),高 32 位存储到 EDX 寄存器(或 RDX 寄存器,在 64 位架构下)。 通过 C 语言的变量 low 和 high 分别捕获 EAX 和 EDX 寄存器的值。 将高 32 位和低 32 位组合成一个 64 位无符号整数,作为 rdtsc() 函数的返回值。
  3. 在代码中调用 rdtsc() 两次,分别获取开始和结束时的 TSC 值,并计算它们之间的差值,即为程序执行该代码段所花费的 CPU 时钟周期数。

注意

需要注意的是,rdtsc 可能受到一些因素的影响,例如 CPU 频率动态调整以及现代处理器的乱序执行等。因此,在实际应用中,可能需要采取额外措施,如禁用动态频率调整、使用更精确的计时方法等。

扩展

  • 在linux系统中禁用动态频率调整

在 Linux 系统中,可以通过修改 CPU 频率调节器的配置来禁用动态频率调整。CPU 频率调节器允许您在不同的性能模式下运行处理器。要禁用动态频率调整,将 CPU 频率调节器设置为 “performance” 模式。

以下是如何将所有 CPU 核心设置为 “performance” 模式的步骤:

打开终端。

查看可用的 CPU 频率调节器:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

这将显示一系列可用的调节器,例如:performance powersave。

将每个 CPU 核心的调节器设置为 “performance”:

echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

这将为系统上的所有 CPU
核心禁用动态频率调整,并将它们设置为最大性能模式。需要注意的是,这个设置在重启后会丢失。 若要使更改永久生效,可以使用
cpufrequtils 软件包或编辑 /etc/default/cpufrequtils(如果可用)进行设置。

在 C 代码中,没有直接的方法来禁用动态频率调整。然而,您可以在程序开始执行时调用一个脚本来执行上述命令,从而间接实现该功能。这需要提前获取
root 权限。

  • 使得系统重启也保持生效的具体配置方法

/etc/default/cpufrequtils 文件用于 Linux 系统中配置 CPU 频率调节器的默认设置。要在该文件中永久地将
CPU 频率调节器设置为 “performance” 模式,请按照以下步骤操作:

使用 root 权限打开终端。

如果没有安装 cpufrequtils,先安装它:

sudo apt-get install cpufrequtils

对于其他 Linux 发行版,可能需要使用不同的包管理工具(如
yum、dnf 或 pacman)进行安装。

使用文本编辑器打开 /etc/default/cpufrequtils 文件,例如使用 nano 编辑器:

sudo nano /etc/default/cpufrequtils

在打开的文件中,找到或添加以下几行:

ENABLE=“true” GOVERNOR=“performance”

如果这些行已经存在但有不同的值,将它们更改为上述值。

保存并关闭文件。

重启系统以使更改生效:

sudo reboot

现在,每次启动计算机时,CPU 频率调节器都会自动设置为 “performance”
模式。这意味着处理器将始终运行在最高性能状态,从而禁用动态频率调整。

请注意,在某些系统上,可能需要使用类似的配置文件,如 /etc/default/cpufreqd 或
/etc/conf.d/cpufreq,方法与前述相似。具体取决于您的 Linux 发行版和所使用的 CPU 频率调节实用程序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tobybo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值