「円の 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()