如何以编程方式检查 CPU 上是否启用了融合 mul add (FMA) 指令?

How to programmatically check if fused mul add (FMA) instruction are enabled on the CPU?

我想使用 FMA 内部指令 _mm256_fmadd_pd(a, b, c),但我的代码必须 运行 在启用或不启用 FMA 的不同计算机上。我不能使用编译时标志。所以我希望能够写出这样的东西:

__m256d a, b, c, x;
bool FMA_Enabled = CheckFMA();

if (FMA_Enabled)
{
  d = _mm256_fmadd_pd(a, b, c);
}
else
{
  x = _mm256_mul_pd(a, b);
  d = _mm256_add_pd(x, c);
}

我找不到编写函数 CheckFMA() 的方法。有办法吗?

我的OS是Windows10个64位。

编辑:分支实际上在函数之外。所以我不会每次都检查 FMA 支持而失去性能。

哪个OS? 运行 linux 你可以检查 /proc/cpuinfo 例如fma 标志

使用 Windows 查看 https://docs.microsoft.com/en-us/sysinternals/downloads/coreinfo,它使用 GetLogicalProcessorInformation 函数

我使用 __cpuid 通过修改微软代码来编写我的函数。非常感谢大家的帮助。

#include <intrin.h>
#include <vector>
#include <bitset>
#include <array>

bool CheckFMA()
{
    std::array<int, 4> cpui;
    std::bitset<32> ECX;
    int nIds;
    bool fma;

    __cpuid(cpui.data(), 0);
    nIds = cpui[0];

    if (nIds < 1)
    {
        return false;
    }

    __cpuidex(cpui.data(), 1, 0);
    ECX = cpui[2];

    return ECX[12];
}