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

Posted

技术标签:

【中文标题】为啥在一定数量的元素之后循环不向量化?【英文标题】:Why doesn't the loop vectorize after certain number of elements?为什么在一定数量的元素之后循环不向量化? 【发布时间】:2021-07-31 08:14:17 【问题描述】:

我制作了一个矩阵向量乘法函数,它很好地自动向量化,当数组小于 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

而且代码没有向量化。

有什么可以做的吗?

【问题讨论】:

gcc 怎么称呼 数组可能有别名。尝试将限制限定符添加到数组。 '浮动 a2 [限制 no_el]'。此外 'a2[i]=0;'应该放在循环之外 成功了!谢谢。 【参考方案1】:

正如 tstanisl 所说,添加限制关键字解决了这个问题。

【讨论】:

以上是关于为啥在一定数量的元素之后循环不向量化?的主要内容,如果未能解决你的问题,请参考以下文章

用于分类的 Python 矢量化 [重复]

使用向量化时如何跳过前n行

英特尔 MKL 或一些类似的库是不是提供了一种矢量化方式来计算数组中满足 C 中某些条件的元素数量?

为啥库需要硬编码矢量化而不是编译器自动矢量化

为啥 JPEG 量化矩阵是不对称的?

量化交易(Quantitative Trading)