我开始学习CUDA,我认为计算圆周长的数字将是一个不错的,介绍项目。
我已经实现了简单的蒙特卡洛方法,它是很容易并行化,能。 我只是有每个线程随机生成对单位正方形点,在单位圆内找出多少谎言,并从中总结使用的归约运算结果。
但是,这肯定是不计算常数最快的算法。 以前,当我做了一个单线程CPU在这个练习中,我用梅钦类公式做计算远快收敛。 对于那些有兴趣,这涉及到表达pi作为arctangents的和,并用泰勒级数来计算表达式。
这样的公式的一个示例:
不幸的是,我发现,这种并行技术,数以千计的GPU线程是不容易的。 问题是,大部分的操作都简单地做高精度的数学,而不是对数据的长向量做浮点运算。
所以,我想知道, 什么是计算在GPU上PI的任意长的位数的最有效方法是什么?
您应该使用贝利-波尔温-普劳夫公式
为什么? 首先,你需要一个算法,它可以分解。 所以,这来到我的脑海里的第一件事是有PI的表示为一个无限的总和。 然后,每个处理器只计算一个词,你总结他们都在最后。
然后,优选的是,每个处理器操纵小精度值,而不是非常高的精度的。 例如,如果你想要一块十亿小数,并使用一些使用表达式的位置 ,像楚德诺夫斯基算法 ,每个处理器都需要操纵十亿长的数字。 这根本不是一个GPU适当的方法。
因此,所有的一切,BBP公式可以让你计算圆周率的数字分开(该算法是非常酷),并以“低精度”处理器! 阅读“为πBBP数字提取算法”
BBP的算法计算π这个算法的优点计算π,而不需要有十万甚至上百万的数字自定义数据类型 。 该方法计算的第n个位,而不计算第一n - 1位,并且可以使用小的,有效的数据类型 。 该算法是计算第n个数字(或第N个相邻的几个数字),最快的方法,但使用大数据类型π的计算算法保持较快时,目标是计算所有从1到n的数字。