私は最近、これらの回答のいくつかを出発点としてこの問題に取り組みました。覚えておくべき最も有用なことは、ボイドは一種の単純なn体シミュレーションであるということです。各ボイドは、隣接する物体に力を及ぼす粒子です。
Lindeの論文は読みにくいと感じました。代わりに、SJプリンプトンの「短距離分子動力学のための高速並列アルゴリズム」を参照することをお勧めします。Plimptonの論文は、より読みやすく詳細な図で詳細に記載されています。
一言で言えば、原子分解法は原子のサブセットを各プロセッサに永久に割り当て、力分解法はペアワイス力計算のサブセットを各プロシージャに割り当て、空間分解法はシミュレーションボックスのサブ領域を各プロシージャに割り当てます。 。
ADを試すことをお勧めします。理解して実装するのが最も簡単です。FDは非常に似ています。FDを使用したCUDAを使用したnVidiaのnボディシミュレーションを次に示します。これにより、タイリングとリダクションがどのようにシリアルパフォーマンスを大幅に上回るかをおおまかに理解できます。
SDの実装は一般に最適化手法であり、実装するにはある程度の振り付けが必要です。彼らはほとんど常により速く、より良いスケーリングです。
これは、AD / FDが各Boidの「隣接リスト」を構築する必要があるためです。すべてのboidがその近傍の位置を知る必要がある場合、それらの間の通信はO(n ²)。あなたはすべてのステップのすべてのいくつかのタイムステップの代わりにリストを再構築することを可能にする地域ごとBOIDチェックのサイズを小さくするためにVerletの隣接リストを使用することができますが、それはまだO(だN ²)。SDでは、各セルに隣接リストが保持されますが、AD / FDではすべてのボイドに隣接リストがあります。したがって、すべてのboidが互いに通信する代わりに、すべてのセルが互いに通信します。通信速度の低下は、速度の向上の原因です。
残念ながら、ボイドの問題はSDをわずかに妨害します。各プロセッサがセルを追跡することは、ボイドが領域全体にある程度均等に分散している場合に最も有利です。しかし、あなたしたいクラスタ一緒にboidsを!群れが適切に動作している場合、プロセッサの大部分は刻々と過ぎて空のリストを相互に交換し、セルの小さなグループはADまたはFDと同じ計算を実行します。
これに対処するには、セルのサイズ(定数)を数学的に調整して、任意の時点で空のセルの数を最小限に抑えるか、クアッドツリーにBarnes-Hutアルゴリズムを使用します。BHアルゴリズムは非常に強力です。逆説的に、並列アーキテクチャに実装することは非常に困難です。これは、BHツリーが不規則であるため、並列スレッドが大幅に変化する速度でツリーを横断するため、スレッドの発散が発生するためです。SalmonとDubinskiは、直交再帰二分法アルゴリズムを提示して、プロセッサ間でクアッドツリーを均等に分散しました。これは、ほとんどの並列アーキテクチャで繰り返し修正する必要があります。
ご覧のとおり、この時点で明らかに最適化と黒魔術の領域にいます。繰り返しになりますが、Plimptonの論文を読んで、それが意味をなすかどうかを確認してください。