24

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

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

但这肯定不是计算常数的最快算法。之前,当我在单线程 CPU 上进行此练习时,我使用类似 Machin 的公式进行计算,以实现更快的收敛。对于那些感兴趣的人,这涉及将 pi 表示为反正切的总和并使用泰勒级数来评估表达式。

这种公式的一个例子:

在此处输入图像描述

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

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

4

1 回答 1

19

您应该使用Bailey–Borwein–Plouffe 公式

为什么?首先,你需要一个可以分解的算法。所以,我首先想到的是将 pi 表示为无限和。然后,每个处理器只计算一个项,最后将它们全部相加。

然后,最好每个处理器处理小精度值,而不是非常高精度的值。例如,如果你想要十亿个小数,并且你使用这里使用的一些表达式,比如Chudnovsky 算法,你的每个处理器都需要处理十亿个长数字。这根本不是 GPU 的合适方法。

所以,总而言之,BBP 公式将允许您单独计算 pi 的数字(该算法非常酷),并且使用“低精度”处理器!阅读“用于 π 的 BBP 数字提取算法”

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

于 2012-06-05T02:22:54.277 回答