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

西尔维斯特

我想使用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];
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

FMA(融合乘法加法)指令是否总是产生与mul然后add指令相同的结果?

来自分类Dev

如何打印add,mul,sub函数?

来自分类Dev

ARM汇编,无需MUL指令即可乘法

来自分类Dev

x86-64 mul指令不能正确乘法?

来自分类Dev

MUL 指令将 32 位汇编为 64 位

来自分类Dev

LDA,STA,SUB,ADD,MUL和DIV的操作如何以Knuth的机器语言MIX工作?

来自分类Dev

OpenCV Mat::Mul 的参数

来自分类Dev

Pandas Dataframe Mul在Multiindex上

来自分类Dev

我如何要求通用类型在通用函数中实现Add,Sub,Mul或Div之类的操作?

来自分类Dev

_mm_mul_epu32与._mm_mul_epi32

来自分类Dev

关于8086中的MUL功能

来自分类Dev

带单位的圆形 Sympy Mul

来自分类Dev

如何打印出MUL产品的输出?

来自分类Dev

更改自定义类中__add __,__ mul__等方法的操作顺序

来自分类Dev

为什么ARM区分SDIV和UDIV但不能区分ADD,SUB和MUL?

来自分类Dev

Rust DRY特性和泛型-Impl Add和Mul几乎相同

来自分类Dev

方法“ mul”的特征类型不兼容

来自分类Dev

FPC BASM32 MUL错误?

来自分类Dev

c_mul和常规python乘法

来自分类Dev

ARM assembly, multiplying without MUL instruction

来自分类Dev

Mul255-这是什么?

来自分类Dev

Mul255-这是什么?

来自分类Dev

为什么 __mul__() 需要整数参数?

来自分类Dev

mips编译器是否仍支持mno-mul选项?

来自分类Dev

为什么__builtin _ {{s,u} {add,sub,mul} ll_overflow`给出`long int`结果而不是`long long int`结果?

来自分类Dev

如何在名为 Fraction 的类中使用 __mul__

来自分类Dev

如何将结构的成员用于算术运算符(将变量add,sub,mul,div添加到struct成员)

来自分类Dev

熊猫:df.mul和df.rmul

来自分类Dev

重载运算符__mul__ python

Related 相关文章

热门标签

归档