高速に実行したいコードがいくつかあるので、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 の 3 次元配列、D は float の 1D 配列、N、w、h は const int です。