Optimization 如何向量化a[i]=a[i-1]&x2B;带AVX2的c

Optimization 如何向量化a[i]=a[i-1]&x2B;带AVX2的c,optimization,simd,avx2,Optimization,Simd,Avx2,我想通过AVX2指令将a[I]=a[I-1]+c矢量化。由于依赖关系,它似乎无法矢量化。我已经矢量化了,想在这里分享答案,看看这个问题是否有更好的答案,或者我的解决方案是好的。我已经实现了以下矢量化功能,看起来还可以!加速比是gcc-O3的2.5倍 以下是解决方案: //矢量化 内联无效向量(整数a[LEN],整数b,整数c) { //在这种情况下,b=1和c=2 int i=0; a[i++]=b;//0-->a[0]=1 //步骤1: //求解依赖项向量化因子为8 a[i++]=a[0]+1

我想通过AVX2指令将
a[I]=a[I-1]+c
矢量化。由于依赖关系,它似乎无法矢量化。我已经矢量化了,想在这里分享答案,看看这个问题是否有更好的答案,或者我的解决方案是好的。

我已经实现了以下矢量化功能,看起来还可以!加速比是gcc-O3的2.5倍 以下是解决方案:

//矢量化
内联无效向量(整数a[LEN],整数b,整数c)
{
//在这种情况下,b=1和c=2
int i=0;
a[i++]=b;//0-->a[0]=1
//步骤1:
//求解依赖项向量化因子为8
a[i++]=a[0]+1*c;//1-->a[1]=1+2=3
a[i++]=a[0]+2*c;//2-->a[2]=1+4=5
a[i++]=a[0]+3*c;//3-->a[3]=1+6=7
a[i++]=a[0]+4*c;//4-->a[4]=1+8=9
a[i++]=a[0]+5*c;//5-->a[5]=1+10=11
a[i++]=a[0]+6*c;//6-->a[6]=1+12=13
a[i++]=a[0]+7*c;//7-->a[7]=1+14=15
//达到矢量化因子
//8*c适用于所有人
//将结果加载到向量
__m256i dep1,dep2;//dep={1,3,5,7,9,11,13,15}
__m256i系数=_mm256_set1_epi32(8*c);//系数={16,16,16,16,16}

对于(;iNote,llvm/clang自动向量化这个标量代码,您可能希望将您的解决方案与之进行比较(并可能为其他编译器提交错误报告,要求他们实现这样的优化)。此外,编写
a[i]=b;b+=c;
由gcc向量化(尽管可能不是最优的)。谢谢,我会检查。Clang-O3时间:
0.000037秒
GCC-O3时间:
0.000107秒
我的解决方案时间是
0.000045秒
所以
LLVM
比我的解决方案快solution@MarcGlisse,我无法提交错误报告!
由于垃圾邮件而过滤了用户帐户创建。
当前创建用户帐户的方法是发送电子邮件到overseers@gcc.gnu.org(他们是手工做的)。