Fast algorithm to calculate Pi in parallel
我开始学习CUDA,我认为计算圆周率的长数字是一个不错的入门项目。
我已经实现了简单的蒙特卡罗方法,它很容易并行化。我只需要让每个线程在单位正方形上随机生成点,计算出单位圆内有多少个点,然后使用一个约简操作来计算结果。
但这肯定不是计算常数最快的算法。以前,当我在单线程CPU上做这个练习时,我使用类似机器的公式来计算更快的收敛速度。对于那些感兴趣的人,这涉及到将圆周率表示为弧切线的和,并使用泰勒级数来计算表达式。
这种公式的一个例子:
不幸的是,我发现将此技术与数千个GPU线程并行并不容易。问题是,与对长向量数据进行浮点运算相比,大多数运算只是简单地进行高精度数学运算。
所以我想知道,计算GPU上任意长的π的最有效方法是什么?
你应该使用贝利-博文-普洛夫公式。
为什么?首先,你需要一个可以分解的算法。所以,我想到的第一件事是,把π表示成一个无穷和。然后,每个处理器只计算一个术语,最后将它们相加。
然后,与非常高的精度值相比,每个处理器处理较小的精度值更可取。例如,如果您想要10亿个小数,并且使用这里使用的一些表达式,比如chudnovsky算法,那么每个处理器都需要处理10亿个长的数字。对于GPU来说,这根本不是合适的方法。
总之,BBP公式将允许您单独计算pi的数字(算法非常酷),并使用"低精度"处理器!阅读"π的BBP数字提取算法"
Advantages of the BBP algorithm for computing π
This algorithm computes π without requiring custom data types having thousands or even millions of digits. The method calculates the nth digit without calculating the first n ? 1 digits, and can use small, efficient data types.
The algorithm is the fastest way to compute the nth digit (or a few digits in a neighborhood of the nth), but π-computing algorithms using large data types remain faster when the goal is to compute all the digits from 1 to n.