0

いくつかの数学的規則を使用して、数値積分を使用した PI の非常に単純な計算で MPI を使用しています。最終的に計算を合計に変換します。この形式は次のとおりです。

PI = ∑(f(i))、ここで i は 1 から 100000 までで、f(i) は i に基づいて double 型の値を返す関数です。

プログラミングするとき、合計を for ループに変換して 100000 回繰り返すことができるのは、非常に簡単なことです。そして、p 個のプロセッサを使用する MPI では、for ループを p 個のセグメントに分割し、各プロセッサは 100000/p 個のループを取得します (100000%p = 0 と仮定)。その後、MPI_Reduce、MPI_SUM を使用してこれらのサブ結果を収集し、それらを合計して最終結果を取得します。

ただし、異なる数のプロセスを使用すると、最終結果はわずかに異なります。最終的な PI 結果の精度は 12 ビットで、7 ビット目あたりから結果が異なり始めます。

結果が異なる理由はわかりません。私の考えでは、タスクがどのように分散されているかに関係なく、まったく同じタスクを実行するだけです。

どんな助けでも大歓迎です!

4

1 に答える 1

2

浮動小数点演算の数値結果は、多くの場合、実行された順序に依存します。これを理解するには、まずコンピュータが浮動小数点数をどのように表現するかを理解する必要があります。1 つの例は、異なるサイズの数値を加算する場合です。指数が異なるため、1 つが切り捨てられます (丸めなど)。これは、次の例で確認できます。

    double small, result1, result2;
    small = 1. / 3000.;
    result1 = 0.;
    for (int i = 0; i < 10000; i++)
            result1 += small;

    result2 = 0.;
    for (int i = 0; i < 100; i++) {
            double tmp = 0.;
            for (int j = 0; j < 100; j++)
                    tmp += small;
            result2 += tmp;
    }
    printf("result1= %.17g, result2= %.17g\n", result1, result2);

最初に数値を一時的な結果に追加することで、切り捨てが少なくなります。このようなことがコードで発生している可能性が非常に高いです。

于 2013-02-19T08:38:24.973 に答える