FARGOS/VISTA Object Management Environment Core  ..
FARGOS/VISTA Object Management Environment Core Table of Contents
IAPerf.h
Go to the documentation of this file.
1 //
2 // IAPERF.H
3 //
4 
5 #include <stdio.h>
6 
7 // RDTSC functions
8 
9 
10 #ifdef __linux__
11 
12 # ifdef __ia64__
13 
14 # ifdef __INTEL_COMPILER
15 
16 # ifdef __cplusplus
17 extern "C" {
18 unsigned __int64 __getReg(int whichReg);
19 }
20 # else
21 unsigned __int64 __getReg(int whichReg);
22 # endif
23 
24 # pragma intrinsic(__getReg)
25 # define INL_REGID_APITC 3116
26 
27 unsigned __int64 rdtsc()
28 {
29  volatile unsigned __int64 temp;
30 
31  temp = __getReg(INL_REGID_APITC);
32 
33  return temp;
34 }
35 
36 # else // __INTEL_COMPILER
37 
38 // Assume 64-bit gcc
39 unsigned long rdtsc()
40 {
41  volatile unsigned long temp;
42 
43  __asm__ __volatile__("mov %0=ar.itc"
44  : "=r"(temp) ":: memory");
45 
46  return temp;
47 }
48 
49 # endif // __INTEL_COMPILER
50 
51 # else // __ia64__
52 
53 // Assume IA32, gcc or Intel Compiler
54 unsigned long long rdtsc()
55 {
56  unsigned long long temp;
57 
58  __asm__ __volatile__(
59  "cpuid\n\t"
60  "rdtsc\n\t"
61  "leal %0, %%ecx\n\t"
62  "movl %%eax, (%%ecx)\n\t"
63  "movl %%edx, 4(%%ecx)\n\t"
64  :
65  : "m"(temp)
66  : "%eax", "%ebx", "%ecx", "%edx");
67 
68  return temp;
69 }
70 
71 # endif // __ia64__
72 
73 #else // __linux__
74 
75 # ifdef WIN64
76 
77 // Assume Microsoft or Intel Compiler
78 # ifdef __cplusplus
79 extern "C" {
80 unsigned __int64 __getReg(int whichReg);
81 }
82 # else
83 unsigned __int64 __getReg(int whichReg);
84 # endif
85 
86 # pragma intrinsic(__getReg)
87 # define INL_REGID_APITC 3116
88 
89 unsigned __int64 rdtsc()
90 {
91  volatile unsigned __int64 temp;
92 
93  temp = __getReg(INL_REGID_APITC);
94 
95  return temp;
96 }
97 
98 # else // WIN64
99 
100 // Assume WIN32 with Microsoft or Intel Compiler
101 unsigned __int64 rdtsc()
102 {
103  volatile unsigned __int64 temp;
104 
105  _asm cpuid _asm rdtsc
106 
107  _asm lea ecx,
108  temp _asm mov[ecx], eax _asm mov[ecx + 4], edx
109 
110  return temp;
111 }
112 
113 # endif // WIN64
114 
115 #endif // __linux__
116 
117 
118 // The IAperf Macros
119 
120 #ifdef __linux__
121 
122 # define PERFINITMHZ(clkspd) \
123  unsigned long long clocks; \
124  double clockspeed = (unsigned long long) clkspd * 1000000;
125 
126 # define PERFREPORT printf("time elapsed = %f sec\n", ((double) clocks) / clockspeed);
127 
128 #else
129 
130 # define PERFINITMHZ(clkspd) \
131  unsigned __int64 clocks; \
132  double clockspeed = (double) 1000000 * clkspd;
133 
134 # define PERFREPORT printf("time elapsed = %f sec\n", ((double) clocks) / clockspeed);
135 
136 #endif
137 
138 
139 #define PERFSTART clocks = rdtsc();
140 
141 #define PERFSTOP clocks = rdtsc() - clocks;
142 
143 /* vim: set expandtab shiftwidth=4 tabstop=4: */
rdtsc
unsigned __int64 rdtsc()
Definition: IAPerf.h:101
Generated: Fri Jul 31 2020 18:19:14
Support Information