如何以编程方式检查 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];
}
我想使用 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];
}