0

「円の 4 分の 1 にランダムな点を投げて、それらを数えるなど」を介して pi を計算するための C++ プログラムを作成しました。現在、私のプログラムは私の意見では少し遅いので、速度を上げるためにいくつかの改善を考えています (ソース コードは以下にあります)。
私の最初のアイデアは、OpenMP を使用してマルチスレッド化することです。つまり、(I) と (II) の間のコードをいくつかのスレッドに分割して、たとえば (オクタコア システムで) より長く待機することなく、ほぼ 10 倍のラウンドを実行できるようにします。
私が持っていた別のアイデアは、グローバル変数とポインターを使用することでした。これにより、整数のタプルではなく、ポインターをコピーするだけで済みます。欠点は(idk)ですか?
では、プログラムを高速化するために他に何ができるでしょうか? 主に Windows で作業していますが、Unix/Linux も使用できます。
どうもありがとうございました!

コード セクション:

    #include <cstdlib>
    #include <iostream>
    #include <tuple>
    #include <math.h>
    #include <time.h>
    #include <omp.h>
    #include <sys/time.h>

    #define RAND_MAX 32000
    #define LOOPS 1000000

    inline std::tuple<int, int> Throw_points(void)
    {

        int i = 0, j = 0;
        i = rand() % 1000;
        j = rand() % 1000;
        return std::make_tuple(i, j);
    }

    inline bool is_in_circle(std::tuple<int, int> point)
    {
        if ((pow(std::get<0>(point), 2) + pow(std::get<1>(point), 2)) <= pow(1000, 2))
            return true;
        else
            return false;
    }

    inline double pi(void)
    {
        srand(time(NULL));
        long long int in_circle = 0;
        long long int out_circle = 0;
        for (int i = 0; i < LOOPS; i++)
        {
            if (is_in_circle(Throw_points()))
                in_circle++;
            out_circle++;
        }
        return double(in_circle) / double(out_circle) * 4;
    }

経由で電話をかけるpi()

4

3 に答える 3

1

私はこれで少し遊んだだけです。実際、元の投稿 (私自身のものを含む) へのコメントのすべての提案は、事実上まったく違いがありませんでした.

ただし、タプルを取り除く

inline void Throw_points(int&i, int&j)
{
    i = rand() % 1000;
    j = rand() % 1000;
}

inline bool is_in_circle(int i, int j)
{
    return i*i + j*j < 1000000;        
}

プログラムを 5 倍高速化しました。

ちなみに、ここからboost::progress_timerソリューションを使用しました: C++で関数を実行して経過時間を取得する方法

于 2013-11-11T18:12:27.180 に答える