1

このコードを見てください:

#include <stdio.h>
#include <omp.h>

int main()
{
    long i, j;

    #pragma omp for
    for(i=0;i<=100000;i++)
    {
        for(j=0;j<=100000;j++)
        {
            if((i ^ j) == 5687)
            {
                //printf("%ld ^ %ld\n", i, j);
                break;
            }
        }
    }
}

したがって、結果:

robotex@robotex-work:~/Projects$ gcc test.c -fopenmp -o test_openmp
robotex@robotex-work:~/Projects$ gcc test.c -o test_noopenmp
robotex@robotex-work:~/Projects$ time ./test_openmp
real    0m11.785s
user    0m11.613s
sys 0m0.008s
robotex@robotex-work:~/Projects$ time ./test_noopenmp

real    0m13.364s
user    0m13.253s
sys 0m0.008s
robotex@robotex-work:~/Projects$ time ./test_noopenmp

real    0m11.955s
user    0m11.853s
sys 0m0.004s
robotex@robotex-work:~/Projects$ time ./test_openmp

real    0m15.048s
user    0m14.949s
sys 0m0.004s

どうしたの?OpenMP プログラムが遅いのはなぜですか? どうすれば修正できますか?

OS Ubuntuを搭載した複数のコンピューター(職場のIntel Core i5、自宅のIntel Core2Duo T7500)でテストしましたが、常に同じ結果が得られました.OpenMPはパフォーマンスを大幅に向上させません.

ウィキペディアの例もテストしましたが、同じ結果が得られました。

4

1 に答える 1

17

コードには 2 つの問題があります。

  1. parallelプラグマにがありません。したがって、使用するスレッドは 1 つだけです。
  2. j並列領域の外で宣言されているため、競合状態が発生しています。

parallelまず、実際に OpenMP を並行して実行する必要があります。

#pragma omp parallel for

j次に、並列領域の外で宣言しています。これにより、すべてのスレッド間で共有されます。したがって、すべてのスレッドは、並列領域内でそれを読み取り、変更します。

したがって、競合状態になるだけでなく、すべての無効化によって引き起こされるキャッシュ コヒーレンス トラフィックによってパフォーマンスが低下します。

あなたがする必要があるのはj、各スレッドに対してローカルにすることです。これは、次のいずれかで実行できます。

  1. j並列領域内で宣言します。
  2. またはprivate(j)、プラグマに追加します#pragma omp parallel for private(j)
    :(コメントで@ArjunShankarが指摘したように)

代わりにこれを試してください:

int main()
{
    double start = omp_get_wtime();

    long i;

#pragma omp parallel for
    for(i=0;i<=100000;i++)
    {
        long j;
        for(j=0;j<=100000;j++)
        {
            if((i ^ j) == 5687)
            {
                //printf("%ld ^ %ld\n", i, j);
                break;
            }
        }
    }

    double end = omp_get_wtime();

    printf("%f\n",end - start);
    return 0;
}

No OpenMP:            6.433378
OpenMP with global j: 9.634591
OpenMP with local j:  2.266667
于 2012-04-10T16:21:04.450 に答える