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) { 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 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 协议。转载请注明出处!