如何用C语言获取Apple M1/M2的CPU核心数?
在C语言中获取Apple Silicon的CPU核心数
在Apple Silicon(M1/M2等)设备的macOS系统上,你可以通过sysctl系统调用直接获取CPU核心数,以下是几种实用的实现方式:
获取固定总核心数(不受省电模式影响)
如果你不需要检测省电模式下的活跃核心数,而是要获取设备硬件设计的总核心数(比如M2的8核),可以使用hw.physicalcpu_max或machdep.cpu.core_count这两个sysctl参数,它们返回的是系统固定的核心总数,不会随省电模式的核心禁用状态变化。
代码示例
#include <stdio.h> #include <sys/types.h> #include <sys/sysctl.h> #include <string.h> #include <errno.h> int main() { // 获取物理核心总数(硬件设计值) int total_physical_cores; size_t param_size = sizeof(total_physical_cores); if (sysctlbyname("hw.physicalcpu_max", &total_physical_cores, ¶m_size, NULL, 0) == 0) { printf("CPU物理核心总数: %d\n", total_physical_cores); } else { fprintf(stderr, "读取物理核心数失败: %s\n", strerror(errno)); } // 另一种获取核心总数的方式 int core_count; param_size = sizeof(core_count); if (sysctlbyname("machdep.cpu.core_count", &core_count, ¶m_size, NULL, 0) == 0) { printf("CPU核心总数(另一种方式): %d\n", core_count); } else { fprintf(stderr, "读取核心总数失败: %s\n", strerror(errno)); } // 可选:获取当前活跃的核心数(省电模式下可能减少) int active_cores; param_size = sizeof(active_cores); if (sysctlbyname("hw.physicalcpu", &active_cores, ¶m_size, NULL, 0) == 0) { printf("当前活跃物理核心数: %d\n", active_cores); } else { fprintf(stderr, "读取活跃核心数失败: %s\n", strerror(errno)); } return 0; }
编译运行
在终端中用Clang编译:
clang -o core_info core_info.c
运行程序:
./core_info
补充说明
- Apple Silicon采用异构架构(性能核+能效核),上述方法返回的是所有核心的总数,比如M1和标准款M2都是8核(4性能+4能效),M2 Pro/Max则会返回对应的硬件核心数。
hw.logicalcpu_max参数在Apple Silicon上通常和物理核心数一致,因为Apple Silicon没有超线程技术。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

