标签: fma

VS2010 SP1是否仅支持部分AVX指令集?

微软表示VS2010支持全套AVX指令:

http://blogs.msdn.com/b/vcblog/archive/2009/11/02/visual-c-code-generation-in-visual-studio-2010.aspx

...在VS2010版本中,所有AVX功能和指令都通过内在和完全支持/arch:AVX....

但是我找不到任何用于融合乘法运算的内在函数

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_bk_avx_fma.htm#intref_bk_avx_fma

我需要使用_mm256_fmadd_ps函数,但它在"immintrin.h"标题中缺失.我真的很困惑.

c++ sse visual-studio-2010 avx fma

3
推荐指数
1
解决办法
1596
查看次数

Haswell FMA指令生成非正规数

我正在使用Intel Haswell CPU的FMA指令来优化某些计算.

但是,我发现即使我将MXCSR寄存器设置为DNZ和FTZ模式,这些指令也会生成非正规数.

如何强制这些FMA指令生成0而不是非正规?

我正在使用单精度浮点数据.

simd fma

3
推荐指数
1
解决办法
114
查看次数

了解FMA表现

我想了解如何计算FMA性能。如果我们在这里查看说明:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm256_fmadd_ps&expand=2520,2520&techs=FMA

对于Skylake架构,该指令具有Latency=4Throughput(CPI)=0.5,因此该指令的整体性能为4*0.5 = 2每条指令的时钟数。

据我了解,如果最大(涡轮)时钟频率为3GHz,那么对于一秒钟的单个内核,我可以执行1 500 000 000条指令。

这样对吗?如果是这样,我观察到性能稍高的原因可能是什么?

c++ x86 fma

2
推荐指数
1
解决办法
139
查看次数

C/C++/ASM:在CPU上相加a = a*2 + b?

经典的Multiply-Accumulate操作是a = a + b*c.但我目前想知道是否存在允许在1个时钟周期内对整数执行以下操作的ASM指令:(a和b是无符号的64位整数:unsigned long long int)

a = a*2-1
a = a*2+b
Run Code Online (Sandbox Code Playgroud)

目前,我使用:

a *= 2
--a
Run Code Online (Sandbox Code Playgroud)

对于第一个和

a *= 2
a += b
Run Code Online (Sandbox Code Playgroud)

对于第二个.我认为每个都被转换为ASM中的2条指令.但有没有办法使用1 ASM指令(以及在Intel CPU上使用哪个指令集扩展)?

(我搜索那个因为我这次操作数十亿次)

c x86 assembly multiplying fma

1
推荐指数
1
解决办法
863
查看次数

fma中每个周期的指令号是多少?

如果我在cuda中使用fma(a,b,c),则意味着公式a b + c是在单个三元运算中计算的.但是如果我想计算-a b + c,那么调用fma(-a,b,c)是否还需要多次运算?

cuda fma

1
推荐指数
1
解决办法
125
查看次数

将AVX与GCC一起使用:__ builtin_ia32_addpd256未声明

如果我#include <immintrin.h>收到此错误:

错误:未在此范围内声明'__builtin_ia32_addpd256'

我已定义__AVX____FMA__宏使AVX可用,但显然这还不够.如果我使用编译器标志-mavx而不是宏,则没有错误,但该解决方案是不可接受的.那么,我还应该定义什么才能使用AVX?

c++ gcc avx fma

0
推荐指数
1
解决办法
2104
查看次数

与天真计算相比,FMA表现

我试图在浮点计算中比较FMA性能(fma()in math.h)与朴素乘法和加法.测试很简单.我将为大迭代次数迭代相同的计算.我需要做两件事才能进行精确检查.

  1. 在计算时间时不应包括其他计算.
  2. 天真的乘法和加法不应该优化为FMA
  3. 迭代不应该优化.即迭代应该完全按照我的预期进行.

为了实现上述目标,我做了以下事情:

  1. 函数是内联的,仅包含所需的计算.
  2. 使用g ++ -O0选项不优化乘法.(但是当我查看转储文件时,它似乎为两者生成几乎相同的代码)
  3. 用过volatile.

但结果显示,fma()与天真的乘法和加法相比几乎没有差异,甚至更慢.它是我想要的结果(即它们在速度方面没有真正的不同)或者我做错了什么?

规格

  • Ubuntu 14.04.2
  • G ++ 4.8.2
  • Intel(R)Core(TM)i7-4770(3.4GHz,8MB L3缓存)

我的守则

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <chrono>
using namespace std;
using namespace chrono;

inline double rand_gen() {
    return static_cast<double>(rand()) / RAND_MAX;
}

volatile double a, b, c;
inline void pure_fma_func() {
    fma(a, b, c);
}
inline void non_fma_func() {
    a * b + c;
}


int main() {
    int …
Run Code Online (Sandbox Code Playgroud)

c++ fma

0
推荐指数
1
解决办法
639
查看次数

标签 统计

fma ×7

c++ ×4

avx ×2

x86 ×2

assembly ×1

c ×1

cuda ×1

gcc ×1

multiplying ×1

simd ×1

sse ×1

visual-studio-2010 ×1