微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么循环在一定数量的元素后不向量化?

如何解决为什么循环在一定数量的元素后不向量化?

我制作了一个矩阵向量乘法函数,它可以很好地自动向量化,当数组小于 16x16 大小时,使用 GCC 11.2 编译会生成向量化代码

 #define no_el 16
 void mv_mul(float arr[no_el][no_el],float a1[no_el],float a2[no_el])
{
    for(int i=0;i<no_el;i++)
    {
    a2[i]=0;
    for(int j=0;j<no_el;j++)
    {
     a2[i]+=arr[i][j]*a1[j];
    }
    }
}

但是,当我将元素数量增加到 24、32 等时,编译器会给出以下警告:


Output of x86-64 gcc 11.2 (Compiler #1)
<source>:7:18: missed: Couldn't vectorize loop
<source>:12:11: missed: not vectorized: complicated access pattern.
<source>:10:18: missed: Couldn't vectorize loop
<source>:12:11: missed: not vectorized: complicated access pattern.
<source>:5:7: note: vectorized 0 loops in function.
<source>:15:1: note: ***** Analysis Failed with vector mode V8SF
<source>:15:1: note: ***** Skipping vector mode V32QI,which would repeat the analysis for V8SF

而且代码没有向量化。

有什么可以做的吗?

解决方法

正如 tstanisl 评论的那样,添加限制关键字解决了这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。