問題タブ [aparapi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - aparapi でレーベンシュタイン距離を計算する
APARAPI を使用してレーベンシュタイン距離アルゴリズムを実装する可能性を検討していますが、制限が課せられていくつかの問題に直面しています。具体的には、禁止されているカーネルで配列を作成する必要があるということです。
これを回避する方法はありますか、または APARAPI で動作するレーベンシュタイン距離の方法を誰かが得た方がよいでしょうか?
添付のコードは、APARAPI を整理するための場所にあるだけです。結果に対して何もしていないことはわかっており、現時点では 1 回だけ実行しています。
java - アパラピスレからの帰り
Aparapi を使用していますが、必要なデータを返すことができません。Aparapi がスレッドと同様に機能することを発見しました。
このコードから、見つかったものを自分のリターンに返そうとしています。
parallel-processing - OpenCL を使用しながら do... を並列化する
原則
そのような単純な計算は、精巧に並列化する価値がないことはわかっています。これはそのような例であり、数学演算は、より興味深い計算の単なるプレースホルダーです。
【疑似コード】
最も特殊な表現は次のとおりoutput[id] !== 25
です。つまり、次のことを意味します: input
4 つの要素 (この順序で) がある場合:[8, 5, 2, 9]
でoutput
ある必要があり、 or[64, 25]
の 2 乗は のアイテムとして使用されません(はandのためであるため)。2
9
output
output[id] !== 25
true
id = 1
input[id] = 5
このコードを最適化する場合、input[id]
事前に (2 番目の条件を証明せずにwhile
) の 2 乗を計算することをお勧めしますが、結果が後で関連するという保証はありません (前の計算の結果が 25 だった場合)。 、現在の計算の結果は興味深いものではありません)。
一般化して、私は計算結果 output[id]
( output[id] = calculateFrom(input[id]);
) がすべてに関連していないid
可能性があるケースについて話しています。結果 ( ) の必要性は、output[id]
別の計算の結果に依存します。
私の目標
OpenCLカーネルとキューを使用して、このループを可能な限り並列かつ高性能に実行したいと考えています。
私のアイデア
私は考えました:そのような
do...while
ループを並列化できるようにするには、事前にいくつかの計算(output[id] = calculateFrom(input[id]);
)を同時に行う必要があります(結果output[id]
が役立つかどうかはわかりません)。そして、前の結果が だった場合、結果は25
単純output[id]
に拒否されます。の確率を考えたほうがいいかもしれません
output[id] !== 25
。確率が非常に高い場合、結果が拒否される可能性があるため、事前に多くの計算を行うことはありません。確率が絶対に低い場合は、事前により多くの計算を行う必要があります。処理ユニットの現在のステータスをリッスンする必要があります。すでに過緊張している場合は、重要でない事前計算を行うべきではありません。しかし、事前計算を処理するのに十分なリソースがある場合は、そうではありません。- 理由: 事前計算と以前の計算 (これらの事前計算が依存している) が同時に処理される場合、事前計算の追加によって以前の計算が遅くなる可能性もあります - (私の2番目の質問を参照してください)
私の質問
- そのようなプログラムを並列化することは賢明ですか、それとも高性能ですか?
- プロセッシング ユニットに事前計算処理を行うのに十分なリソースがあるかどうかは、どの基準に基づいて判断すればよいですか? または:プロセッシング ユニットに負荷がかかりすぎているかどうかを確認するにはどうすればよいですか?
do...while
そのようなsを並列化するための他の計画について知っていますか? それについて何か考えはありますか?
私があなたに伝えたいことが常に明確であることを願っています。そうでない場合は、私の質問にコメントしてください。- ご回答とご協力ありがとうございます。
java - Java3Dと同様のjMonkey最適化
編集:リアルタイム描画を行うために、openglとopenclの間の「相互運用性」でjmonkeyengineとjoclのベースであるlwjglの使用を開始し、100k個の粒子をリアルタイムで計算して描画できるようになりました。たぶん、jmonkeyエンジンのマントルバージョンは、このドローコールオーバーヘッドの問題を解決することができます。
数日間、Eclipse(java 64ビット)でjMonkeyエンジン(ver:3.0)を学び、GeometryBatchFactory.optimize(rootNode);
コマンドを使用してシーンを最適化する方法を試してきました。
最適化なし(球の位置を変更する機能あり):
さて、1fpsのみがpci-express帯域幅とjvmオーバーヘッドの両方から発生します。
最適化あり(球の位置を変更する機能なし):
三角数を増やしても29fpsになりました。
Java3DにはsetCapability()
、最適化された形式でもシーンオブジェクトを読み書きできるようにするメソッドがありました。jMonkey engine 3.0はこの主題に対応している必要がありますが、その痕跡は見つかりませんでした(チュートリアルと例を検索しましたが、失敗しました)。
質問: jMonkey 3.0でシーンread/write position/rotation/scale
のノードの機能を設定するにはどうすればよいですか?optimized
最初の質問に答えられない場合、最適化コマンドを使用すると三角数が増える理由を教えてください。グラフィックカードにアクセスして変数を自分で変更するための新しいメソッドを作成する必要がありますか(joglかもしれませんか?)?
シーン情報:16kパーティクル(16x16解像度の球)+ 1ポイントライト(およびその4096の解像度のシャドウ)。
pci-expressを介して、ミリ秒で数千のフロート番号を簡単に送信できると確信しています。
- 追加情報:10ミリ秒かかる粒子位置を更新するためにAparapi-kernelsを使用しています(力を計算するために16k * 16kの相互作用)(最適化モードでは何も変更されません:()aparapiはそれらの最適化されたデータにアクセスできますか?
最適化の場合、batchNode.batch();
オブジェクト番号を減らした1fpsを次に示します。
オブジェクト数は数百になりましたが、fpsはまだ1です!
球の位置だけをgpuに送信し、頂点の位置を計算させる方が、cpuで頂点を計算し、さらに巨大なデータをgpuに送信するよりも優れている可能性があります。
誰も助けてくれませんか?すでにbatchNodeを試しましたが、十分に役立ちませんでした。
jMonkeyの人々はすでに車輪の再発明を行っており、現在の状況に満足しているため、3DAPIを変更したくありません。もう少しパフォーマンスを絞り込もうとすると(シャドウをキャンセルすると100%の速度が得られますが、品質も重要です!)。
このJavaプログラムは、LOD(数百万の粒子)を使用したマーチングキューブアルゴリズムを備えた小惑星衝突シーンシミュレーター(小惑星のサイズ、質量、速度、角度の選択があります)になります。
マーチングキューブアルゴリズムは、三角数を大幅に減らします。質問に答えられなかった場合は、Java用のマーチングキューブ(またはO(n)凸包)アルゴリズムが受け入れられます!データ:ソースとしてのx、y、z配列、およびターゲットとしての三角ストリップ配列(等値面メッシュポイント)
ありがとう。
ストリームに関するいくつかのサンプルを次に示します(はるかに低い解像度)。
1)重力による立方体の岩のグループの崩壊:
2)排除力が現れ始めます:
3)排除力+重力により、グループはより滑らかな形状になります。
4)グループは球を形成します(予想通り):
5)次に、大きな恒星の体が近づきます:
6)触れようとしています:
7)衝撃の瞬間:
Barnes-Huttアルゴリズムと切り捨てられたポテンシャルの助けを借りて、粒子数は10倍(おそらく100倍)多くなります。
マーチングキューブアルゴリズムではなく、nbodyを包むゴーストクロスは、低解像度の船体を与えることができます(BHよりも簡単ですが、より多くの計算が必要です)
ゴーストクロスはnbody(重力+除外)の影響を受けますが、nbodyはそれを包む布の影響を受けません。Nbodyはレンダリングされませんが、クロスメッシュはより少ない三角形の数でレンダリングされます。
MC以上が機能する場合、これにより、プログラムは約200倍多くのパーティクルの包装布をレンダリングできます。
java - 浮動小数点数または整数配列を使用した円周率の計算
Aparapi を使用して、GPU 上の Java プログラム内で数値処理を行っています。私が理解していることから、Aparapi は float 配列でうまく機能します。
Aparapi を使用して、Pi を N 番目の小数まで計算したいと考えています。ライプニッツ法を使用することを考えていますが、長小数を浮動小数または整数形式で表現および格納する方法がわかりません。
配列のサイズが必要な小数の N 数である場合、整数の配列は機能しますか?
これをライプニッツ法で使用する場合、見つけた M 個の項について N 個の整数の配列を計算する必要があります (リープニッツは pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 と言っています....)、それらを足し合わせて、結果の数値を 4 倍します。しかし、これは、計算した項ごとに M 個の整数を割り当てる必要があることを意味します。
tl;dr: float 演算のループを使用して Pi を計算するにはどうすればよいので、Aparapi で実行できますか?
本当にありがとう!
aparapi - getGlobalId() の aparapi 開始インデックス
並列化に aparapi を使用し、この Java コードを変換したい:
aparapi で同等のものに:
java - Aparapi はタスクの並列処理を提供しますか?
aparapi (Open CL 用の Java の API) は、タスクの並列処理を提供するか、データの並列処理のみを提供します。タスクの並列処理を提供する場合、タスクが別々のデバイスで実行されることが保証されますか?