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指令,测量程序的运行速度

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