3

次のループを最適化するために 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-vectorizeGCC (4.5) のフラグは、ループが SIMD タイプの最適化に適しているとは考えていません。-ftree-vectorize(ただし、最も単純なループ以外を最適化するのを見たことはありません。)

ループのパフォーマンスを改善する方法が他にもたくさんあることは承知していますが (OpenMP、アンローリング、インプレース アルゴリズムなど)、SIMD を使用できるかどうかを特に知りたいと思っています。私はおそらく、具体的な実装とは対照的に、そのようなループをどのように変換できるか (もしあれば) の一般的な概要にもっと興味があります。

4

1 に答える 1

0

可能であるように見えますが、(a) double を使用している、(b) I/O に比べてほとんど計算を行っていない、(c) 最近のほとんどの x86-64 CPU にはいずれにしても 2 つの FPU があるため、 SIMD コーディングへの投資からあまり利益を得られない可能性があります。

于 2010-11-18T23:33:04.877 に答える