编译报错:error: impossible constraint in ‘asm’
__asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi));。
TSC是时间戳计数器的缩写,它是Pentium兼容处理器中的一个计数器,它记录自启动以来处理器消耗的时钟周期数。在每个时钟到来时,该计数器自动加一。因为TSC随着处理器周期速率的变化而变化,所以它提供了非常高的精确度。它经常被用来分析和检测代码。x86平台TSC的值可以通过rdtsc指令来读取,鲲鹏平台需要使用类似算法实现。
x86平台实现样例:
static inline uint64_t Rdtsc() { uint32_t lo, hi; __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); return (uint64_t)hi << 32 | lo; }
鲲鹏平台实现样例:
#include <time.h> static inline uint64_t Rdtsc() { struct timespec tmp; clock_gettime(CLOCK_MONOTONIC, &tmp); return tmp.tv_sec*2400000000+(uint64_t)tmp.tv_nsec*2.4; //2400000000和2.4基于服务器主频而定 }
static inline uint64_t Rdtsc() { uint64_t count_num; uint64_t Current_Speed = 2400; // Current Speed =2400MHz uint64_t External_Clock = 100; // External Clock = 100MHz __asm__ __volatile__ ("mrs %0, cntvct_el0" : "=r" (count_num)); return count_num *(Current_Speed / External_Clock); }
其中Cent Speed和External Clock的值可由以下命令获取到:dmidecode |grep MHz。