1

タイトルが誤解を招いていないことを願っています。

私の問題は次のとおりです。現在、レイトレーサーを高速化しようとしていますが、これはグラフィックカードの助けを借りて行われています。これにより遅くなったにもかかわらず、正常に動作します。:)

これは、グラフィックス カード (私の「トレース サーバー」) で一度にジオメトリ全体で 1 つのレイをトレースし、結果を取得するという事実が原因です。これは非常に遅いため、いくつかのレイを収集して計算する必要があります。結果を一緒にフェッチして、これを高速化します。

次の問題は、この並列化について何も知らないか、ほとんど知らないはずの周囲のフレームワークを書き直すことが許可されていないことです。

そこで、私のアプローチは次のとおりです。複数のスレッドを使用することを考えました。それぞれが光線を取得し、「トレース サーバー」に交差を計算するように要求します。次に、グラフィックス カードの交点を計算して結果を効率的に戻すのに十分な光線が収集されるまで、スレッドは停止します。これは、結果がフェッチされるまで各スレッドが待機することを意味します。

すでにいくつかの計画があることがわかりますが、次のことはわかりません。

  • プラットフォームに依存しないようにするには、どのスレッド フレームワークを使用する必要がありますか?
  • 固定サイズのスレッドプールを使用するか、必要に応じて作成する必要がありますか?
  • 特定のスレッド ライブラリは、少なくとも 1000 の待機中のスレッドを処理できますか (フェッチを効率的に行うために収集する必要がある数になるため)。

しかし、これを 1 つのスレッドで行うことも想像できます。

  1. その負荷 (新しいレイ) を「トレーシング サーバー」にダンプし、次の負荷をフェッチします。
  2. 結果を取得するには十分です。
  3. 次に、スレッドは結果を 1 つずつ取得し、すべての結果が処理されるまでさらに計算を行い、すべてのレイが完了するまでステップ 1 に戻ります。

また、これを並列化する方法についてより良いアイデアがあれば教えてください。

よろしく、

誰でもない

PS この情報が必要な場合: 私が使用したい 2 つのプラットフォームは、Linux と Windows です。

4

1 に答える 1

2

スレッド ビルディング ブロックまたは boost::thread のいずれかを使用します。

http://www.boost.org/doc/libs/1_46_0/doc/html/thread.html

http://threadingbuildingblocks.org/

threadpool/on-demand-threads に関しては、作成のオーバーヘッドを回避できるため、一般的には threadpool の方が適しています。

待機中のスレッドの数は、基盤となるシステムに何よりも依存します。

Linux のプロセスあたりの最大スレッド数は?

于 2011-07-09T16:30:38.673 に答える