#include <x86intrin.h>
void testfunc_loop(double a, double b, double* dst)
{
double f[] = {a,b,-a,-b};
for(int n = 0; n < 4; ++n)
{
dst[n] = 0.1 + f[n]*(1.0 + 0.5*f[n]);
}
}
void testfunc_flat(double a, double b, double* dst)
{
dst[0] = 0.1 + ( a)*(1.0 + 0.5*( a));
dst[1] = 0.1 + ( b)*(1.0 + 0.5*( b));
dst[2] = 0.1 + (-a)*(1.0 + 0.5*(-a));
dst[3] = 0.1 + (-b)*(1.0 + 0.5*(-b));
}
void testfunc_avx(double a, double b, double* dst)
{
__m256d one = _mm256_set1_pd(1.0);
__m256d half = _mm256_set1_pd(0.5);
__m256d tenth = _mm256_set1_pd(0.1);
__m256d v = _mm256_set_pd(-b,-a,b,a);
__m256d q = _mm256_add_pd(tenth,_mm256_mul_pd(v,_mm256_add_pd(one,_mm256_mul_pd(half,v))));
_mm256_store_pd(dst,q);
}
GCC 4.7.2(使用-O3 -mavx)向量化循环版本,但对展开循环使用标量操作。三个版本所花费的时间(标准化后)分别为3.3(循环,自动矢量化)、1.2(展开,标量)、1(手动AVX)。展开版本和手动矢量化函数之间的性能差异很小,但我想强制进行矢量化,因为它在整个代码中是有益的。
使用不同编译器进行测试(参见https://godbolt.org/g/HJH2CX)显示,clang自动向量化展开循环(从版本3.4.1开始),但GCC直到版本7仍未实现。我是否可以在GCC中自动获得类似的向量化?我只找到与循环向量化相关的优化选项,这些选项并没有帮助。GCC网站自2011年以来没有更新。