首页 文章

并行计算Pi的快速算法

提问于
浏览
20

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

我已经实现了简单的Monte Carlo方法,该方法很容易并行化 . 我只是让每个线程在单位正方形上随机生成点,计算单位圆内有多少点,并使用缩小操作计算结果 .

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

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

enter image description here

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

所以我想知道, what is the most efficient way to calculate arbitrarily long digits of pi on a GPU?

1 回答

  • 13

    你应该使用Bailey–Borwein–Plouffe formula

    为什么?首先,您需要一个可以分解的算法 . 因此,我想到的第一件事就是将pi表示为无限和 . 然后,每个处理器只计算一个术语,最后将它们全部加起来 .

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

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

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

相关问题