12 void usage(char *name
) {
13 printf ("Usage: %s cpunum\n", name
);
16 int main(int argc
, char **argv
) {
18 char msr_file_name
[64];
19 long long tsc
, old_tsc
, new_tsc
;
20 long long aperf
, old_aperf
, new_aperf
;
21 long long mperf
, old_mperf
, new_mperf
;
22 struct timeb before
, after
;
23 long long int start
, finish
, total
;
32 cpu
= strtol(argv
[1], (char **) NULL
, 10);
39 sprintf(msr_file_name
, "/dev/cpu/%d/msr", cpu
);
40 fd
= open(msr_file_name
, O_RDONLY
);
43 perror("Failed to open");
48 CPU_SET(cpu
, &cpuset
);
50 if (sched_setaffinity(0, sizeof(cpu_set_t
), &cpuset
)) {
51 perror("Failed to set cpu affinity");
56 pread(fd
, &old_tsc
, sizeof(old_tsc
), 0x10);
57 pread(fd
, &old_aperf
, sizeof(old_mperf
), 0xe7);
58 pread(fd
, &old_mperf
, sizeof(old_aperf
), 0xe8);
60 for (i
=0; i
<0x8fffffff; i
++) {
65 pread(fd
, &new_tsc
, sizeof(new_tsc
), 0x10);
66 pread(fd
, &new_aperf
, sizeof(new_mperf
), 0xe7);
67 pread(fd
, &new_mperf
, sizeof(new_aperf
), 0xe8);
69 tsc
= new_tsc
-old_tsc
;
70 aperf
= new_aperf
-old_aperf
;
71 mperf
= new_mperf
-old_mperf
;
73 start
= before
.time
*1000 + before
.millitm
;
74 finish
= after
.time
*1000 + after
.millitm
;
75 total
= finish
- start
;
77 printf("runTime: %4.2f\n", 1.0*total
/1000);
78 printf("freq: %7.0f\n", tsc
/ (1.0*aperf
/ (1.0 * mperf
)) / total
);