11#include <OpenImageIO/sysutil.h>
16# if (!defined(FREE_WINDOWS))
20#elif defined(__APPLE__)
21# include <sys/ioctl.h>
22# include <sys/sysctl.h>
23# include <sys/types.h>
26# include <sys/ioctl.h>
37 CONSOLE_SCREEN_BUFFER_INFO csbi;
38 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
39 columns = csbi.dwSize.X;
43 if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &
w) == 0) {
48 return (columns > 0) ? columns : 80;
52#if (!defined(_WIN32) || defined(FREE_WINDOWS)) && (defined(__x86_64__) || defined(__i386__))
53static void __cpuid(
int data[4],
int selector)
55# if defined(__x86_64__)
56 asm(
"cpuid" :
"=a"(data[0]),
"=b"(data[1]),
"=c"(data[2]),
"=d"(data[3]) :
"a"(selector));
57# elif defined(__i386__)
58 asm(
"pushl %%ebx \n\t"
62 :
"=a"(data[0]),
"=r"(data[1]),
"=c"(data[2]),
"=d"(data[3])
66 data[0] = data[1] = data[2] = data[3] = 0;
75 char modelname[512] =
"";
76 size_t bufferlen = 512;
77 if (sysctlbyname(
"machdep.cpu.brand_string", &modelname, &bufferlen,
NULL, 0) == 0) {
80#elif (defined(WIN32) || defined(__x86_64__) || defined(__i386__)) && !defined(_M_ARM64)
87 if (result[0] != 0 && result[0] >= (
int)0x80000004) {
88 __cpuid((
int *)(buf + 0), 0x80000002);
89 __cpuid((
int *)(buf + 16), 0x80000003);
90 __cpuid((
int *)(buf + 32), 0x80000004);
99#elif defined(_M_ARM64)
100 DWORD processorNameStringLength = 255;
101 char processorNameString[255];
102 if (RegGetValueA(HKEY_LOCAL_MACHINE,
103 "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
104 "ProcessorNameString",
107 &processorNameString,
108 &processorNameStringLength) == ERROR_SUCCESS)
110 return processorNameString;
114 FILE *cpuinfo = fopen(
"/proc/cpuinfo",
"r");
115 if (cpuinfo !=
nullptr) {
116 char cpuinfo_buf[513] =
"";
117 fread(cpuinfo_buf,
sizeof(cpuinfo_buf) - 1, 1, cpuinfo);
120 char *modelname = strstr(cpuinfo_buf,
"model name");
121 if (modelname !=
nullptr) {
122 modelname = strchr(modelname,
':');
123 if (modelname !=
nullptr) {
125 char *modelname_end = strchr(modelname,
'\n');
126 if (modelname_end !=
nullptr) {
127 *modelname_end =
'\0';
134 return "Unknown CPU";
139 return (
sizeof(
void *) * 8);
142#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
144struct CPUCapabilities {
149static CPUCapabilities &system_cpu_capabilities()
151 static CPUCapabilities caps = {};
152 static bool caps_init =
false;
162 const bool sse = (result[3] & ((
int)1 << 25)) != 0;
163 const bool sse2 = (result[3] & ((
int)1 << 26)) != 0;
164 const bool sse3 = (result[2] & ((
int)1 << 0)) != 0;
166 const bool ssse3 = (result[2] & ((
int)1 << 9)) != 0;
167 const bool sse41 = (result[2] & ((
int)1 << 19)) != 0;
168 const bool sse42 = (result[2] & ((
int)1 << 20)) != 0;
170 const bool fma3 = (result[2] & ((
int)1 << 12)) != 0;
171 const bool os_uses_xsave_xrestore = (result[2] & ((
int)1 << 27)) != 0;
172 const bool cpu_avx_support = (result[2] & ((
int)1 << 28)) != 0;
175 caps.sse42 = sse && sse2 && sse3 && ssse3 && sse41 && sse42;
177 if (os_uses_xsave_xrestore && cpu_avx_support) {
180# if defined(__GNUC__)
183 __asm__(
".byte 0x0f, 0x01, 0xd0" :
"=a"(xcr_feature_mask),
"=d"(edx) :
"c"(0));
184# elif defined(_MSC_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
186 xcr_feature_mask = (
uint32_t)_xgetbv(_XCR_XFEATURE_ENABLED_MASK);
188 xcr_feature_mask = 0;
190 const bool avx = (xcr_feature_mask & 0x6) == 0x6;
191 const bool f16c = (result[2] & ((
int)1 << 29)) != 0;
194 bool bmi1 = (result[1] & ((
int)1 << 3)) != 0;
195 bool bmi2 = (result[1] & ((
int)1 << 8)) != 0;
196 bool avx2 = (result[1] & ((
int)1 << 5)) != 0;
198 caps.avx2 = sse && sse2 && sse3 && ssse3 && sse41 && sse42 && avx && f16c && avx2 &&
199 fma3 && bmi1 && bmi2;
211 CPUCapabilities &caps = system_cpu_capabilities();
217 CPUCapabilities &caps = system_cpu_capabilities();
238 ram.dwLength =
sizeof(ram);
239 GlobalMemoryStatusEx(&ram);
240 return ram.ullTotalPhys;
241#elif defined(__APPLE__)
243 size_t len =
sizeof(ram);
244 if (sysctlbyname(
"hw.memsize", &ram, &
len,
NULL, 0) == 0) {
249 size_t ps = sysconf(_SC_PAGESIZE);
250 size_t pn = sysconf(_SC_PHYS_PAGES);
258 return GetCurrentProcessId();
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
#define CCL_NAMESPACE_END
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
unsigned __int64 uint64_t
string string_remove_trademark(const string &s)
static void __cpuid(int data[4], int selector)
size_t system_physical_ram()
bool system_cpu_support_avx2()
bool system_cpu_support_sse42()
OIIO_NAMESPACE_USING CCL_NAMESPACE_BEGIN int system_console_width()
string system_cpu_brand_string()
uint64_t system_self_process_id()