| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  | // Copyright 2009-2021 Intel Corporation
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | // SPDX-License-Identifier: Apache-2.0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define CACHELINE_SIZE 64
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(PAGE_SIZE)
 | 
					
						
							|  |  |  |   #define PAGE_SIZE 4096
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PAGE_SIZE_2M (2*1024*1024)
 | 
					
						
							|  |  |  | #define PAGE_SIZE_4K (4*1024)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "platform.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* define isa namespace and ISA bitvector */ | 
					
						
							|  |  |  | #if defined (__AVX512VL__)
 | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  | #  define isa avx512
 | 
					
						
							|  |  |  | #  define ISA AVX512
 | 
					
						
							|  |  |  | #  define ISA_STR "AVX512"
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | #elif defined (__AVX2__)
 | 
					
						
							|  |  |  | #  define isa avx2
 | 
					
						
							|  |  |  | #  define ISA AVX2
 | 
					
						
							|  |  |  | #  define ISA_STR "AVX2"
 | 
					
						
							|  |  |  | #elif defined(__AVXI__)
 | 
					
						
							|  |  |  | #  define isa avxi
 | 
					
						
							|  |  |  | #  define ISA AVXI
 | 
					
						
							|  |  |  | #  define ISA_STR "AVXI"
 | 
					
						
							|  |  |  | #elif defined(__AVX__)
 | 
					
						
							|  |  |  | #  define isa avx
 | 
					
						
							|  |  |  | #  define ISA AVX
 | 
					
						
							|  |  |  | #  define ISA_STR "AVX"
 | 
					
						
							|  |  |  | #elif defined (__SSE4_2__)
 | 
					
						
							|  |  |  | #  define isa sse42
 | 
					
						
							|  |  |  | #  define ISA SSE42
 | 
					
						
							|  |  |  | #  define ISA_STR "SSE4.2"
 | 
					
						
							|  |  |  | //#elif defined (__SSE4_1__) //  we demote this to SSE2, MacOSX code compiles with SSE41 by default with XCode 11
 | 
					
						
							|  |  |  | //#  define isa sse41
 | 
					
						
							|  |  |  | //#  define ISA SSE41
 | 
					
						
							|  |  |  | //#  define ISA_STR "SSE4.1"
 | 
					
						
							|  |  |  | //#elif defined(__SSSE3__) // we demote this to SSE2, MacOSX code compiles with SSSE3 by default with ICC
 | 
					
						
							|  |  |  | //#  define isa ssse3
 | 
					
						
							|  |  |  | //#  define ISA SSSE3
 | 
					
						
							|  |  |  | //#  define ISA_STR "SSSE3"
 | 
					
						
							|  |  |  | //#elif defined(__SSE3__) // we demote this to SSE2, MacOSX code compiles with SSE3 by default with clang
 | 
					
						
							|  |  |  | //#  define isa sse3
 | 
					
						
							|  |  |  | //#  define ISA SSE3
 | 
					
						
							|  |  |  | //#  define ISA_STR "SSE3"
 | 
					
						
							|  |  |  | #elif defined(__SSE2__) || defined(__SSE3__) || defined(__SSSE3__)
 | 
					
						
							|  |  |  | #  define isa sse2
 | 
					
						
							|  |  |  | #  define ISA SSE2
 | 
					
						
							|  |  |  | #  define ISA_STR "SSE2"
 | 
					
						
							|  |  |  | #elif defined(__SSE__)
 | 
					
						
							|  |  |  | #  define isa sse
 | 
					
						
							|  |  |  | #  define ISA SSE
 | 
					
						
							|  |  |  | #  define ISA_STR "SSE"
 | 
					
						
							| 
									
										
										
										
											2022-11-24 11:45:59 -03:00
										 |  |  | #elif defined(__ARM_NEON)
 | 
					
						
							|  |  |  | // NOTE(LTE): Use sse2 for `isa` for the compatibility at the moment.
 | 
					
						
							|  |  |  | #define isa sse2
 | 
					
						
							|  |  |  | #define ISA NEON
 | 
					
						
							|  |  |  | #define ISA_STR "NEON"
 | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | #error Unknown ISA
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace embree | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   enum class CPU | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     XEON_ICE_LAKE, | 
					
						
							|  |  |  |     CORE_ICE_LAKE, | 
					
						
							|  |  |  |     CORE_TIGER_LAKE, | 
					
						
							|  |  |  |     CORE_COMET_LAKE, | 
					
						
							|  |  |  |     CORE_CANNON_LAKE, | 
					
						
							|  |  |  |     CORE_KABY_LAKE, | 
					
						
							|  |  |  |     XEON_SKY_LAKE, | 
					
						
							|  |  |  |     CORE_SKY_LAKE, | 
					
						
							|  |  |  |     XEON_PHI_KNIGHTS_MILL, | 
					
						
							|  |  |  |     XEON_PHI_KNIGHTS_LANDING, | 
					
						
							|  |  |  |     XEON_BROADWELL, | 
					
						
							|  |  |  |     CORE_BROADWELL, | 
					
						
							|  |  |  |     XEON_HASWELL, | 
					
						
							|  |  |  |     CORE_HASWELL, | 
					
						
							|  |  |  |     XEON_IVY_BRIDGE, | 
					
						
							|  |  |  |     CORE_IVY_BRIDGE, | 
					
						
							|  |  |  |     SANDY_BRIDGE, | 
					
						
							|  |  |  |     NEHALEM, | 
					
						
							|  |  |  |     CORE2, | 
					
						
							|  |  |  |     CORE1, | 
					
						
							|  |  |  |     ARM, | 
					
						
							|  |  |  |     UNKNOWN, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   /*! get the full path to the running executable */ | 
					
						
							|  |  |  |   std::string getExecutableFileName(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! return platform name */ | 
					
						
							|  |  |  |   std::string getPlatformName(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! get the full name of the compiler */ | 
					
						
							|  |  |  |   std::string getCompilerName(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! return the name of the CPU */ | 
					
						
							|  |  |  |   std::string getCPUVendor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! get microprocessor model */ | 
					
						
							|  |  |  |   CPU getCPUModel();  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! converts CPU model into string */ | 
					
						
							|  |  |  |   std::string stringOfCPUModel(CPU model); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! CPU features */ | 
					
						
							|  |  |  |   static const int CPU_FEATURE_SSE    = 1 << 0; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_SSE2   = 1 << 1; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_SSE3   = 1 << 2; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_SSSE3  = 1 << 3; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_SSE41  = 1 << 4; | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   static const int CPU_FEATURE_SSE42  = 1 << 5;  | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   static const int CPU_FEATURE_POPCNT = 1 << 6; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX    = 1 << 7; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_F16C   = 1 << 8; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_RDRAND = 1 << 9; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX2   = 1 << 10; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_FMA3   = 1 << 11; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_LZCNT  = 1 << 12; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_BMI1   = 1 << 13; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_BMI2   = 1 << 14; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512F = 1 << 16; | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   static const int CPU_FEATURE_AVX512DQ = 1 << 17;     | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   static const int CPU_FEATURE_AVX512PF = 1 << 18; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512ER = 1 << 19; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512CD = 1 << 20; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512BW = 1 << 21; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512VL = 1 << 22; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512IFMA = 1 << 23; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_AVX512VBMI = 1 << 24; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_XMM_ENABLED = 1 << 25; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_YMM_ENABLED = 1 << 26; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_ZMM_ENABLED = 1 << 27; | 
					
						
							| 
									
										
										
										
											2022-11-24 11:45:59 -03:00
										 |  |  |   static const int CPU_FEATURE_NEON = 1 << 28; | 
					
						
							|  |  |  |   static const int CPU_FEATURE_NEON_2X = 1 << 29; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   /*! get CPU features */ | 
					
						
							|  |  |  |   int getCPUFeatures(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! convert CPU features into a string */ | 
					
						
							|  |  |  |   std::string stringOfCPUFeatures(int features); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! creates a string of all supported targets that are supported */ | 
					
						
							|  |  |  |   std::string supportedTargetList (int isa); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! ISAs */ | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   static const int SSE    = CPU_FEATURE_SSE | CPU_FEATURE_XMM_ENABLED;  | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   static const int SSE2   = SSE | CPU_FEATURE_SSE2; | 
					
						
							|  |  |  |   static const int SSE3   = SSE2 | CPU_FEATURE_SSE3; | 
					
						
							|  |  |  |   static const int SSSE3  = SSE3 | CPU_FEATURE_SSSE3; | 
					
						
							|  |  |  |   static const int SSE41  = SSSE3 | CPU_FEATURE_SSE41; | 
					
						
							|  |  |  |   static const int SSE42  = SSE41 | CPU_FEATURE_SSE42 | CPU_FEATURE_POPCNT; | 
					
						
							|  |  |  |   static const int AVX    = SSE42 | CPU_FEATURE_AVX | CPU_FEATURE_YMM_ENABLED; | 
					
						
							|  |  |  |   static const int AVXI   = AVX | CPU_FEATURE_F16C | CPU_FEATURE_RDRAND; | 
					
						
							|  |  |  |   static const int AVX2   = AVXI | CPU_FEATURE_AVX2 | CPU_FEATURE_FMA3 | CPU_FEATURE_BMI1 | CPU_FEATURE_BMI2 | CPU_FEATURE_LZCNT; | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   static const int AVX512 = AVX2 | CPU_FEATURE_AVX512F | CPU_FEATURE_AVX512DQ | CPU_FEATURE_AVX512CD | CPU_FEATURE_AVX512BW | CPU_FEATURE_AVX512VL | CPU_FEATURE_ZMM_ENABLED; | 
					
						
							| 
									
										
										
										
											2022-11-24 11:45:59 -03:00
										 |  |  |   static const int NEON = CPU_FEATURE_NEON | CPU_FEATURE_SSE | CPU_FEATURE_SSE2; | 
					
						
							|  |  |  |   static const int NEON_2X = CPU_FEATURE_NEON_2X | AVX2; | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /*! converts ISA bitvector into a string */ | 
					
						
							|  |  |  |   std::string stringOfISA(int features); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! return the number of logical threads of the system */ | 
					
						
							|  |  |  |   unsigned int getNumberOfLogicalThreads(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! returns the size of the terminal window in characters */ | 
					
						
							|  |  |  |   int getTerminalWidth(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! returns performance counter in seconds */ | 
					
						
							|  |  |  |   double getSeconds(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! sleeps the specified number of seconds */ | 
					
						
							|  |  |  |   void sleepSeconds(double t); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! returns virtual address space occupied by process */ | 
					
						
							|  |  |  |   size_t getVirtualMemoryBytes(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*! returns resident memory required by process */ | 
					
						
							|  |  |  |   size_t getResidentMemoryBytes(); | 
					
						
							|  |  |  | } |