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

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

简介

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

示例

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

#include 
#include 

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 频率调节实用程序。

你可能感兴趣的:(C,c语言,linux,服务器)