5

Beowulf クラスターで MPI を使って並列プログラミングを行っています。シミュレーテッド・アニーリングのための並列アルゴリズムを書きました。それは正常に動作します。シリアル コードよりも 15 倍速い実行が期待されます。ただし、パフォーマンス測定用に異なるデータ セットを使用できるように、さまざまなアーキテクチャとオペレーティング システムでシリアル C コードを実行しました。この Random 関数をコードで使用しました。Windows と ubuntu Linux の両方で GCC を使用しています。Linux では実行に時間がかかることがわかりましたが、その理由はわかりません。誰かが Linux と Windows で gcc を使ってこのコードをコンパイルし、説明してくれませんか。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main (int argc, char** argv){
        double Random();

        int k,NUM_ITERATIONS = 10;
        clock_t start_time = clock();
        NUM_ITERATIONS=atoi(argv[1]);

        // iniciranje random generatora 
        srand(time(NULL));

        for(k=0; k<NUM_ITERATIONS; k++){
                double raa = Random();
        }
        clock_t end_time = clock();
    printf("Time of algorithm execution: %lf seconds\n",  ((double) (end_time - start_time)) / CLOCKS_PER_SEC);

    return 0;
    }

    // generate random number bettwen 0 and 1
    double Random(){
        srand(rand());
        double a = rand();
        return a/RAND_MAX; 
    }

NUM_ITERATIONS の引数として 100 000 000 を指定して実行すると、Linux では Windows よりも 20 倍遅くなります。デュアル ブート win + ubuntu linux を備えた同じアーキテクチャのマシンでテスト済み。このランダム関数は、データで表示したいもののボトルネックであるため、助けが必要です。

4

2 に答える 2

8

Linux gcc では、srand(rand());Random 関数内での呼び出しが 98% 以上の時間を占めています。

少なくともループ内では、乱数の生成には必要ありません。あなたはすでにsrand()一度電話をかけます、それで十分です。

于 2009-12-08T13:49:39.973 に答える
1

利用可能な他の乱数ジェネレーターを調査します。実行速度と疑似ランダム性の両方の点で、十分にテストされ、標準ライブラリのランダム関数よりも優れたパフォーマンスを発揮するものが数多く存在します。大学院クラス用に独自のRNGも実装しましたが、本番コードでは使用しません。コミュニティによって精査されたものと一緒に行きましょう。 Random.orgは、選択したRNGをテストするための優れたリソースです。

于 2009-12-08T14:08:17.040 に答える