【发布时间】:2012-11-10 10:16:20
【问题描述】:
我有一些我想快速运行的代码,所以我希望我能说服 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 是浮点数的三维数组,D 是浮点数的一维数组,N、w 和 h 是 const ints .
【问题讨论】:
-
这个问题stackoverflow.com/questions/8144191/… 是相关的,但那里的答案非常具体到那个人的特定问题,而我希望能获得更多关于这些消息含义的一般信息,所以我希望没问题问另一个问题。
-
我明白为什么第一种情况没有矢量化。在第二种情况下,除了
"unsupported use in stmt"之外,编译器还会给出更多信息吗? -
@Mysticial 如果你能明白为什么第一个没有矢量化,请赐教! (我不需要,特别是,但很高兴知道发生了什么。)关于第二个,不,编译器没有提供比“stmt 中不支持的使用”和行号更多的信息。跨度>
-
第一种情况涉及非顺序访问,因为
s不是最低维度的索引。仅此一项通常会阻止矢量化。我不知道第二种情况。我当然可以矢量化第二种情况。 -
@Mystical 非常感谢,我不知道。
标签: c++ gcc compiler-optimization vectorization