0

そこで、CUDA と GPU プログラミングについて少し読みました。グローバル メモリへのアクセスが遅い (共有メモリを使用する必要がある) ことや、ワープ内のスレッドの実行パスが分岐してはならないことなど、いくつか気付きました。

また、プログラマー マニュアルとnbody problemに記載されている (密な) 行列乗算の例も調べました。そして、実装のトリックは同じようです。計算をグリッドに配置します(行列 mul の場合はすでにそうです)。次に、グリッドを小さなタイルに分割します。タイルを共有メモリにフェッチし、グローバル メモリから共有メモリにデータを再ロードする必要があるまで、スレッドに可能な限り長く計算させます。

nbody 問題の場合、各物体間相互作用の計算はまったく同じです (682 ページ)。

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

2 つのボディと 1 つの加速度ベクトルが必要です。ボディ ベクトルには、位置と重みの 4 つのコンポーネントがあります。論文を読むと、計算は簡単に理解できます。

しかし、動的なデータ構造を持つ、より複雑なオブジェクトがある場合はどうなるでしょうか? ここでは、他のオブジェクトのリストが添付され、添付されたオブジェクトの数がスレッドごとに異なるオブジェクト (論文で提示された body オブジェクトに類似) があると仮定します。スレッドの実行パスを分岐させずに実装するにはどうすればよいですか?

また、より複雑なデータ構造を含むさまざまなアルゴリズムを CUDA で効果的に実装する方法を説明している文献も探しています。

4

1 に答える 1

2

あなたの質問はやや一般的なので、ここではいくつかの一般的なアプローチを示します。

  • すべてのオブジェクトが同じサイズ (ゼロなど) になるようにデータをパディングします。

  • 同様のデータをワープに収まるように再編成します。発散はワープ内でのみ発生し、複数のワープ間では発生しません

  • ワープのスレッドは常に同期しています。可能かつ必要に応じて、データを 33 未満の 2 の累乗に分割して、明示的な同期を回避します。

  • 多少のズレがあっても大丈夫

  • 役立つ場合は、C++ テンプレートを使用して、カーネル フローをガイドします。

于 2010-05-11T01:00:20.880 に答える