我使用Aparapi在GPU上的Java程序中进行数字运算。据我所知,Aparapi很好地使用了浮点数组。
我想使用Aparapi计算Pi到小数点的第N位。我正在考虑使用Leibniz方法,但我不确定如何以浮点数或整数形式表示和存储长小数。
整数数组可以工作吗,数组的大小是所需的N个小数?
int[] digits = new int[N];如果我将其与Leibniz方法一起使用,我将需要为我找到的M项计算N个整数数组(Liebniz表示pi/4 =1- 1/3 + 1/5 - 1/7 +1/9...),然后将它们相加,并将得到的数字乘以4。但这意味着我需要为我计算的每个项分配许多整数,这将增加并真正消耗内存。
tl;dr:我如何使用浮点运算的循环来计算Pi,这样我就可以用Aparapi来计算Pi了?
非常感谢!
发布于 2013-05-25 05:11:35
您需要减少将m个元素部分添加到@Local注释数组中(用于aparapi中的本地内存)。假设有N个total元素,因此您需要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
https://stackoverflow.com/questions/14065929
复制相似问题