【问题标题】:Need an algorithm to calculate pi in parallel with pthreads in c [closed]需要一种算法来与 c 中的 pthreads 并行计算 pi [关闭]
【发布时间】:2016-02-16 07:04:07
【问题描述】:

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

说了这么多之后,我需要一个尽可能简单的算法,在 pthreads 中进行简单的编码(不是 MPI、OpenMP 或类似的)(令人尴尬的并行将是一个完美的选择),最后但并非最不重要的是算法必须适合显示对并行化的巨大影响

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

谢谢!

【问题讨论】:

  • 至于“其他并行计算”,想想一个程序,它需要对大量输入记录进行某种操作(pfff,比如,字符串反转?)。
  • 质数计算可以并行化。不是为了一个单独的数字[不值得],但你可以做 master/worker 并让 master 保持喂食范围(例如 2-1000 --> 线程 0、1000-2000 --> 线程 1)。当一个线程完成它的范围时,它会向 master 请求一个新的范围。或者,只是让每个线程根据线程数计算它。但是,话又说回来,也许一个单独的数字并行可能会很有趣。
  • 听起来不错。在等待该线程的响应时,我将研究这些类型的算法。谢谢。
  • 你的桌子一开始就有缺陷。您必须考虑创建和删除线程所需的时间,否则您的基准测试是无稽之谈。这意味着像 10 次甚至 1000 次迭代这样的情况在并行时可能会慢得多。
  • 另外,“吸血鬼数字”怎么样。请参阅stackoverflow.com/questions/32834843/… 另请参阅:reddit.com/r/dailyprogrammer/comments/3moxid/… 您可以比“4 2”和“6 3”订单高得多,甚至可以进入多精度数学。不像看起来那么容易

标签: c algorithm parallel-processing pthreads pi


【解决方案1】:

一种近似 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 在 cmets 中提到的,重要的是 RNG 对于每个线程都是独立的,否则运行多个线程不会有任何改进。

【讨论】:

  • 假设 10000 次迭代和 10 个线程池,线程可能看起来像这样: for(i=0;i
  • @holyknight 看起来对我来说很合适。
  • @holyknight 顺便说一句,您仍然可以使用反引号(即`)将某些内容标记为代码code
  • 太好了,会试试这个。 PD:我在 stackoverflow 上做了很多阅读,但我仍然不习惯这个平台:D
  • 使用并行 Monte-Carlo 方法要避免的一个潜在陷阱是,您需要确保对随机数使用每线程 PRNG。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2013-11-02
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多