You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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, &param_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, &param_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, &param_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:56:06