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

时间:2019-11-19 10:47:24

标签: c++ windows x86 intrinsics avx

我想使用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()的方法。有办法吗?

我的操作系统是Windows 10 64位。

编辑:分支实际上将在函数之外。因此,我不会因每次检查FMA支持而损失性能。

2 个答案:

答案 0 :(得分:3)

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

#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];
}

答案 1 :(得分:1)

哪个操作系统?运行linux,您可以检查/proc/cpuinfo,例如fma标志

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