INTVAL Parrot_get_num_cpus(SHIM_INTERP) { INTVAL nprocs = -1; #ifdef _SC_NPROCESSORS_ONLN nprocs = sysconf(_SC_NPROCESSORS_ONLN); #elif defined(PARROT_HAS_HEADER_LIBCPUID) struct cpu_raw_data_t raw; struct cpu_id_t data; if (!cpuid_present()) { printf("cpuid_present failed\n"); exit(EXIT_FAILURE); } if (cpuid_get_raw_data(&raw) < 0) { printf("cpuid_get_raw_data failed\n"); printf("Error: %s\n", cpuid_error()); exit(EXIT_FAILURE); } if (cpu_identify(&raw, &data) < 0) { printf("cpu_identify failed\n"); printf("Error: %s\n", cpuid_error()); exit(EXIT_FAILURE); } nprocs = data.num_cores; #else FILE *f; char line[128]; if (!fopen("/proc/cpuinfo", "rb")) return nprocs; while (!feof(f)) { fgets(line, 128, f); if (strlen(line) == 1) continue; if (strncmp(line, "cpu cores", 8) == 0) { sscanf(line, "cpu cores\t: %d", &nprocs); fclose(f); return nprocs; } } fclose(f); #endif return nprocs; }
static void print_info(output_data_switch query, struct cpu_raw_data_t* raw, struct cpu_id_t* data) { int i, value; struct msr_driver_t* handle; switch (query) { case NEED_CPUID_PRESENT: fprintf(fout, "%d\n", cpuid_present()); break; case NEED_VENDOR_STR: fprintf(fout, "%s\n", data->vendor_str); break; case NEED_VENDOR_ID: fprintf(fout, "%d\n", data->vendor); break; case NEED_BRAND_STRING: fprintf(fout, "%s\n", data->brand_str); break; case NEED_FAMILY: fprintf(fout, "%d\n", data->family); break; case NEED_MODEL: fprintf(fout, "%d\n", data->model); break; case NEED_STEPPING: fprintf(fout, "%d\n", data->stepping); break; case NEED_EXT_FAMILY: fprintf(fout, "%d\n", data->ext_family); break; case NEED_EXT_MODEL: fprintf(fout, "%d\n", data->ext_model); break; case NEED_NUM_CORES: fprintf(fout, "%d\n", data->num_cores); break; case NEED_NUM_LOGICAL: fprintf(fout, "%d\n", data->num_logical_cpus); break; case NEED_TOTAL_CPUS: fprintf(fout, "%d\n", cpuid_get_total_cpus()); break; case NEED_L1D_SIZE: fprintf(fout, "%d\n", data->l1_data_cache); break; case NEED_L1I_SIZE: fprintf(fout, "%d\n", data->l1_instruction_cache); break; case NEED_L2_SIZE: fprintf(fout, "%d\n", data->l2_cache); break; case NEED_L3_SIZE: fprintf(fout, "%d\n", data->l3_cache); break; case NEED_L4_SIZE: fprintf(fout, "%d\n", data->l4_cache); break; case NEED_L1D_ASSOC: fprintf(fout, "%d\n", data->l1_assoc); break; case NEED_L2_ASSOC: fprintf(fout, "%d\n", data->l2_assoc); break; case NEED_L3_ASSOC: fprintf(fout, "%d\n", data->l3_assoc); break; case NEED_L4_ASSOC: fprintf(fout, "%d\n", data->l4_assoc); break; case NEED_L1D_CACHELINE: fprintf(fout, "%d\n", data->l1_cacheline); break; case NEED_L2_CACHELINE: fprintf(fout, "%d\n", data->l2_cacheline); break; case NEED_L3_CACHELINE: fprintf(fout, "%d\n", data->l3_cacheline); break; case NEED_L4_CACHELINE: fprintf(fout, "%d\n", data->l4_cacheline); break; case NEED_CODENAME: fprintf(fout, "%s\n", data->cpu_codename); break; case NEED_FEATURES: { for (i = 0; i < NUM_CPU_FEATURES; i++) if (data->flags[i]) fprintf(fout, " %s", cpu_feature_str(i)); fprintf(fout, "\n"); break; } case NEED_CLOCK: fprintf(fout, "%d\n", cpu_clock()); break; case NEED_CLOCK_OS: fprintf(fout, "%d\n", cpu_clock_by_os()); break; case NEED_CLOCK_RDTSC: fprintf(fout, "%d\n", cpu_clock_measure(400, 1)); break; case NEED_CLOCK_IC: fprintf(fout, "%d\n", cpu_clock_by_ic(25, 16)); break; case NEED_RDMSR: { if ((handle = cpu_msr_driver_open()) == NULL) { fprintf(fout, "Cannot open MSR driver: %s\n", cpuid_error()); } else { if ((value = cpu_msrinfo(handle, INFO_MPERF)) != CPU_INVALID_VALUE) fprintf(fout, " MSR.mperf : %d MHz\n", value); if ((value = cpu_msrinfo(handle, INFO_APERF)) != CPU_INVALID_VALUE) fprintf(fout, " MSR.aperf : %d MHz\n", value); if ((value = cpu_msrinfo(handle, INFO_CUR_MULTIPLIER)) != CPU_INVALID_VALUE) fprintf(fout, " cur. multi.: %d MHz\n", value); if ((value = cpu_msrinfo(handle, INFO_MAX_MULTIPLIER)) != CPU_INVALID_VALUE) fprintf(fout, " max. multi.: %d MHz\n", value); if ((value = cpu_msrinfo(handle, INFO_TEMPERATURE)) != CPU_INVALID_VALUE) fprintf(fout, " temperature: %d degrees Celsius\n", value); if ((value = cpu_msrinfo(handle, INFO_THROTTLING)) != CPU_INVALID_VALUE) fprintf(fout, " throttling : %s\n", value ? "yes" : "no"); if ((value = cpu_msrinfo(handle, INFO_VOLTAGE)) != CPU_INVALID_VALUE) fprintf(fout, " core volt. : %.2lf Volts\n", value / 100.0); if ((value = cpu_msrinfo(handle, INFO_BCLK)) != CPU_INVALID_VALUE) fprintf(fout, " base clock : %.2lf MHz\n", value / 100.0); cpu_msr_driver_close(handle); } break; } case NEED_SSE_UNIT_SIZE: { fprintf(fout, "%d (%s)\n", data->sse_size, data->detection_hints[CPU_HINT_SSE_SIZE_AUTH] ? "authoritative" : "non-authoritative"); break; } default: fprintf(fout, "How did you get here?!?\n"); break; } }