并行计算Pi的快速算法

时间:2012-06-05 01:53:36

标签: algorithm parallel-processing cuda numerical-methods pi

我开始学习CUDA,我认为计算pi的长数字将是一个不错的介绍性项目。

我已经实现了易于并行化的简单蒙特卡罗方法。我只需让每个线程在单位正方形上随机生成点,计算单位圆内有多少点,并使用缩小操作计算结果。

但这当然不是计算常数的最快算法。之前,当我在单线程CPU上进行此练习时,我使用Machin-like formulae进行计算以获得更快的收敛。对于那些感兴趣的人,这包括将pi表示为反复数组的总和,并使用泰勒级数来评估表达式。

这样一个公式的一个例子:

enter image description here

不幸的是,我发现将这种技术并行化到数千个GPU线程并不容易。问题是大多数操作只是进行高精度数学运算,而不是对长数据向量进行浮点运算。

所以我想知道,在GPU上计算pi的任意长数字的最有效方法是什么?

1 个答案:

答案 0 :(得分:14)

您应该使用Bailey–Borwein–Plouffe formula

为什么呢?首先,您需要一个可以分解的算法。所以,我想到的第一件事就是将pi表示为无限和。然后,每个处理器只计算一个术语,最后总结它们。

然后,优选的是每个处理器操纵小精度值,而不是非常高精度的值。例如,如果您想要十亿个小数,并且使用here使用的某些表达式,例如Chudnovsky algorithm,则每个处理器都需要操作十亿个长数。这根本不适合GPU。

所以,总而言之,BBP公式将允许您分别计算pi的数字(算法非常酷),以及“低精度”处理器!阅读“π的BBP数字提取算法”

  

BBP算法计算π的优点   该算法计算π,而不需要具有数千甚至数百万个数字的自定义数据类型。该方法计算第n个数字而不计算前n个1位数,并且可以使用小型,高效的数据类型。   该算法是计算第n个数字(或第n个邻域中的几个数字)的最快方法,但是当目标是计算从1到n的所有数字时,使用大数据类型的π计算算法仍然更快。 / p>