dpdk 不完全筆記: rte_rdtsc()


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的時鐘頻率可變。
  • 亂序執行導致測量不準。

ref

使用rdtsc指令,測量程序的運行速度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章