我有一些需要快速运行的代码,因此我希望能说服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]);
在内部循环中出现“unsupported use in 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 int。
s
不是最低维度的索引。这通常会阻止矢量化。我对第二种情况一无所知。我肯定可以将第二种情况向量化。 - Mysticial