利用时钟周期评测性能

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频率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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核

1
2
3
4
5
6
7
8
9
10
11
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核。

1
bind_to_core(15);

获取时钟周期

1
2
3
4
5
unsigned long long rdtsc() {
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return ((unsigned long long)hi << 32) lo;
}

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2023/04/23/rdtsc/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!