无需组装即可检测CPU能力

问题描述 投票:0回答:4

我一直在寻找确定 CPU 及其功能的方法(例如 SEE、SSE2 等)。

然而,我发现的所有方法都涉及使用

cpuid
指令的汇编代码。鉴于编译器甚至目标之间的 C/C++ 汇编方式不同(VC 下的 64 位目标没有内联汇编),我宁愿避免这种情况。

是否有一些简单的库或操作系统函数(适用于 Windows 和 Linux)来获取此信息?

目前我只对使用 x86 和 x86-64 CPU 的平台感兴趣,而且我肯定至少需要支持 AMD 和 Intel。

c cross-platform cpuid
4个回答
4
投票

编辑:首先,我在谷歌上搜索“libcpuid”,记住与同行程序员的对话,谷歌搜索将我指向这个sourceforge页面,它看起来相当过时。然后我注意到这是“libcpu”的项目页面。

实际上,确实有一个 libcpuid 可能适合您的需求。


上次找这样的图书馆,发现了纵横交错。虽然它是 C++。

还有geekinfo

但我不知道只做 cpuid 的跨平台库。


1
投票

在linux下查看/proc/cpuinfo


0
投票

这非常依赖于硬件——这是操作系统通常会屏蔽你的一个方面——要求它跨平台有点困难。

拥有它会很有用,但我担心您可能只需要枚举您想要支持的 CPU 和功能的叉积,乘以操作系统的数量(此处为两个)并为所有操作系统编写测试。我不认为这已经完成了——如果我忽略了某些事情,肯定有人会纠正我。

这将是一个有用的库,祝你好运!


0
投票

您可以使用cpuinfo,这是一个跨平台的CPU信息库

检查主机CPU是否支持x86 AVX

cpuinfo_initialize();
if (cpuinfo_has_x86_avx()) {
    avx_implementation(arguments);
}

将线程固定到与当前核心(Linux 或 Android)共享二级缓存的核心

cpuinfo_initialize();
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
const struct cpuinfo_cache* current_l2 = cpuinfo_get_current_processor()->cache.l2;
for (uint32_t i = 0; i < current_l2->processor_count; i++) {
    CPU_SET(cpuinfo_get_processor(current_l2->processor_start + i)->linux_id, &cpu_set);
}
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu_set);
© www.soinside.com 2019 - 2024. All rights reserved.