Optimization C/C+中的简单头库+;用于检测CPU功能(支持的指令集)

Optimization C/C+中的简单头库+;用于检测CPU功能(支持的指令集),optimization,x86,64-bit,simd,instruction-set,Optimization,X86,64 Bit,Simd,Instruction Set,我想为CPU功能检测创建一个简单的函数。 我需要它来通过CPU特性在运行时分配代码路径 我想要一些非常简单的东西,比如: hasse3(),hasse4(),hasAVX(),hasAVX2(),等等 它必须是可移植的,即支持Windows、macOS和Linux。 可在AMD和英特尔CPU上工作 例如,如何实现hasAVX() 备注 我只关心x86(而且只有64位CPU) 谢谢。不幸的是,如果您想让它便于携带,这并不是一项简单的任务。编译器通常会提供一些帮助,但函数都不同 MSVC在x86/x

我想为CPU功能检测创建一个简单的函数。
我需要它来通过CPU特性在运行时分配代码路径

我想要一些非常简单的东西,比如:

hasse3()
hasse4()
hasAVX()
hasAVX2()
,等等

它必须是可移植的,即支持Windows、macOS和Linux。
可在AMD和英特尔CPU上工作

例如,如何实现hasAVX()

备注
我只关心x86(而且只有64位CPU)


谢谢。

不幸的是,如果您想让它便于携带,这并不是一项简单的任务。编译器通常会提供一些帮助,但函数都不同

MSVC在x86/x86_64上有一个接口,但在ARM上当然不支持。TBH我不知道如何在MSVC目标ARM(或任何非x86 arch)上获得CPU功能

MSVC以外的编译器通常伪装成GCC,因此大多数编译器都支持/intrinsic

对于其他编译器,您可能必须使用内联汇编生成CPUID指令并自行处理结果。这将使您通过x86/x86_64

其他架构的事情要复杂一些。对于ARM,获取CPU信息的指令通常不能被非特权代码访问。对于glibc,您可以将
getauxval
AT_HWCAP
和/或
AT_HWCAP 2
一起使用。对于非glibc-Linux,您可能需要解析/proc/self/auxv和/或/proc/cpuinfo

一个相当强大的解决方案是谷歌的新图书馆

如果您可以牺牲一些可移植性,那么(我编写的)中有一个模块可能会有所帮助。它几乎没有cpu_功能那么健壮,但是它更容易集成到您的项目中。它在x86/x86_64 CPU上几乎可以在任何地方工作,但ARM支持仅限于glibc,其他体系结构尚不受支持。

看来,的库(VCL)可以做到这一点。

我们应该在他的项目中包括
vectorclass.h
,并调用
instrset\u detect()

GNU C(至少是gcc,可能还有clang和ICC)具有
内置cpu支持(“sse4”):
等等。您是否需要它能够跨不同的编译器(如MSVC)以及目标平台进行移植?如果您将您的问题重新表述为只询问如何可移植地实现
hasse4()
等等,而不明确询问头,那么这将是一个主题。答案可以是一个库建议,但问题不能明确地表述为一个请求。@PeterCordes,我也想成为一个可移植的编译器(MSVC,ICC,GCC),但对于初学者来说,我对ICC很满意。@Carcigenicate,相应地编辑了问题。@PeterCordes,ICC不支持这一点。对于ICC使用,例如,
\u可以使用\u cpu\u功能(\u功能\u AVX))
嗨,我不关心ARM。只有x86和64位CPU。你提供的谷歌非常棒。但我不明白如何将它作为“h”和“c”文件放到一个项目中。所需的结构是什么?请查看CMakeLists.txt以了解项目是如何构建的。如何将其与构建系统集成取决于构建系统以及您希望如何使用它。我有最简单的C。我只想在
h
文件中添加一行
#include”“
,并具有相应的功能。我不喜欢建造大型系统。非常小的代码,可以通过一些数学运算来操作一些数组。您可以猜到,我对
CMAKE
或其他方面没有太多经验。我只需点击IDE上的build,cpu_的功能对你来说可能太复杂了。为了支持更大、更复杂的代码库,构建系统几乎是一种需求。因为没有标准的方式来访问您感兴趣的信息,所以解决方案的可移植性越高,它就越大,也越复杂。可能有一种方法可以将cpu_功能集成到IDE的构建系统中,但这是另一个问题,答案取决于IDE。请注意,VCL的许可证是GPL,而不是LGPL。您只能在与GPL兼容的开源项目中使用它。(或您从未将可执行文件分发给任何不获取源代码的人的项目,例如,作为在线服务后端的一部分。)此外,仅限C++(无法从C中使用)。另请参阅更新,VCL现在已获得Apache许可。