我正在使用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做到?
非常感谢!
答案 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