如何使用 cpuid 找出 CPU 核心数?

sav*_*ava 1 multicore cpuid rust

我对物理核心感兴趣,而不是逻辑核心。

我知道https://crates.io/crates/num_cpus,但我想使用 cpuid 获取核心数量。我最感兴趣的是适用于 Ubuntu 的解决方案,但跨平台解决方案也是受欢迎的。

Luk*_*odt 5

我认为您主要有两种方法可以做到这一点。

您可以使用更高级别的cpuid。有了这个,就这么简单cpuid::identify().unwrap().num_cores(当然,请进行适当的错误处理)。但既然您了解该库num_cpus并且仍然问这个问题,我假设您不想使用外部库。

第二种方法是自己完成这一切。但这种方法大多与 Rust 无关,因为主要困难在于理解 CPUID 指令及其返回的内容。例如,本问答对此进行了解释。这并不简单,所以我不会在这里重复。

Rust 唯一特定的事情是如何在 Rust 中实际执行该指令。一种方法是使用core::arch::x86_64::__cpudid_count. 这是一个返回原始结果(四个寄存器)的不安全函数。调用它后,您必须通过位移和屏蔽来提取您想要的信息,如我上面链接的问答中所述。请咨询core::arch其他架构或更多 cpuid 相关功能。

但同样,手动执行此操作并非微不足道,容易出错,而且显然很难使工作真正跨 CPU。num_cpus因此,我强烈建议使用像任何实际代码一样的库。