25 #include <OpenImageIO/sysutil.h>
29 # if (!defined(FREE_WINDOWS))
33 #elif defined(__APPLE__)
34 # include <sys/ioctl.h>
35 # include <sys/sysctl.h>
36 # include <sys/types.h>
38 # include <sys/ioctl.h>
47 static bool result =
false;
63 return info.dwNumberOfProcessors;
64 #elif defined(__APPLE__)
67 int mib[2] = {CTL_HW, HW_NCPU};
71 return sysconf(_SC_NPROCESSORS_ONLN);
126 CONSOLE_SCREEN_BUFFER_INFO csbi;
127 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
128 columns = csbi.dwSize.X;
132 if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &
w) == 0) {
137 return (columns > 0) ? columns : 80;
149 #if (!defined(_WIN32) || defined(FREE_WINDOWS)) && (defined(__x86_64__) || defined(__i386__))
152 # if defined(__x86_64__)
153 asm(
"cpuid" :
"=a"(
data[0]),
"=b"(
data[1]),
"=c"(
data[2]),
"=d"(
data[3]) :
"a"(selector));
154 # elif defined(__i386__)
155 asm(
"pushl %%ebx \n\t"
157 "movl %%ebx, %1 \n\t"
170 #if defined(__APPLE__)
172 char modelname[512] =
"";
173 size_t bufferlen = 512;
174 if (sysctlbyname(
"machdep.cpu.brand_string", &modelname, &bufferlen,
NULL, 0) == 0) {
177 #elif defined(WIN32) || defined(__x86_64__) || defined(__i386__)
185 __cpuid((
int *)(buf + 0), 0x80000002);
186 __cpuid((
int *)(buf + 16), 0x80000003);
187 __cpuid((
int *)(buf + 32), 0x80000004);
198 FILE *cpuinfo = fopen(
"/proc/cpuinfo",
"r");
199 if (cpuinfo !=
nullptr) {
200 char cpuinfo_buf[513] =
"";
201 fread(cpuinfo_buf,
sizeof(cpuinfo_buf) - 1, 1, cpuinfo);
204 char *modelname = strstr(cpuinfo_buf,
"model name");
205 if (modelname !=
nullptr) {
206 modelname = strchr(modelname,
':');
207 if (modelname !=
nullptr) {
209 char *modelname_end = strchr(modelname,
'\n');
210 if (modelname_end !=
nullptr) {
211 *modelname_end =
'\0';
218 return "Unknown CPU";
223 return (
sizeof(
void *) * 8);
226 #if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
228 struct CPUCapabilities {
248 static CPUCapabilities &system_cpu_capabilities()
250 static CPUCapabilities caps;
251 static bool caps_init =
false;
256 memset(&caps, 0,
sizeof(caps));
263 caps.mmx = (
result[3] & ((int)1 << 23)) != 0;
264 caps.sse = (
result[3] & ((int)1 << 25)) != 0;
265 caps.sse2 = (
result[3] & ((int)1 << 26)) != 0;
266 caps.sse3 = (
result[2] & ((int)1 << 0)) != 0;
268 caps.ssse3 = (
result[2] & ((int)1 << 9)) != 0;
269 caps.sse41 = (
result[2] & ((int)1 << 19)) != 0;
270 caps.sse42 = (
result[2] & ((int)1 << 20)) != 0;
272 caps.fma3 = (
result[2] & ((int)1 << 12)) != 0;
274 bool os_uses_xsave_xrestore = (
result[2] & ((int)1 << 27)) != 0;
275 bool cpu_avx_support = (
result[2] & ((int)1 << 28)) != 0;
277 if (os_uses_xsave_xrestore && cpu_avx_support) {
280 # if defined(__GNUC__)
283 __asm__(
".byte 0x0f, 0x01, 0xd0" :
"=a"(xcr_feature_mask),
"=d"(edx) :
"c"(0));
284 # elif defined(_MSC_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
285 xcr_feature_mask = (
uint32_t)_xgetbv(
286 _XCR_XFEATURE_ENABLED_MASK);
288 xcr_feature_mask = 0;
290 caps.avx = (xcr_feature_mask & 0x6) == 0x6;
293 caps.f16c = (
result[2] & ((int)1 << 29)) != 0;
296 caps.bmi1 = (
result[1] & ((int)1 << 3)) != 0;
297 caps.bmi2 = (
result[1] & ((int)1 << 8)) != 0;
298 caps.avx2 = (
result[1] & ((int)1 << 5)) != 0;
309 CPUCapabilities &caps = system_cpu_capabilities();
310 return caps.sse && caps.sse2;
315 CPUCapabilities &caps = system_cpu_capabilities();
316 return caps.sse && caps.sse2 && caps.sse3 && caps.ssse3;
321 CPUCapabilities &caps = system_cpu_capabilities();
322 return caps.sse && caps.sse2 && caps.sse3 && caps.ssse3 && caps.sse41;
327 CPUCapabilities &caps = system_cpu_capabilities();
328 return caps.sse && caps.sse2 && caps.sse3 && caps.ssse3 && caps.sse41 && caps.avx;
333 CPUCapabilities &caps = system_cpu_capabilities();
334 return caps.sse && caps.sse2 && caps.sse3 && caps.ssse3 && caps.sse41 && caps.avx && caps.f16c &&
335 caps.avx2 && caps.fma3 && caps.bmi1 && caps.bmi2;
368 string cmd =
"\"" + Sysutil::this_program_path() +
"\"";
370 for (
int i = 0; i < args.size(); i++) {
371 cmd +=
" \"" + args[i] +
"\"";
376 cmd =
"cmd /S /C \"" + cmd +
" > nul \"";
379 cmd +=
" > /dev/null";
382 return (system(cmd.c_str()) == 0);
389 ram.dwLength =
sizeof(ram);
390 GlobalMemoryStatusEx(&ram);
391 return ram.ullTotalPhys;
392 #elif defined(__APPLE__)
394 size_t len =
sizeof(ram);
395 if (sysctlbyname(
"hw.memsize", &ram, &
len,
NULL, 0) == 0) {
400 size_t ps = sysconf(_SC_PAGESIZE);
401 size_t pn = sysconf(_SC_PHYS_PAGES);
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
#define CCL_NAMESPACE_END
bool numaAPI_IsNodeAvailable(int node)
NUMAAPI_Result numaAPI_Initialize(void)
int numaAPI_GetNumCurrentNodesProcessors(void)
int numaAPI_GetNumNodeProcessors(int node)
int numaAPI_GetNumNodes(void)
bool numaAPI_RunThreadOnNode(int node)
unsigned __int64 uint64_t
static void __cpuid(int data[4], int selector)
string string_remove_trademark(const string &s)
size_t system_physical_ram()
bool system_cpu_support_avx2()
int system_cpu_num_active_group_processors()
bool system_cpu_run_thread_on_node(int node)
int system_cpu_thread_count()
string system_cpu_brand_string()
int system_console_width()
bool system_cpu_support_avx()
bool system_cpu_is_numa_node_available(int node)
int system_cpu_num_numa_nodes()
static int system_cpu_thread_count_fallback()
int system_cpu_num_numa_node_processors(int node)
OIIO_NAMESPACE_USING CCL_NAMESPACE_BEGIN bool system_cpu_ensure_initialized()
bool system_call_self(const vector< string > &args)
bool system_cpu_support_sse3()
bool system_cpu_support_sse41()
bool system_cpu_support_sse2()