我开始学习CUDA,我认为计算pi的长数字将是一个很好的介绍性项目 .
我已经实现了简单的Monte Carlo方法,该方法很容易并行化 . 我只是让每个线程在单位正方形上随机生成点,计算单位圆内有多少点,并使用缩小操作计算结果 .
但这当然不是计算常数的最快算法 . 之前,当我在单线程CPU上进行此练习时,我使用Machin-like formulae进行计算以获得更快的收敛 . 对于那些感兴趣的人,这涉及将pi表示为反复数据的总和并使用泰勒级数来评估表达式 .
这样一个公式的一个例子:
不幸的是,我发现将这种技术并行化到数千个GPU线程并不容易 . 问题是大多数操作只是进行高精度数学运算,而不是对长数据向量进行浮点运算 .
所以我想知道, what is the most efficient way to calculate arbitrarily long digits of pi on a GPU?
1 回答
你应该使用Bailey–Borwein–Plouffe formula
为什么?首先,您需要一个可以分解的算法 . 因此,我想到的第一件事就是将pi表示为无限和 . 然后,每个处理器只计算一个术语,最后将它们全部加起来 .
然后,优选地,每个处理器操纵小精度值,而不是非常高精度的值 . 例如,如果您想要十亿个小数,并且使用here使用的某些表达式,例如Chudnovsky algorithm,则每个处理器都需要操作十亿个长数 . 这根本不适合GPU .
所以,总而言之,BBP公式将允许您分别计算pi的数字(算法非常酷),以及“低精度”处理器!阅读“π的BBP数字提取算法”