dpdk 不完全筆記: rte_rdtsc()
rte_rdtsc() 返回的是自開機始CPU的週期數。
- rte_rdtsc() 只是獲得tsc寄存器的值。
- 每經過一個時鐘週期,tsc寄存器就自動加1。
- 如果 CPU MHz爲1600,那麼tsc的1就是1/1600/1000/1000的時間。
rte_get_tsc_cycles() 與 rte_rdtsc() 功能相同。
- rte_get_tsc_cycles() 內部就是調用 rte_rdtsc()。
rte_rdtsc_precise() 返回精確的CPU的週期數。
- rte_rdtsc_precise() 在 rte_rdtsc() 之前添加了內存屏障。
static inline uint64_t
rte_rdtsc_precise(void)
{
rte_mb();
return rte_rdtsc();
}
rte_get_tsc_hz() 返回一秒的tsc數目
- CPU的時鐘頻率可變,在運行過程中是可變的。如升降頻。
- rte_get_tsc_hz() 的返回 取自 eal_tsc_resolution_hz。只有在 set_tsc_freq() 中更新。
/* The frequency of the RDTSC timer resolution */
static uint64_t eal_tsc_resolution_hz;
void
set_tsc_freq(void)
{
uint64_t freq;
freq = get_tsc_freq_arch();
if (!freq)
freq = get_tsc_freq();
if (!freq)
freq = estimate_tsc_freq();
eal_tsc_resolution_hz = freq;
}
int
rte_eal_timer_init(void)
{
set_tsc_freq();
return 0;
}
uint64_t
rte_get_tsc_hz(void)
{
return eal_tsc_resolution_hz;
}
多核時代不宜再用 x86 的 RDTSC 指令測試指令週期和時間。
- 多核,不能保證每個核的TSC是一樣的。
- CPU的時鐘頻率可變。
- 亂序執行導致測量不準。