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;
}
Comments | NOTHING