2012-12-28 85 views
1

我使用Aparapi在GPU上的Java程序內部進行數字運算。據我所知,Aparapi在浮點陣列中扮演着不錯的角色。使用浮點數或整數數組計算Pi

我想使用Aparapi來計算Pi到第N小數。我正在考慮使用Leibniz方法,但我不確定如何處理以浮點或整數形式表示和存儲長整數的小數。

整數數組是否可以工作,數組的大小是想要的N位小數?

int[] digits = new int[N]; 

如果我與萊布尼茨方法利用這一點,我將需要計算N個整數對於M術語我找到的陣列(Liebniz說PI/4 = 1 - 1/3 1/5 + - 1/7 + 1/9 ....),然後將它們相加並將結果數字乘以4.但是這意味着我需要爲我計算的每個術語分配M個整數,這會加起來並且真的會對記憶產生影響。

tl; dr:我怎樣才能使用浮動操作的循環來計算Pi,所以我可以用Aparapi來做到這一點?

非常感謝!

+0

這是計算pi的真*慢方法。 – Blender

+0

這就是爲什麼我希望有人有更好的方式來做這件事,同時仍然使用較小的數據類型 –

+0

無論您的算法如何,您仍然可以以某種方式存儲數字。這是一個更快的算法:http://stackoverflow.com/questions/14065929/calculating-pi-using-float-or-integer-arrays#comment19442832_14065929 – Blender

回答

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