0

Visual Studio 2012でopen-mpを使用してプログラムを作成しましたが、いくつか問題があります.これは私のコードです:

    #pragma omp parallel num_threads(4) private(k) 
         {

    #pragma omp   for
    for(k=0x20AC6E12AF3E4DB0;k<=MAXINT64;k++)
        {
     U.k=k;
     init();
    Decrypt(s1);
    Decrypt(s2);
        }
        }

上記のコードがコンパイルされ、CPU 使用率は 100% でしたが、出力が間違っていました。コードを次のように変更すると:

    #pragma omp parallel num_threads(4) private(k) 
       {    
    #pragma omp   for
    for(k=0x20AC6E12AF3E4DB0;k<=MAXINT64;k++)
       {
    U.k=k;
    init();
           #pragma omp critical
       {
    Decrypt(s1);
    Decrypt(s2);
       }
       }
       }

出力は正しくなりますが、この場合、私の CPU 使用率は 100% ではなく、実際には並列処理が失われました! 私に何ができる?

4

1 に答える 1

0

あなたのプログラムは、s1 と s2 が何であるか、および init() が何を変更するかを述べていません。いずれにせよ、あるスレッドが別のスレッドが使用するデータを変更しないようにする必要があります。

「#pragma omp critical」は、一度に 1 つのスレッドしかブロックに入ることができないため、定義上ボトルネックです。

「#pragma omp parallel for」は 1 つあれば十分です。スレッドが for ループで変更された変数のコピーを作成できるようにします。

于 2014-02-05T03:32:41.030 に答える