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 | #else |
59 | #error Unknown ISA |
60 | #endif |
61 | |
62 | namespace embree |
63 | { |
64 | enum class CPU |
65 | { |
66 | XEON_ICE_LAKE, |
67 | CORE_ICE_LAKE, |
68 | CORE_TIGER_LAKE, |
69 | CORE_COMET_LAKE, |
70 | CORE_CANNON_LAKE, |
71 | CORE_KABY_LAKE, |
72 | XEON_SKY_LAKE, |
73 | CORE_SKY_LAKE, |
74 | XEON_PHI_KNIGHTS_MILL, |
75 | XEON_PHI_KNIGHTS_LANDING, |
76 | XEON_BROADWELL, |
77 | CORE_BROADWELL, |
78 | XEON_HASWELL, |
79 | CORE_HASWELL, |
80 | XEON_IVY_BRIDGE, |
81 | CORE_IVY_BRIDGE, |
82 | SANDY_BRIDGE, |
83 | NEHALEM, |
84 | CORE2, |
85 | CORE1, |
86 | ARM, |
87 | UNKNOWN, |
88 | }; |
89 | |
90 | /*! get the full path to the running executable */ |
91 | std::string getExecutableFileName(); |
92 | |
93 | /*! return platform name */ |
94 | std::string getPlatformName(); |
95 | |
96 | /*! get the full name of the compiler */ |
97 | std::string getCompilerName(); |
98 | |
99 | /*! return the name of the CPU */ |
100 | std::string getCPUVendor(); |
101 | |
102 | /*! get microprocessor model */ |
103 | CPU getCPUModel(); |
104 | |
105 | /*! converts CPU model into string */ |
106 | std::string stringOfCPUModel(CPU model); |
107 | |
108 | /*! CPU features */ |
109 | static const int CPU_FEATURE_SSE = 1 << 0; |
110 | static const int CPU_FEATURE_SSE2 = 1 << 1; |
111 | static const int CPU_FEATURE_SSE3 = 1 << 2; |
112 | static const int CPU_FEATURE_SSSE3 = 1 << 3; |
113 | static const int CPU_FEATURE_SSE41 = 1 << 4; |
114 | static const int CPU_FEATURE_SSE42 = 1 << 5; |
115 | static const int CPU_FEATURE_POPCNT = 1 << 6; |
116 | static const int CPU_FEATURE_AVX = 1 << 7; |
117 | static const int CPU_FEATURE_F16C = 1 << 8; |
118 | static const int CPU_FEATURE_RDRAND = 1 << 9; |
119 | static const int CPU_FEATURE_AVX2 = 1 << 10; |
120 | static const int CPU_FEATURE_FMA3 = 1 << 11; |
121 | static const int CPU_FEATURE_LZCNT = 1 << 12; |
122 | static const int CPU_FEATURE_BMI1 = 1 << 13; |
123 | static const int CPU_FEATURE_BMI2 = 1 << 14; |
124 | static const int CPU_FEATURE_AVX512F = 1 << 16; |
125 | static const int CPU_FEATURE_AVX512DQ = 1 << 17; |
126 | static const int CPU_FEATURE_AVX512PF = 1 << 18; |
127 | static const int CPU_FEATURE_AVX512ER = 1 << 19; |
128 | static const int CPU_FEATURE_AVX512CD = 1 << 20; |
129 | static const int CPU_FEATURE_AVX512BW = 1 << 21; |
130 | static const int CPU_FEATURE_AVX512VL = 1 << 22; |
131 | static const int CPU_FEATURE_AVX512IFMA = 1 << 23; |
132 | static const int CPU_FEATURE_AVX512VBMI = 1 << 24; |
133 | static const int CPU_FEATURE_XMM_ENABLED = 1 << 25; |
134 | static const int CPU_FEATURE_YMM_ENABLED = 1 << 26; |
135 | static const int CPU_FEATURE_ZMM_ENABLED = 1 << 27; |
136 | |
137 | /*! get CPU features */ |
138 | int getCPUFeatures(); |
139 | |
140 | /*! convert CPU features into a string */ |
141 | std::string stringOfCPUFeatures(int features); |
142 | |
143 | /*! creates a string of all supported targets that are supported */ |
144 | std::string supportedTargetList (int isa); |
145 | |
146 | /*! ISAs */ |
147 | static const int SSE = CPU_FEATURE_SSE | CPU_FEATURE_XMM_ENABLED; |
148 | static const int SSE2 = SSE | CPU_FEATURE_SSE2; |
149 | static const int SSE3 = SSE2 | CPU_FEATURE_SSE3; |
150 | static const int SSSE3 = SSE3 | CPU_FEATURE_SSSE3; |
151 | static const int SSE41 = SSSE3 | CPU_FEATURE_SSE41; |
152 | static const int SSE42 = SSE41 | CPU_FEATURE_SSE42 | CPU_FEATURE_POPCNT; |
153 | static const int AVX = SSE42 | CPU_FEATURE_AVX | CPU_FEATURE_YMM_ENABLED; |
154 | static const int AVXI = AVX | CPU_FEATURE_F16C | CPU_FEATURE_RDRAND; |
155 | static const int AVX2 = AVXI | CPU_FEATURE_AVX2 | CPU_FEATURE_FMA3 | CPU_FEATURE_BMI1 | CPU_FEATURE_BMI2 | CPU_FEATURE_LZCNT; |
156 | static const int AVX512 = AVX2 | CPU_FEATURE_AVX512F | CPU_FEATURE_AVX512DQ | CPU_FEATURE_AVX512CD | CPU_FEATURE_AVX512BW | CPU_FEATURE_AVX512VL | CPU_FEATURE_ZMM_ENABLED; |
157 | |
158 | /*! converts ISA bitvector into a string */ |
159 | std::string stringOfISA(int features); |
160 | |
161 | /*! return the number of logical threads of the system */ |
162 | unsigned int getNumberOfLogicalThreads(); |
163 | |
164 | /*! returns the size of the terminal window in characters */ |
165 | int getTerminalWidth(); |
166 | |
167 | /*! returns performance counter in seconds */ |
168 | double getSeconds(); |
169 | |
170 | /*! sleeps the specified number of seconds */ |
171 | void sleepSeconds(double t); |
172 | |
173 | /*! returns virtual address space occupied by process */ |
174 | size_t getVirtualMemoryBytes(); |
175 | |
176 | /*! returns resident memory required by process */ |
177 | size_t getResidentMemoryBytes(); |
178 | } |
179 | |