1 | // Copyright 2009-2021 Intel Corporation |
2 | // SPDX-License-Identifier: Apache-2.0 |
3 | |
4 | #pragma once |
5 | |
6 | #define CACHELINE_SIZE 64 |
7 | |
8 | #if !defined(PAGE_SIZE) |
9 | #define PAGE_SIZE 4096 |
10 | #endif |
11 | |
12 | #define PAGE_SIZE_2M (2*1024*1024) |
13 | #define PAGE_SIZE_4K (4*1024) |
14 | |
15 | #include "platform.h" |
16 | |
17 | /* define isa namespace and ISA bitvector */ |
18 | #if defined (__AVX512VL__) |
19 | # define isa avx512 |
20 | # define ISA AVX512 |
21 | # define ISA_STR "AVX512" |
22 | #elif defined (__AVX2__) |
23 | # define isa avx2 |
24 | # define ISA AVX2 |
25 | # define ISA_STR "AVX2" |
26 | #elif defined(__AVXI__) |
27 | # define isa avxi |
28 | # define ISA AVXI |
29 | # define ISA_STR "AVXI" |
30 | #elif defined(__AVX__) |
31 | # define isa avx |
32 | # define ISA AVX |
33 | # define ISA_STR "AVX" |
34 | #elif defined (__SSE4_2__) |
35 | # define isa sse42 |
36 | # define ISA SSE42 |
37 | # define ISA_STR "SSE4.2" |
38 | //#elif defined (__SSE4_1__) // we demote this to SSE2, MacOSX code compiles with SSE41 by default with XCode 11 |
39 | //# define isa sse41 |
40 | //# define ISA SSE41 |
41 | //# define ISA_STR "SSE4.1" |
42 | //#elif defined(__SSSE3__) // we demote this to SSE2, MacOSX code compiles with SSSE3 by default with ICC |
43 | //# define isa ssse3 |
44 | //# define ISA SSSE3 |
45 | //# define ISA_STR "SSSE3" |
46 | //#elif defined(__SSE3__) // we demote this to SSE2, MacOSX code compiles with SSE3 by default with clang |
47 | //# define isa sse3 |
48 | //# define ISA SSE3 |
49 | //# define ISA_STR "SSE3" |
50 | #elif defined(__SSE2__) || defined(__SSE3__) || defined(__SSSE3__) |
51 | # define isa sse2 |
52 | # define ISA SSE2 |
53 | # define ISA_STR "SSE2" |
54 | #elif defined(__SSE__) |
55 | # define isa sse |
56 | # define ISA SSE |
57 | # define ISA_STR "SSE" |
58 | #elif defined(__ARM_NEON) |
59 | // NOTE(LTE): Use sse2 for `isa` for the compatibility at the moment. |
60 | #define isa sse2 |
61 | #define ISA NEON |
62 | #define ISA_STR "NEON" |
63 | #else |
64 | #error Unknown ISA |
65 | #endif |
66 | |
67 | namespace embree |
68 | { |
69 | enum class CPU |
70 | { |
71 | XEON_ICE_LAKE, |
72 | CORE_ICE_LAKE, |
73 | CORE_TIGER_LAKE, |
74 | CORE_COMET_LAKE, |
75 | CORE_CANNON_LAKE, |
76 | CORE_KABY_LAKE, |
77 | XEON_SKY_LAKE, |
78 | CORE_SKY_LAKE, |
79 | XEON_PHI_KNIGHTS_MILL, |
80 | XEON_PHI_KNIGHTS_LANDING, |
81 | XEON_BROADWELL, |
82 | CORE_BROADWELL, |
83 | XEON_HASWELL, |
84 | CORE_HASWELL, |
85 | XEON_IVY_BRIDGE, |
86 | CORE_IVY_BRIDGE, |
87 | SANDY_BRIDGE, |
88 | NEHALEM, |
89 | CORE2, |
90 | CORE1, |
91 | ARM, |
92 | UNKNOWN, |
93 | }; |
94 | |
95 | /*! get the full path to the running executable */ |
96 | std::string getExecutableFileName(); |
97 | |
98 | /*! return platform name */ |
99 | std::string getPlatformName(); |
100 | |
101 | /*! get the full name of the compiler */ |
102 | std::string getCompilerName(); |
103 | |
104 | /*! return the name of the CPU */ |
105 | std::string getCPUVendor(); |
106 | |
107 | /*! get microprocessor model */ |
108 | CPU getCPUModel(); |
109 | |
110 | /*! converts CPU model into string */ |
111 | std::string stringOfCPUModel(CPU model); |
112 | |
113 | /*! CPU features */ |
114 | static const int CPU_FEATURE_SSE = 1 << 0; |
115 | static const int CPU_FEATURE_SSE2 = 1 << 1; |
116 | static const int CPU_FEATURE_SSE3 = 1 << 2; |
117 | static const int CPU_FEATURE_SSSE3 = 1 << 3; |
118 | static const int CPU_FEATURE_SSE41 = 1 << 4; |
119 | static const int CPU_FEATURE_SSE42 = 1 << 5; |
120 | static const int CPU_FEATURE_POPCNT = 1 << 6; |
121 | static const int CPU_FEATURE_AVX = 1 << 7; |
122 | static const int CPU_FEATURE_F16C = 1 << 8; |
123 | static const int CPU_FEATURE_RDRAND = 1 << 9; |
124 | static const int CPU_FEATURE_AVX2 = 1 << 10; |
125 | static const int CPU_FEATURE_FMA3 = 1 << 11; |
126 | static const int CPU_FEATURE_LZCNT = 1 << 12; |
127 | static const int CPU_FEATURE_BMI1 = 1 << 13; |
128 | static const int CPU_FEATURE_BMI2 = 1 << 14; |
129 | static const int CPU_FEATURE_AVX512F = 1 << 16; |
130 | static const int CPU_FEATURE_AVX512DQ = 1 << 17; |
131 | static const int CPU_FEATURE_AVX512PF = 1 << 18; |
132 | static const int CPU_FEATURE_AVX512ER = 1 << 19; |
133 | static const int CPU_FEATURE_AVX512CD = 1 << 20; |
134 | static const int CPU_FEATURE_AVX512BW = 1 << 21; |
135 | static const int CPU_FEATURE_AVX512VL = 1 << 22; |
136 | static const int CPU_FEATURE_AVX512IFMA = 1 << 23; |
137 | static const int CPU_FEATURE_AVX512VBMI = 1 << 24; |
138 | static const int CPU_FEATURE_XMM_ENABLED = 1 << 25; |
139 | static const int CPU_FEATURE_YMM_ENABLED = 1 << 26; |
140 | static const int CPU_FEATURE_ZMM_ENABLED = 1 << 27; |
141 | static const int CPU_FEATURE_NEON = 1 << 28; |
142 | static const int CPU_FEATURE_NEON_2X = 1 << 29; |
143 | |
144 | /*! get CPU features */ |
145 | int getCPUFeatures(); |
146 | |
147 | /*! convert CPU features into a string */ |
148 | std::string stringOfCPUFeatures(int features); |
149 | |
150 | /*! creates a string of all supported targets that are supported */ |
151 | std::string supportedTargetList (int isa); |
152 | |
153 | /*! ISAs */ |
154 | static const int SSE = CPU_FEATURE_SSE | CPU_FEATURE_XMM_ENABLED; |
155 | static const int SSE2 = SSE | CPU_FEATURE_SSE2; |
156 | static const int SSE3 = SSE2 | CPU_FEATURE_SSE3; |
157 | static const int SSSE3 = SSE3 | CPU_FEATURE_SSSE3; |
158 | static const int SSE41 = SSSE3 | CPU_FEATURE_SSE41; |
159 | static const int SSE42 = SSE41 | CPU_FEATURE_SSE42 | CPU_FEATURE_POPCNT; |
160 | static const int AVX = SSE42 | CPU_FEATURE_AVX | CPU_FEATURE_YMM_ENABLED; |
161 | static const int AVXI = AVX | CPU_FEATURE_F16C | CPU_FEATURE_RDRAND; |
162 | static const int AVX2 = AVXI | CPU_FEATURE_AVX2 | CPU_FEATURE_FMA3 | CPU_FEATURE_BMI1 | CPU_FEATURE_BMI2 | CPU_FEATURE_LZCNT; |
163 | static const int AVX512 = AVX2 | CPU_FEATURE_AVX512F | CPU_FEATURE_AVX512DQ | CPU_FEATURE_AVX512CD | CPU_FEATURE_AVX512BW | CPU_FEATURE_AVX512VL | CPU_FEATURE_ZMM_ENABLED; |
164 | static const int NEON = CPU_FEATURE_NEON | CPU_FEATURE_SSE | CPU_FEATURE_SSE2; |
165 | static const int NEON_2X = CPU_FEATURE_NEON_2X | AVX2; |
166 | |
167 | /*! converts ISA bitvector into a string */ |
168 | std::string stringOfISA(int features); |
169 | |
170 | /*! return the number of logical threads of the system */ |
171 | unsigned int getNumberOfLogicalThreads(); |
172 | |
173 | /*! returns the size of the terminal window in characters */ |
174 | int getTerminalWidth(); |
175 | |
176 | /*! returns performance counter in seconds */ |
177 | double getSeconds(); |
178 | |
179 | /*! sleeps the specified number of seconds */ |
180 | void sleepSeconds(double t); |
181 | |
182 | /*! returns virtual address space occupied by process */ |
183 | size_t getVirtualMemoryBytes(); |
184 | |
185 | /*! returns resident memory required by process */ |
186 | size_t getResidentMemoryBytes(); |
187 | } |
188 | |