そこで、CUDA と GPU プログラミングについて少し読みました。グローバル メモリへのアクセスが遅い (共有メモリを使用する必要がある) ことや、ワープ内のスレッドの実行パスが分岐してはならないことなど、いくつか気付きました。
また、プログラマー マニュアルとnbody problemに記載されている (密な) 行列乗算の例も調べました。そして、実装のトリックは同じようです。計算をグリッドに配置します(行列 mul の場合はすでにそうです)。次に、グリッドを小さなタイルに分割します。タイルを共有メモリにフェッチし、グローバル メモリから共有メモリにデータを再ロードする必要があるまで、スレッドに可能な限り長く計算させます。
nbody 問題の場合、各物体間相互作用の計算はまったく同じです (682 ページ)。
bodyBodyInteraction(float4 bi, float4 bj, float3 ai)
2 つのボディと 1 つの加速度ベクトルが必要です。ボディ ベクトルには、位置と重みの 4 つのコンポーネントがあります。論文を読むと、計算は簡単に理解できます。
しかし、動的なデータ構造を持つ、より複雑なオブジェクトがある場合はどうなるでしょうか? ここでは、他のオブジェクトのリストが添付され、添付されたオブジェクトの数がスレッドごとに異なるオブジェクト (論文で提示された body オブジェクトに類似) があると仮定します。スレッドの実行パスを分岐させずに実装するにはどうすればよいですか?
また、より複雑なデータ構造を含むさまざまなアルゴリズムを CUDA で効果的に実装する方法を説明している文献も探しています。