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的时钟频率可变。
- 乱序执行导致测量不准。