c - 需要一种算法来与 c 中的 pthread 并行计算 pi

标签 c algorithm parallel-processing pthreads pi

在快速回答之前,我想先解释一下我的需求。我正在开发一个 C-Posix 项目,专注于使用 Pthreads 进行并行计算。我做了研究,发现了几十种计算 Pi 的算法:Bailey–Borwein–Plouffe 公式、Machin-like 公式、Leibniz π 公式、Chudnovsky 算法、monte-carlo、Ramanujan 等。 问题是,就速度收敛或每次迭代的位数而言,我不需要“最佳”算法,因为获取 pi 本身并不是项目的目标。该项目的真正目标是比较使用 pthreads 解决串行和并行的相同编程问题的性能。 例如,在项目结束时,我希望得到这样的比较表:

enter image description here

说完所有这些之后,我需要一个尽可能简单的算法,可以简单地在 pthreads 中进行编码(不是 MPI、OpenMP 或类似的)(令人尴尬的并行将是一个完美的选择),最后但并非最不重要的算法必须合适才能表现出对并行化有很大影响

PD:如果任何人能够提出适合该项目的任何其他并行计算,我也将不胜感激。

谢谢!

最佳答案

用于逼近 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 对于每个线程都是独立的,这一点很重要,否则运行多个线程不会带来任何改进。

关于c - 需要一种算法来与 c 中的 pthread 并行计算 pi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35425900/

相关文章:

java - 如何解释 "StrangeLoop"的所有可能结果值?

c - 可以说当传递给 C 中的函数时所有参数或自变量都被复制了吗?

c - 数组直方图主

algorithm - 确保不再看到已查看的项目

algorithm - 根据变化率计算敌人的生命值(外推)?

parallel-processing - 数据多核并行计算,随程序独立运行

c - 编译良好的 C 程序中的段错误

c程序可以 `uint8_t`指向一个大小为32位的地址

algorithm - 由一组基点描述的曲线(样条曲线、贝塞尔曲线路径等)

java - 亚马逊云基础设施或任何其他云所有者是否向教育用户(例如学生或大学讲师)提供免费服务?