【发布时间】:2013-11-12 02:23:43
【问题描述】:
我编写了一个 C++ 程序,用于通过“将随机点放入四分之一圆并计算它们等”来计算 pi。现在我的程序在我看来有点慢,我已经考虑过一些改进来加快它(源代码如下)。
我的第一个想法是使用 OpenMP 使其成为多线程,即将 (I) 和 (II) 之间的代码拆分为多个线程,这样我就可以进行近十倍的循环,而不必等待更长时间(在八核系统上)。
我的另一个想法是使用全局变量和指针,这样我只需要复制指针而不是整数元组。缺点是(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()
【问题讨论】:
-
计算
π的方法很慢; IIRC 我的数学课程,精度是1/sqrt(LOOPS)(但我可能是错的)。所以阅读一些数学书籍来更快地计算π!并阅读approximations of π 上的维基页面 -
不会有多大帮助,但是你应该缓存
pow(1000, 2)的结果,或者最后用1000*1000替换它,这比pow快很多,编译器会缓存结果给你。 -
@BasileStarynkevitch:我必须使用这种方法,否则我已经切换了......
-
然后使用openmp
#pragma-s -
另外,在is_in_circle的函数参数中加一个&。你现在继续复制你的元组,而你可以通过引用传递它。 @ViníciusGobboA.deOliveira 关于省略 pow(...) 的评论也适用于其他平方运算:我希望
std::get<0>(point) * std::get<0>(point)比pow(std::get<0>(point), 2)快得多。
标签: c++ multithreading