3

典型的な N 体問題である、特定のポテンシャルを受ける粒子の軌道を計算したいと考えています。GPU(CUDAなど)を利用する方法を研究してきましたが、Nが大きい(20000)シミュレーションにメリットがあるようです。通常、最もコストのかかる計算は力を見つけることなので、これは理にかなっています。

ただし、私のシステムには「低い」N (20 未満)、多くの異なるポテンシャル/因子、および多くの時間ステップがあります。このシステムを GPU に移植する価値はありますか?

Fast N-Body Simulation with CUDAの記事に基づくと、異なる計算 (加速度や力など) に対して異なるカーネルを使用することが効率的であると思われます。N が低いシステムの場合、デバイスとの間でのコピーのコストは、各タイム ステップで各カーネルのデバイスからデータをコピーして取得する必要があるため、実際にはかなりの量になるようです。

どんな考えでも大歓迎です。

4

2 に答える 2

3

並列でシミュレートする必要があるエンティティが 20 個未満の場合は、通常のマルチコア CPU で並列処理を使用するだけで、GPU を使用する必要はありません。

マルチコア CPU を使用すると、プログラミングがはるかに簡単になり、すべての操作を GPU 操作に変換する手順を回避できます。

また、すでに提案したように、GPU を使用した場合のパフォーマンスの向上は、この少数のプロセスでは小さい (またはマイナスになることさえあります) でしょう。

于 2012-09-26T11:53:15.730 に答える
1

デバイスからホストに結果をコピーし、タイム ステップ間で結果をコピーする必要はありません。シミュレーション全体を GPU で実行し、いくつかのタイム ステップが計算された後にのみ結果をコピーします。

シミュレーションを実行するには、いくつの異なるポテンシャルが必要ですか? N体の例の構造を使用するだけで、GPU全体をロードするだけで十分ですか?

そうでない場合、潜在的な計算が高価であると仮定すると、問題を十分に並列化するために、粒子のペアごとに 1 つのスレッドを使用するのが最善だと思います。潜在的な設定ごとに 1 つのブロックを使用する場合、力を共有メモリ __syncthreads() に書き出し、ブロックのスレッドのサブセット (パーティクルごとに 1 つ) を使用して力を合計できます。__syncthreads() を再度実行し、次の時間ステップに進みます。

潜在的な計算に費用がかからない場合は、シミュレーションの主な費用がどこにあるかを最初に調べる価値があるかもしれません。

于 2012-09-26T09:29:06.930 に答える