次のループを最適化するために SSE (1,2,3,4,...) を使用できるかどうか疑問に思っています。
// u and v are allocated through new double[size*size]
for (int j = l; j < size-1; ++j)
{
for (int k = 1; k < size-1; ++k)
{
v[j*size + k] = (u[j*size + k-1] + u[j*size + k+1]
+ u[(j-1)*size + k]+ u[(j+1)*size + k]) / 4.0;
}
}
この[j*size + k]
イディオムは、メモリのブロックを多次元配列であるかのように扱うために使用されます。
残念ながら、-ftree-vectorize
GCC (4.5) のフラグは、ループが SIMD タイプの最適化に適しているとは考えていません。-ftree-vectorize
(ただし、最も単純なループ以外を最適化するのを見たことはありません。)
ループのパフォーマンスを改善する方法が他にもたくさんあることは承知していますが (OpenMP、アンローリング、インプレース アルゴリズムなど)、SIMD を使用できるかどうかを特に知りたいと思っています。私はおそらく、具体的な実装とは対照的に、そのようなループをどのように変換できるか (もしあれば) の一般的な概要にもっと興味があります。