微软表示VS2010支持全套AVX指令:
...在VS2010版本中,所有AVX功能和指令都通过内在和完全支持/arch:AVX....
但是我找不到任何用于融合乘法运算的内在函数
我需要使用_mm256_fmadd_ps函数,但它在"immintrin.h"标题中缺失.我真的很困惑.
我正在使用Intel Haswell CPU的FMA指令来优化某些计算.
但是,我发现即使我将MXCSR寄存器设置为DNZ和FTZ模式,这些指令也会生成非正规数.
如何强制这些FMA指令生成0而不是非正规?
我正在使用单精度浮点数据.
我想了解如何计算FMA性能。如果我们在这里查看说明:
对于Skylake架构,该指令具有Latency=4和Throughput(CPI)=0.5,因此该指令的整体性能为4*0.5 = 2每条指令的时钟数。
据我了解,如果最大(涡轮)时钟频率为3GHz,那么对于一秒钟的单个内核,我可以执行1 500 000 000条指令。
这样对吗?如果是这样,我观察到性能稍高的原因可能是什么?
经典的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上使用哪个指令集扩展)?
(我搜索那个因为我这次操作数十亿次)
如果我在cuda中使用fma(a,b,c),则意味着公式a b + c是在单个三元运算中计算的.但是如果我想计算-a b + c,那么调用fma(-a,b,c)是否还需要多次运算?
如果我#include <immintrin.h>收到此错误:
错误:未在此范围内声明'__builtin_ia32_addpd256'
我已定义__AVX__和__FMA__宏使AVX可用,但显然这还不够.如果我使用编译器标志-mavx而不是宏,则没有错误,但该解决方案是不可接受的.那么,我还应该定义什么才能使用AVX?
我试图在浮点计算中比较FMA性能(fma()in math.h)与朴素乘法和加法.测试很简单.我将为大迭代次数迭代相同的计算.我需要做两件事才能进行精确检查.
为了实现上述目标,我做了以下事情:
-O0选项不优化乘法.(但是当我查看转储文件时,它似乎为两者生成几乎相同的代码)volatile.但结果显示,fma()与天真的乘法和加法相比几乎没有差异,甚至更慢.它是我想要的结果(即它们在速度方面没有真正的不同)或者我做错了什么?
规格
我的守则
#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)