介绍AVX
AVX就是Intel提供的支持向量并行计算的C语言的一个库,所有的东西都在中.这个库跟正常的C标准库差不多.需要注意的是在编译AVX的时候一定要加编译参数-mavx和-mavx2.一般来说用到AVX的时候还会用到AVX的祖先SSE因此SSE的编译参数也要加上.用gcc编译的指令如下
gcc filename.c -mavx -mavx2 -mfma -msse -msse2 -msse3
还有一点需要说明AVX可以支持Intel的CPU也可以支持AMD的CPU,其实小编的CPU就是AMD的.
AVX入门
AVX入门也就是教你怎么声明变量在这里提供一个中文的详细的介绍.还用一个github上面的代码示范
高维向量加法
目的:
测试计算
实验测试的数据类型为双精度浮点数double类型,两个向量由
代码:废话少说,上码
#include
以上是main函数和测试速度函数的签名,接下来定义定义两个测试速度的函数
long
运行结果
可以得到最终加速比为2.03.之前再WSL系统上用clock获得的时间感觉特别不准,后来用gettimeofday再Windows上重新测了一遍,更新了这里的数据.
测试速度讨论
在实际测试过程中部分时钟周期花费在将数组转换成AVX向量上,这部分时间不计入测试.对于使用AVX实现向量相加的程序,真正计入测试的时间只包括12500个4维double向量相加的时间.对于使用正常数组实现向量相加的程序,计入测试时间的部分也只有$10^7$个double相加的时间.
之所以对AVX忽略数据转换的时间是因为,在实际编程过程中整个程序可能都是AVX向量表示,不需要把普通数组转换成AVX的向量;对比多线程编程,只要使用多线程就一定要计算多线程声明初始化的时间,因此计算多线程的运行时间一定要把初始化的时间计算进去.
测试的时间单位为