我想使用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支持而损失性能。
最佳答案
我使用__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];
}
关于c++ - 如何以编程方式检查是否在CPU上启用了mul mul add(FMA)指令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58932256/