1

Aparapi を使用して、GPU 上の Java プログラム内で数値処理を行っています。私が理解していることから、Aparapi は float 配列でうまく機能します。

Aparapi を使用して、Pi を N 番目の小数まで計算したいと考えています。ライプニッツ法を使用することを考えていますが、長小数を浮動小数または整数形式で表現および格納する方法がわかりません。

配列のサイズが必要な小数の N 数である場合、整数の配列は機能しますか?

int[] digits = new int[N];

これをライプニッツ法で使用する場合、見つけた M 個の項について N 個の整数の配列を計算する必要があります (リープニッツは pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 と言っています....)、それらを足し合わせて、結果の数値を 4 倍します。しかし、これは、計算した項ごとに M 個の整数を割り当てる必要があることを意味します。

tl;dr: float 演算のループを使用して Pi を計算するにはどうすればよいので、Aparapi で実行できますか?

本当にありがとう!

4

1 に答える 1

2

@Local 注釈付き配列 (aparapi のローカルメモリに使用) に m 要素を部分的に追加するには、削減が必要です。合計 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,3,4,5 の代わりに (+/-)(1/(2*n+1)) があります。

于 2013-05-24T21:11:35.290 に答える