使用浮点数或整数数组计算Pi

时间:2012-12-28 07:05:00

标签: java pi aparapi

我正在使用Aparapi在GPU上的Java程序中进行数字运算。根据我的理解,Aparapi与浮点数组合很好。

我想使用Aparapi将Pi计算到第N个小数。我正在考虑使用Leibniz方法,但我不确定如何处理以float或整数形式表示和存储长小数。

整数数组是否有效,数组的大小是否需要N个小数?

int[] digits = new int[N];

如果我在Leibniz方法中使用它,我需要为我找到的M个项计算N个整数的数组(Liebniz说pi / 4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 ....),然后将它们加在一起并将得到的数字乘以4.但这意味着我需要为计算的每个术语分配M个整数,这会加起来并且确实需要收费记忆中。

tl; dr:如何使用浮点运算循环计算Pi,这样我就能用Aparapi做到?

非常感谢!

1 个答案:

答案 0 :(得分:2)

您需要进行缩减以在@Local带注释的数组中部分添加m个元素(用于aparapi中的本地内存)。假设总共有N个元素,因此您需要N / m部分总和,这需要更快的带宽(因此在本地存储器中)。

你也应该使用localBarrier();同步本地工作组中的计算单元或工作单元中的核心。然后将数据发送到主存储器。

非常简短的例子:

你需要1 + 2 + 3 + 4 + 5 + 6 + .....并且每个计算单位的gpu你有3个核心。

1 + 2在核心编号1中完成

3 + 4在核心编号2中完成

5 + 6在核心编号3中完成

然后在本地内存中添加内核的输出,该输出由该计算单元的所有邻居内核共享。

最后你得到一个数组中的3,7,11,在本地内存中总计为21。

将所有计算单元的所有这些数据上传到主内存,例如21,57,....然后你可以简单地在cpu中添加它们。

当然会有(+/-)(1 /(2 * n + 1))而不是1,2,3,4,5