以下内容来源 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;
}
示例说明
- 使用内联汇编
__asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
- 执行 rdtsc 指令。 该指令将 TSC 的低 32 位存储到 EAX 寄存器(或 RAX 寄存器,在 64 位架构下),高 32 位存储到 EDX 寄存器(或 RDX 寄存器,在 64 位架构下)。 通过 C 语言的变量 low 和 high 分别捕获 EAX 和 EDX 寄存器的值。 将高 32 位和低 32 位组合成一个 64 位无符号整数,作为 rdtsc() 函数的返回值。
- 在代码中调用 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 频率调节实用程序。