summaryrefslogtreecommitdiff
path: root/thirdparty/embree-aarch64/common/sys/sysinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree-aarch64/common/sys/sysinfo.cpp')
-rw-r--r--thirdparty/embree-aarch64/common/sys/sysinfo.cpp676
1 files changed, 0 insertions, 676 deletions
diff --git a/thirdparty/embree-aarch64/common/sys/sysinfo.cpp b/thirdparty/embree-aarch64/common/sys/sysinfo.cpp
deleted file mode 100644
index 1d11436770..0000000000
--- a/thirdparty/embree-aarch64/common/sys/sysinfo.cpp
+++ /dev/null
@@ -1,676 +0,0 @@
-// Copyright 2009-2020 Intel Corporation
-// SPDX-License-Identifier: Apache-2.0
-
-#include "sysinfo.h"
-#include "intrinsics.h"
-#include "string.h"
-#include "ref.h"
-#if defined(__FREEBSD__)
-#include <sys/cpuset.h>
-#include <pthread_np.h>
-typedef cpuset_t cpu_set_t;
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-/// All Platforms
-////////////////////////////////////////////////////////////////////////////////
-
-namespace embree
-{
- NullTy null;
-
- std::string getPlatformName()
- {
-#if defined(__LINUX__) && defined(__ANDROID__) && defined(__aarch64__) && defined(__ARM_NEON)
- return "Android Linux (aarch64 / arm64)";
-#elif defined(__LINUX__) && defined(__ANDROID__) && defined(__X86_64__)
- return "Android Linux (x64)";
-#elif defined(__LINUX__) && defined(__ANDROID__) && (defined(_X86_) || defined(__X86__) || defined(_M_IX86))
- return "Android Linux (x86)";
-#elif defined(__LINUX__) && !defined(__X86_64__)
- return "Linux (32bit)";
-#elif defined(__LINUX__) && defined(__X86_64__)
- return "Linux (64bit)";
-#elif defined(__FREEBSD__) && !defined(__X86_64__)
- return "FreeBSD (32bit)";
-#elif defined(__FREEBSD__) && defined(__X86_64__)
- return "FreeBSD (64bit)";
-#elif defined(__CYGWIN__) && !defined(__X86_64__)
- return "Cygwin (32bit)";
-#elif defined(__CYGWIN__) && defined(__X86_64__)
- return "Cygwin (64bit)";
-#elif defined(__WIN32__) && !defined(__X86_64__)
- return "Windows (32bit)";
-#elif defined(__WIN32__) && defined(__X86_64__)
- return "Windows (64bit)";
-#elif defined(TARGET_IPHONE_SIMULATOR) && defined(__X86_64__)
- return "iOS Simulator (x64)";
-#elif defined(TARGET_OS_IPHONE) && defined(__aarch64__) && defined(__ARM_NEON)
- return "iOS (aarch64 / arm64)";
-#elif defined(__MACOSX__) && !defined(__X86_64__)
- return "Mac OS X (32bit)";
-#elif defined(__MACOSX__) && defined(__X86_64__)
- return "Mac OS X (64bit)";
-#elif defined(__UNIX__) && defined(__aarch64__)
- return "Unix (aarch64)";
-#elif defined(__UNIX__) && !defined(__X86_64__)
- return "Unix (32bit)";
-#elif defined(__UNIX__) && defined(__X86_64__)
- return "Unix (64bit)";
-#else
- return "Unknown";
-#endif
- }
-
- std::string getCompilerName()
- {
-#if defined(__INTEL_COMPILER)
- int icc_mayor = __INTEL_COMPILER / 100 % 100;
- int icc_minor = __INTEL_COMPILER % 100;
- std::string version = "Intel Compiler ";
- version += toString(icc_mayor);
- version += "." + toString(icc_minor);
-#if defined(__INTEL_COMPILER_UPDATE)
- version += "." + toString(__INTEL_COMPILER_UPDATE);
-#endif
- return version;
-#elif defined(__clang__)
- return "CLANG " __clang_version__;
-#elif defined (__GNUC__)
- return "GCC " __VERSION__;
-#elif defined(_MSC_VER)
- std::string version = toString(_MSC_FULL_VER);
- version.insert(4,".");
- version.insert(9,".");
- version.insert(2,".");
- return "Visual C++ Compiler " + version;
-#else
- return "Unknown Compiler";
-#endif
- }
-
- std::string getCPUVendor()
- {
- int cpuinfo[4];
- __cpuid (cpuinfo, 0);
- int name[4];
- name[0] = cpuinfo[1];
- name[1] = cpuinfo[3];
- name[2] = cpuinfo[2];
- name[3] = 0;
- return (char*)name;
- }
-
- CPU getCPUModel()
- {
- if (getCPUVendor() != "GenuineIntel")
- return CPU::UNKNOWN;
-
- int out[4];
- __cpuid(out, 0);
- if (out[0] < 1) return CPU::UNKNOWN;
- __cpuid(out, 1);
-
- /* please see CPUID documentation for these formulas */
- uint32_t family_ID = (out[0] >> 8) & 0x0F;
- uint32_t extended_family_ID = (out[0] >> 20) & 0xFF;
-
- uint32_t model_ID = (out[0] >> 4) & 0x0F;
- uint32_t extended_model_ID = (out[0] >> 16) & 0x0F;
-
- uint32_t DisplayFamily = family_ID;
- if (family_ID == 0x0F)
- DisplayFamily += extended_family_ID;
-
- uint32_t DisplayModel = model_ID;
- if (family_ID == 0x06 || family_ID == 0x0F)
- DisplayModel += extended_model_ID << 4;
-
- uint32_t DisplayFamily_DisplayModel = (DisplayFamily << 8) + (DisplayModel << 0);
-
- // Data from IntelĀ® 64 and IA-32 Architectures, Volume 4, Chapter 2, Table 2-1 (CPUID Signature Values of DisplayFamily_DisplayModel)
- if (DisplayFamily_DisplayModel == 0x067D) return CPU::CORE_ICE_LAKE;
- if (DisplayFamily_DisplayModel == 0x067E) return CPU::CORE_ICE_LAKE;
- if (DisplayFamily_DisplayModel == 0x068C) return CPU::CORE_TIGER_LAKE;
- if (DisplayFamily_DisplayModel == 0x06A5) return CPU::CORE_COMET_LAKE;
- if (DisplayFamily_DisplayModel == 0x06A6) return CPU::CORE_COMET_LAKE;
- if (DisplayFamily_DisplayModel == 0x0666) return CPU::CORE_CANNON_LAKE;
- if (DisplayFamily_DisplayModel == 0x068E) return CPU::CORE_KABY_LAKE;
- if (DisplayFamily_DisplayModel == 0x069E) return CPU::CORE_KABY_LAKE;
- if (DisplayFamily_DisplayModel == 0x066A) return CPU::XEON_ICE_LAKE;
- if (DisplayFamily_DisplayModel == 0x066C) return CPU::XEON_ICE_LAKE;
- if (DisplayFamily_DisplayModel == 0x0655) return CPU::XEON_SKY_LAKE;
- if (DisplayFamily_DisplayModel == 0x064E) return CPU::CORE_SKY_LAKE;
- if (DisplayFamily_DisplayModel == 0x065E) return CPU::CORE_SKY_LAKE;
- if (DisplayFamily_DisplayModel == 0x0656) return CPU::XEON_BROADWELL;
- if (DisplayFamily_DisplayModel == 0x064F) return CPU::XEON_BROADWELL;
- if (DisplayFamily_DisplayModel == 0x0647) return CPU::CORE_BROADWELL;
- if (DisplayFamily_DisplayModel == 0x063D) return CPU::CORE_BROADWELL;
- if (DisplayFamily_DisplayModel == 0x063F) return CPU::XEON_HASWELL;
- if (DisplayFamily_DisplayModel == 0x063C) return CPU::CORE_HASWELL;
- if (DisplayFamily_DisplayModel == 0x0645) return CPU::CORE_HASWELL;
- if (DisplayFamily_DisplayModel == 0x0646) return CPU::CORE_HASWELL;
- if (DisplayFamily_DisplayModel == 0x063E) return CPU::XEON_IVY_BRIDGE;
- if (DisplayFamily_DisplayModel == 0x063A) return CPU::CORE_IVY_BRIDGE;
- if (DisplayFamily_DisplayModel == 0x062D) return CPU::SANDY_BRIDGE;
- if (DisplayFamily_DisplayModel == 0x062F) return CPU::SANDY_BRIDGE;
- if (DisplayFamily_DisplayModel == 0x062A) return CPU::SANDY_BRIDGE;
- if (DisplayFamily_DisplayModel == 0x062E) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x0625) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x062C) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x061E) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x061F) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x061A) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x061D) return CPU::NEHALEM;
- if (DisplayFamily_DisplayModel == 0x0617) return CPU::CORE2;
- if (DisplayFamily_DisplayModel == 0x060F) return CPU::CORE2;
- if (DisplayFamily_DisplayModel == 0x060E) return CPU::CORE1;
-
- if (DisplayFamily_DisplayModel == 0x0685) return CPU::XEON_PHI_KNIGHTS_MILL;
- if (DisplayFamily_DisplayModel == 0x0657) return CPU::XEON_PHI_KNIGHTS_LANDING;
-
- return CPU::UNKNOWN;
- }
-
- std::string stringOfCPUModel(CPU model)
- {
- switch (model) {
- case CPU::XEON_ICE_LAKE : return "Xeon Ice Lake";
- case CPU::CORE_ICE_LAKE : return "Core Ice Lake";
- case CPU::CORE_TIGER_LAKE : return "Core Tiger Lake";
- case CPU::CORE_COMET_LAKE : return "Core Comet Lake";
- case CPU::CORE_CANNON_LAKE : return "Core Cannon Lake";
- case CPU::CORE_KABY_LAKE : return "Core Kaby Lake";
- case CPU::XEON_SKY_LAKE : return "Xeon Sky Lake";
- case CPU::CORE_SKY_LAKE : return "Core Sky Lake";
- case CPU::XEON_PHI_KNIGHTS_MILL : return "Xeon Phi Knights Mill";
- case CPU::XEON_PHI_KNIGHTS_LANDING: return "Xeon Phi Knights Landing";
- case CPU::XEON_BROADWELL : return "Xeon Broadwell";
- case CPU::CORE_BROADWELL : return "Core Broadwell";
- case CPU::XEON_HASWELL : return "Xeon Haswell";
- case CPU::CORE_HASWELL : return "Core Haswell";
- case CPU::XEON_IVY_BRIDGE : return "Xeon Ivy Bridge";
- case CPU::CORE_IVY_BRIDGE : return "Core Ivy Bridge";
- case CPU::SANDY_BRIDGE : return "Sandy Bridge";
- case CPU::NEHALEM : return "Nehalem";
- case CPU::CORE2 : return "Core2";
- case CPU::CORE1 : return "Core";
- case CPU::ARM : return "Arm";
- case CPU::UNKNOWN : return "Unknown CPU";
- }
- return "Unknown CPU (error)";
- }
-
-#if !defined(__ARM_NEON)
- /* constants to access destination registers of CPUID instruction */
- static const int EAX = 0;
- static const int EBX = 1;
- static const int ECX = 2;
- static const int EDX = 3;
-
- /* cpuid[eax=1].ecx */
- static const int CPU_FEATURE_BIT_SSE3 = 1 << 0;
- static const int CPU_FEATURE_BIT_SSSE3 = 1 << 9;
- static const int CPU_FEATURE_BIT_FMA3 = 1 << 12;
- static const int CPU_FEATURE_BIT_SSE4_1 = 1 << 19;
- static const int CPU_FEATURE_BIT_SSE4_2 = 1 << 20;
- //static const int CPU_FEATURE_BIT_MOVBE = 1 << 22;
- static const int CPU_FEATURE_BIT_POPCNT = 1 << 23;
- //static const int CPU_FEATURE_BIT_XSAVE = 1 << 26;
- static const int CPU_FEATURE_BIT_OXSAVE = 1 << 27;
- static const int CPU_FEATURE_BIT_AVX = 1 << 28;
- static const int CPU_FEATURE_BIT_F16C = 1 << 29;
- static const int CPU_FEATURE_BIT_RDRAND = 1 << 30;
-
- /* cpuid[eax=1].edx */
- static const int CPU_FEATURE_BIT_SSE = 1 << 25;
- static const int CPU_FEATURE_BIT_SSE2 = 1 << 26;
-
- /* cpuid[eax=0x80000001].ecx */
- static const int CPU_FEATURE_BIT_LZCNT = 1 << 5;
-
- /* cpuid[eax=7,ecx=0].ebx */
- static const int CPU_FEATURE_BIT_BMI1 = 1 << 3;
- static const int CPU_FEATURE_BIT_AVX2 = 1 << 5;
- static const int CPU_FEATURE_BIT_BMI2 = 1 << 8;
- static const int CPU_FEATURE_BIT_AVX512F = 1 << 16; // AVX512F (foundation)
- static const int CPU_FEATURE_BIT_AVX512DQ = 1 << 17; // AVX512DQ (doubleword and quadword instructions)
- static const int CPU_FEATURE_BIT_AVX512PF = 1 << 26; // AVX512PF (prefetch gather/scatter instructions)
- static const int CPU_FEATURE_BIT_AVX512ER = 1 << 27; // AVX512ER (exponential and reciprocal instructions)
- static const int CPU_FEATURE_BIT_AVX512CD = 1 << 28; // AVX512CD (conflict detection instructions)
- static const int CPU_FEATURE_BIT_AVX512BW = 1 << 30; // AVX512BW (byte and word instructions)
- static const int CPU_FEATURE_BIT_AVX512VL = 1 << 31; // AVX512VL (vector length extensions)
- static const int CPU_FEATURE_BIT_AVX512IFMA = 1 << 21; // AVX512IFMA (integer fused multiple-add instructions)
-
- /* cpuid[eax=7,ecx=0].ecx */
- static const int CPU_FEATURE_BIT_AVX512VBMI = 1 << 1; // AVX512VBMI (vector bit manipulation instructions)
-#endif
-
-#if !defined(__ARM_NEON)
- __noinline int64_t get_xcr0()
- {
- // https://github.com/opencv/opencv/blob/master/modules/core/src/system.cpp#L466
-#if defined (__WIN32__) && defined(_XCR_XFEATURE_ENABLED_MASK)
- int64_t xcr0 = 0; // int64_t is workaround for compiler bug under VS2013, Win32
- xcr0 = _xgetbv(0);
- return xcr0;
-#else
- int xcr0 = 0;
- __asm__ ("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx" );
- return xcr0;
-#endif
- }
-#endif
-
- int getCPUFeatures()
- {
-#if defined(__ARM_NEON)
- int cpu_features = CPU_FEATURE_NEON|CPU_FEATURE_SSE|CPU_FEATURE_SSE2;
-#if defined(NEON_AVX2_EMULATION)
- cpu_features |= CPU_FEATURE_SSE3|CPU_FEATURE_SSSE3|CPU_FEATURE_SSE42;
- cpu_features |= CPU_FEATURE_XMM_ENABLED;
- cpu_features |= CPU_FEATURE_YMM_ENABLED;
- cpu_features |= CPU_FEATURE_SSE41 | CPU_FEATURE_RDRAND | CPU_FEATURE_F16C;
- cpu_features |= CPU_FEATURE_POPCNT;
- cpu_features |= CPU_FEATURE_AVX;
- cpu_features |= CPU_FEATURE_AVX2;
- cpu_features |= CPU_FEATURE_FMA3;
- cpu_features |= CPU_FEATURE_LZCNT;
- cpu_features |= CPU_FEATURE_BMI1;
- cpu_features |= CPU_FEATURE_BMI2;
- cpu_features |= CPU_FEATURE_NEON_2X;
-
-
-
-#endif
- return cpu_features;
-
-#else
- /* cache CPU features access */
- static int cpu_features = 0;
- if (cpu_features)
- return cpu_features;
-
- /* get number of CPUID leaves */
- int cpuid_leaf0[4];
- __cpuid(cpuid_leaf0, 0x00000000);
- unsigned nIds = cpuid_leaf0[EAX];
-
- /* get number of extended CPUID leaves */
- int cpuid_leafe[4];
- __cpuid(cpuid_leafe, 0x80000000);
- unsigned nExIds = cpuid_leafe[EAX];
-
- /* get CPUID leaves for EAX = 1,7, and 0x80000001 */
- int cpuid_leaf_1[4] = { 0,0,0,0 };
- int cpuid_leaf_7[4] = { 0,0,0,0 };
- int cpuid_leaf_e1[4] = { 0,0,0,0 };
- if (nIds >= 1) __cpuid (cpuid_leaf_1,0x00000001);
-#if _WIN32
-#if _MSC_VER && (_MSC_FULL_VER < 160040219)
-#else
- if (nIds >= 7) __cpuidex(cpuid_leaf_7,0x00000007,0);
-#endif
-#else
- if (nIds >= 7) __cpuid_count(cpuid_leaf_7,0x00000007,0);
-#endif
- if (nExIds >= 0x80000001) __cpuid(cpuid_leaf_e1,0x80000001);
-
- /* detect if OS saves XMM, YMM, and ZMM states */
- bool xmm_enabled = true;
- bool ymm_enabled = false;
- bool zmm_enabled = false;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_OXSAVE) {
- int64_t xcr0 = get_xcr0();
- xmm_enabled = ((xcr0 & 0x02) == 0x02); /* checks if xmm are enabled in XCR0 */
- ymm_enabled = xmm_enabled && ((xcr0 & 0x04) == 0x04); /* checks if ymm state are enabled in XCR0 */
- zmm_enabled = ymm_enabled && ((xcr0 & 0xE0) == 0xE0); /* checks if OPMASK state, upper 256-bit of ZMM0-ZMM15 and ZMM16-ZMM31 state are enabled in XCR0 */
- }
- if (xmm_enabled) cpu_features |= CPU_FEATURE_XMM_ENABLED;
- if (ymm_enabled) cpu_features |= CPU_FEATURE_YMM_ENABLED;
- if (zmm_enabled) cpu_features |= CPU_FEATURE_ZMM_ENABLED;
-
- if (cpuid_leaf_1[EDX] & CPU_FEATURE_BIT_SSE ) cpu_features |= CPU_FEATURE_SSE;
- if (cpuid_leaf_1[EDX] & CPU_FEATURE_BIT_SSE2 ) cpu_features |= CPU_FEATURE_SSE2;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_SSE3 ) cpu_features |= CPU_FEATURE_SSE3;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_SSSE3 ) cpu_features |= CPU_FEATURE_SSSE3;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_SSE4_1) cpu_features |= CPU_FEATURE_SSE41;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_SSE4_2) cpu_features |= CPU_FEATURE_SSE42;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_POPCNT) cpu_features |= CPU_FEATURE_POPCNT;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_AVX ) cpu_features |= CPU_FEATURE_AVX;
-
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_F16C ) cpu_features |= CPU_FEATURE_F16C;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_RDRAND) cpu_features |= CPU_FEATURE_RDRAND;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX2 ) cpu_features |= CPU_FEATURE_AVX2;
- if (cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_FMA3 ) cpu_features |= CPU_FEATURE_FMA3;
- if (cpuid_leaf_e1[ECX] & CPU_FEATURE_BIT_LZCNT) cpu_features |= CPU_FEATURE_LZCNT;
- if (cpuid_leaf_7 [EBX] & CPU_FEATURE_BIT_BMI1 ) cpu_features |= CPU_FEATURE_BMI1;
- if (cpuid_leaf_7 [EBX] & CPU_FEATURE_BIT_BMI2 ) cpu_features |= CPU_FEATURE_BMI2;
-
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512F ) cpu_features |= CPU_FEATURE_AVX512F;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512DQ ) cpu_features |= CPU_FEATURE_AVX512DQ;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512PF ) cpu_features |= CPU_FEATURE_AVX512PF;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512ER ) cpu_features |= CPU_FEATURE_AVX512ER;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512CD ) cpu_features |= CPU_FEATURE_AVX512CD;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512BW ) cpu_features |= CPU_FEATURE_AVX512BW;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512IFMA) cpu_features |= CPU_FEATURE_AVX512IFMA;
- if (cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512VL ) cpu_features |= CPU_FEATURE_AVX512VL;
- if (cpuid_leaf_7[ECX] & CPU_FEATURE_BIT_AVX512VBMI) cpu_features |= CPU_FEATURE_AVX512VBMI;
-
- return cpu_features;
-#endif
- }
-
- std::string stringOfCPUFeatures(int features)
- {
- std::string str;
- if (features & CPU_FEATURE_XMM_ENABLED) str += "XMM ";
- if (features & CPU_FEATURE_YMM_ENABLED) str += "YMM ";
- if (features & CPU_FEATURE_ZMM_ENABLED) str += "ZMM ";
- if (features & CPU_FEATURE_SSE ) str += "SSE ";
- if (features & CPU_FEATURE_SSE2 ) str += "SSE2 ";
- if (features & CPU_FEATURE_SSE3 ) str += "SSE3 ";
- if (features & CPU_FEATURE_SSSE3 ) str += "SSSE3 ";
- if (features & CPU_FEATURE_SSE41 ) str += "SSE4.1 ";
- if (features & CPU_FEATURE_SSE42 ) str += "SSE4.2 ";
- if (features & CPU_FEATURE_POPCNT) str += "POPCNT ";
- if (features & CPU_FEATURE_AVX ) str += "AVX ";
- if (features & CPU_FEATURE_F16C ) str += "F16C ";
- if (features & CPU_FEATURE_RDRAND) str += "RDRAND ";
- if (features & CPU_FEATURE_AVX2 ) str += "AVX2 ";
- if (features & CPU_FEATURE_FMA3 ) str += "FMA3 ";
- if (features & CPU_FEATURE_LZCNT ) str += "LZCNT ";
- if (features & CPU_FEATURE_BMI1 ) str += "BMI1 ";
- if (features & CPU_FEATURE_BMI2 ) str += "BMI2 ";
- if (features & CPU_FEATURE_AVX512F) str += "AVX512F ";
- if (features & CPU_FEATURE_AVX512DQ) str += "AVX512DQ ";
- if (features & CPU_FEATURE_AVX512PF) str += "AVX512PF ";
- if (features & CPU_FEATURE_AVX512ER) str += "AVX512ER ";
- if (features & CPU_FEATURE_AVX512CD) str += "AVX512CD ";
- if (features & CPU_FEATURE_AVX512BW) str += "AVX512BW ";
- if (features & CPU_FEATURE_AVX512VL) str += "AVX512VL ";
- if (features & CPU_FEATURE_AVX512IFMA) str += "AVX512IFMA ";
- if (features & CPU_FEATURE_AVX512VBMI) str += "AVX512VBMI ";
- if (features & CPU_FEATURE_NEON) str += "NEON ";
- if (features & CPU_FEATURE_NEON_2X) str += "2xNEON ";
- return str;
- }
-
- std::string stringOfISA (int isa)
- {
- if (isa == SSE) return "SSE";
- if (isa == SSE2) return "SSE2";
- if (isa == SSE3) return "SSE3";
- if (isa == SSSE3) return "SSSE3";
- if (isa == SSE41) return "SSE4.1";
- if (isa == SSE42) return "SSE4.2";
- if (isa == AVX) return "AVX";
- if (isa == AVX2) return "AVX2";
- if (isa == AVX512KNL) return "AVX512KNL";
- if (isa == AVX512SKX) return "AVX512SKX";
- if (isa == NEON) return "NEON";
- if (isa == NEON_2X) return "2xNEON";
- return "UNKNOWN";
- }
-
- bool hasISA(int features, int isa) {
- return (features & isa) == isa;
- }
-
- std::string supportedTargetList (int features)
- {
- std::string v;
- if (hasISA(features,SSE)) v += "SSE ";
- if (hasISA(features,SSE2)) v += "SSE2 ";
- if (hasISA(features,SSE3)) v += "SSE3 ";
- if (hasISA(features,SSSE3)) v += "SSSE3 ";
- if (hasISA(features,SSE41)) v += "SSE4.1 ";
- if (hasISA(features,SSE42)) v += "SSE4.2 ";
- if (hasISA(features,AVX)) v += "AVX ";
- if (hasISA(features,AVXI)) v += "AVXI ";
- if (hasISA(features,AVX2)) v += "AVX2 ";
- if (hasISA(features,AVX512KNL)) v += "AVX512KNL ";
- if (hasISA(features,AVX512SKX)) v += "AVX512SKX ";
- if (hasISA(features,NEON)) v += "NEON ";
- if (hasISA(features,NEON_2X)) v += "2xNEON ";
- return v;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/// Windows Platform
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined(__WIN32__)
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <psapi.h>
-
-namespace embree
-{
- std::string getExecutableFileName() {
- char filename[1024];
- if (!GetModuleFileName(nullptr, filename, sizeof(filename)))
- return std::string();
- return std::string(filename);
- }
-
- unsigned int getNumberOfLogicalThreads()
- {
- static int nThreads = -1;
- if (nThreads != -1) return nThreads;
-
- typedef WORD (WINAPI *GetActiveProcessorGroupCountFunc)();
- typedef DWORD (WINAPI *GetActiveProcessorCountFunc)(WORD);
- HMODULE hlib = LoadLibrary("Kernel32");
- GetActiveProcessorGroupCountFunc pGetActiveProcessorGroupCount = (GetActiveProcessorGroupCountFunc)GetProcAddress(hlib, "GetActiveProcessorGroupCount");
- GetActiveProcessorCountFunc pGetActiveProcessorCount = (GetActiveProcessorCountFunc) GetProcAddress(hlib, "GetActiveProcessorCount");
-
- if (pGetActiveProcessorGroupCount && pGetActiveProcessorCount)
- {
- int groups = pGetActiveProcessorGroupCount();
- int totalProcessors = 0;
- for (int i = 0; i < groups; i++)
- totalProcessors += pGetActiveProcessorCount(i);
- nThreads = totalProcessors;
- }
- else
- {
- SYSTEM_INFO sysinfo;
- GetSystemInfo(&sysinfo);
- nThreads = sysinfo.dwNumberOfProcessors;
- }
- assert(nThreads);
- return nThreads;
- }
-
- int getTerminalWidth()
- {
- HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
- if (handle == INVALID_HANDLE_VALUE) return 80;
- CONSOLE_SCREEN_BUFFER_INFO info;
- memset(&info,0,sizeof(info));
- GetConsoleScreenBufferInfo(handle, &info);
- return info.dwSize.X;
- }
-
- double getSeconds()
- {
- LARGE_INTEGER freq, val;
- QueryPerformanceFrequency(&freq);
- QueryPerformanceCounter(&val);
- return (double)val.QuadPart / (double)freq.QuadPart;
- }
-
- void sleepSeconds(double t) {
- Sleep(DWORD(1000.0*t));
- }
-
- size_t getVirtualMemoryBytes()
- {
- PROCESS_MEMORY_COUNTERS info;
- GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
- return (size_t)info.QuotaPeakPagedPoolUsage;
- }
-
- size_t getResidentMemoryBytes()
- {
- PROCESS_MEMORY_COUNTERS info;
- GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
- return (size_t)info.WorkingSetSize;
- }
-}
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-/// Linux Platform
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined(__LINUX__)
-
-#include <stdio.h>
-#include <unistd.h>
-
-namespace embree
-{
- std::string getExecutableFileName()
- {
- std::string pid = "/proc/" + toString(getpid()) + "/exe";
- char buf[4096];
- memset(buf,0,sizeof(buf));
- if (readlink(pid.c_str(), buf, sizeof(buf)-1) == -1)
- return std::string();
- return std::string(buf);
- }
-
- size_t getVirtualMemoryBytes()
- {
- size_t virt, resident, shared;
- std::ifstream buffer("/proc/self/statm");
- buffer >> virt >> resident >> shared;
- return virt*sysconf(_SC_PAGE_SIZE);
- }
-
- size_t getResidentMemoryBytes()
- {
- size_t virt, resident, shared;
- std::ifstream buffer("/proc/self/statm");
- buffer >> virt >> resident >> shared;
- return resident*sysconf(_SC_PAGE_SIZE);
- }
-}
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-/// FreeBSD Platform
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined (__FreeBSD__)
-
-#include <sys/sysctl.h>
-
-namespace embree
-{
- std::string getExecutableFileName()
- {
- const int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
- char buf[4096];
- memset(buf,0,sizeof(buf));
- size_t len = sizeof(buf)-1;
- if (sysctl(mib, 4, buf, &len, 0x0, 0) == -1)
- return std::string();
- return std::string(buf);
- }
-
- size_t getVirtualMemoryBytes() {
- return 0;
- }
-
- size_t getResidentMemoryBytes() {
- return 0;
- }
-}
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-/// Mac OS X Platform
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined(__MACOSX__)
-
-#include <mach-o/dyld.h>
-
-namespace embree
-{
- std::string getExecutableFileName()
- {
- char buf[4096];
- uint32_t size = sizeof(buf);
- if (_NSGetExecutablePath(buf, &size) != 0)
- return std::string();
- return std::string(buf);
- }
-
- size_t getVirtualMemoryBytes() {
- return 0;
- }
-
- size_t getResidentMemoryBytes() {
- return 0;
- }
-}
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-/// Unix Platform
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined(__UNIX__)
-
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <pthread.h>
-
-namespace embree
-{
- unsigned int getNumberOfLogicalThreads()
- {
- static int nThreads = -1;
- if (nThreads != -1) return nThreads;
-
-#if defined(__MACOSX__) || defined(__ANDROID__)
- nThreads = sysconf(_SC_NPROCESSORS_ONLN); // does not work in Linux LXC container
- assert(nThreads);
-#else
- cpu_set_t set;
- if (pthread_getaffinity_np(pthread_self(), sizeof(set), &set) == 0)
- nThreads = CPU_COUNT(&set);
-#endif
-
- assert(nThreads);
- return nThreads;
- }
-
- int getTerminalWidth()
- {
- struct winsize info;
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &info) < 0) return 80;
- return info.ws_col;
- }
-
- double getSeconds() {
- struct timeval tp; gettimeofday(&tp,nullptr);
- return double(tp.tv_sec) + double(tp.tv_usec)/1E6;
- }
-
- void sleepSeconds(double t) {
- usleep(1000000.0*t);
- }
-}
-#endif
-