#include <stdio.h>
#include <stdlib.h>
#ifndef rdtsc
//#define rdtscfreq 2.1280493e9
#define rdtscfreq 1
#define rdtsc(low,high) \
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
static inline double rdtscdiff(unsigned int low1,unsigned int high1,unsigned int low2,unsigned int high2)
{
const double MAXintplus1 = 4294967296.0;
unsigned int low,high;
if (low2<low1) {
low = 0xffffffff - low1 + low2;
high = high2 - high1 -1;
}
else {
high = high2 - high1;
low = low2 - low1;
}
// printf("%d,",low);
return (double)high * MAXintplus1 + (double)low ;
}
static inline double mdtime(int id)
{
static unsigned int high0,low0,high1,low1;
if(id){
rdtsc(low1,high1);
return rdtscdiff(low0,high0,low1,high1)/rdtscfreq;
}
else{
rdtsc(low0,high0);
return 0.0;
}
}
#endif
int main() {
unsigned int i, j;
unsigned long long l1, l2;
double t3;
rdtsc(i, j);
printf("%u, %u\n", i, j);
l1 = i;
l1 = l1<<32 + j;
printf("%u\n", l1);
sleep(1);
rdtsc(i, j);
printf("%u, %u\n", i, j);
l2 = i;
l2 = l2<<32 + j;
printf("%u\n", l2);
printf("%u\n", l2-l1);
printf("=====================\n");
mdtime(0);
sleep(1);
t3= mdtime(1);
printf("cycle:%15f \n", t3);
return 0;
}
2862787528, 319177
0
1506265676, 319178
0
0
=====================
lstrsse time:2938969659.000000
[abiao@renjingbiao test]$ ./cpuCyle
3396861368, 319190
0
2039303239, 319191
0
0
=====================
cycle:2936048818.000000
[abiao@renjingbiao test]$ ./cpuCyle
1225801071, 319198
0
4160713964, 319198
0
0
=====================
cycle:2936045540.000000
[abiao@renjingbiao test]$
[abiao@renjingbiao test]$ ./cpuCyle
2173435180, 319296
0
813391392, 319297
0
0
=====================
cycle:2938978526.000000
[abiao@renjingbiao test]$