gpt4 book ai didi

c++ - gcc 的自动向量化消息是什么意思?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:08 27 4
gpt4 key购买 nike

我有一些我想快速运行的代码,所以我希望我能说服 gcc (g++) 对我的一些内部循环进行矢量化。我的编译器标志包括

-O3 -msse2 -ffast-math -ftree-vectorize -ftree-vectorizer-verbose=5

但是 gcc 未能矢量化最重要的循环,给我以下并非真的非常冗长的消息:

Not vectorized: complicated access pattern.

Not vectorized: unsupported use in stmt.

我的问题是 (1) 这些到底是什么意思? (在它太复杂之前它必须有多复杂?不支持使用什么?),以及(2)有什么方法可以让编译器给我更多关于我在做什么的信息错了吗?

给出“复杂访问模式”的循环示例是

for (int s=0;s<N;++s)
a.grid[s][0][h-1] = D[s] * (b.grid[s][0][h-2] + b.grid[s][1][h-1] - 2*b.grid[s][0][h-1]);

给出“在 stmt 中不受支持的使用”的是

for (int s=0;s<N;++s)
for (int i=1;i<w-1;++i)
for (int j=1;j<h-1;++j)
a.grid[s][i][j] = D[s] * (b.grid[s][i][j-1] + b.grid[s][i][j+1] + b.grid[s][i-1][j] + b.grid[s][i+1][j] - 4*b.grid[s][i][j]);

(这是真正需要优化的地方。)这里a.grid和b.grid是 float 的三维数组,D是一维 float 数组,N、w、h是const int .

最佳答案

Not vectorized: complicated access pattern.

“简单”访问模式是连续元素访问或具有某些限制的跨步元素访问(在循环中访问组的单个元素,组元素计数是 2 的幂,组大小是 vector 类型的倍数)。

b.grid[s][0][h-2] + b.grid[s][1][h-1] - 2*b.grid[s][0][h-1]);

既不是顺序访问也不是跨步访问

Not vectorized: unsupported use in stmt.

这里的“使用”是数据流意义上的,获取变量的值(寄存器,编译器临时)。在这种情况下,“支持的用途”是在循环的当前迭代中定义的变量、常量和循环不变量。

a.grid[s][i][j] = D[s] * (b.grid[s][i][j-1] + b.grid[s][i][j+1] + b.grid[s][i-1][j] + b.grid[s][i+1][j] - 4*b.grid[s][i][j]);

在这个例子中,我认为“不受支持的使用”是因为 b.grid[s][i][j-1]b.grid[s][i] [j+1] 由循环的前一次迭代分配(“定义”)。

关于c++ - gcc 的自动向量化消息是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13505524/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com