在任何快速回答之前,我想解释一下我的需求。我正在研究一个专注于Pthreads并行计算的C-Posix项目。我做了我的研究,我发现了几十种计算Pi的算法:Bailey-Borwein-Plouffe公式,类似Machin的公式,π的Leibniz公式,Chudnovsky算法,monte-carlo,Ramanujan等。 问题是我在速度收敛或每次迭代的数字方面不需要“最佳”算法,因为获得pi不是项目本身的目标。该项目的真正目标是比较串行和并行与pthreads相同的编程问题的性能。 例如,在项目结束时,我希望得到一个这样的比较表:
在说完所有这些我需要一个简单的算法之后,在pthreads中编码很简单(不是MPI,OpenMP或类似的)(令人尴尬的是并行将是一个完美的契合),最后但并非最不重要的是算法必须适合对并行化产生很大影响
PD:我也很高兴任何可以适应这个项目的任何其他并行计算。谢谢!
答案 0 :(得分:3)
近似pi(任意精度)的蒙特卡罗方法很容易并行化。在伪代码中:
total=0;
inside=0;
while(total<whatever) {
double1=random(0,1); //Random number from zero to 1
double2=random(0,1);
total++;
if(double1**2 + double2**2 < 1) {inside++;}
}
pi=4*inside/total;
循环中的所有内容都可以在任意数量的线程上并行化,您只需要在最后添加结果。
编辑:正如caf在评论中提到的那样,重要的是RNG对每个线程都是独立的,否则你将无法通过运行多个线程获得改进。