質問

:次のループを最適化するために、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]イディオムは、それが多次元配列であるかのようにメモリのブロックを処理するために使用される。

GCC(4.5)のための悲しい-ftree-vectorizeフラグは、ループがSIMD型の最適化に適していることを信じていません。 (私は-ftree-vectorizeの最適化は何もなく、ループの最も些細なを見たことがないと言っているが。)

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

の概要に興味を持っています
役に立ちましたか?

解決

それは可能なはずのようにそれは見えますが、()あなたは、(B)のダブルスを使用しているあなたはI / O、(C)に非常に少ない計算相対をやっているので、最新のx86-64のCPUは2つのFPUを持っていますとにかく、あなたはあなたのSIMDコーディング投資に大きなリターンを得られないことがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top