利用时钟周期评测性能

发布于 2023-04-23  191 次阅读


rdtsc指令

rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。

在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。

rdtsc指令就是从该寄存器中进行获取的。

周期和频率的关系公式:T(周期)=1/f(频率)

如CPU频率f为1GHz,则其时钟周期T=1/1GHz秒,意味着每隔T秒,CPU完成一个最基本的动作,并在寄存器中,对周期数加1。

故,假设当前时钟周期数为m,则可计算出CPU自启动后,累计运行时间X=m*T.

$$CPU累计运行时间=时钟周期数/CPU频率$$

固定CPU频率

sudo apt-get update
sudo apt-get install cpufrequtils
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
sudo cpufreq-set -g performance

# 不能一次性设置,需要手动一个一个设置
cpufreq-set -c 0 -f 2.4G
cpufreq-set -c 1 -f 2.4G
cpufreq-set -c 2 -f 2.4G
cpufreq-set -c 3 -f 2.4G
cpufreq-set -c 4 -f 2.4G
cpufreq-set -c 5 -f 2.4G
cpufreq-set -c 6 -f 2.4G
cpufreq-set -c 7 -f 2.4G
cpufreq-set -c 8 -f 2.4G
cpufreq-set -c 9 -f 2.4G
cpufreq-set -c 10 -f 2.4G
cpufreq-set -c 11 -f 2.4G
cpufreq-set -c 12 -f 2.4G
cpufreq-set -c 13 -f 2.4G
cpufreq-set -c 14 -f 2.4G
cpufreq-set -c 15 -f 2.4G

cat /proc/cpuinfo | grep MHz

绑定CPU核

static bool bind_to_core(int tid) {
    // return;
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(tid, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) != 0) {
        cout << "Failed to set affinity (core: " << tid << ")" << endl;
        return false;
    }
    return true;
}

绑定第15个CPU核。

bind_to_core(15);

获取时钟周期

unsigned long long rdtsc() {
    unsigned int lo, hi;
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((unsigned long long)hi << 32) | lo;
}

本当の声を響かせてよ