0

1 秒間に約 30 回実行される典型的なゲームループがあるとします。1 つの特定の関数に約 50% の時間がかかり、並列化の最有力候補のように見えます。たとえば、大きなループであるか、4 つの別個の独立した作業ストランドが進行中であるとします。関数自体が2 ~ 4 コアに分離して適切に並列化できることを既に確認したと仮定します。

このような場合、OpenMP は高速化する可能性がありますか? 作業を分割するために各フレームで単純に 1 ~ 3 スレッドを作成するのは良くないと思いますが、スレッドの作成/破棄がもたらすオーバーヘッドが 10ms か 100 かはよくわかりません。 OMPがこの種のことで効率的であるか、またはコードの実行時間の長い部分にのみ実際に適している場合。

考え?

4

3 に答える 3

1

多くの OpenMP 実装は、プログラムの開始時に一連のスレッドを開始し、ファイナライズ時にのみ終了します。つまり、実行中に多くの破壊/構築を行いません。ただし、これは実装に依存していると思いますので、状況とドキュメントを注意深く確認する必要があります。

この問題に関する第一原則から議論する必要はありません - テスト !

編集:実装が実行中にスレッドを開始および停止することがわかった場合は、プログラム全体を omp 並列構造でラップし、マスター句を使用して、プログラムのシングルスレッド部分が並列化されないようにすることができます。これは、以前の仕様の実装よりも OpenMP 3.0 の実装がある方がおそらく簡単です。

于 2010-03-11T15:57:23.317 に答える
0

1/30秒ごとにスレッドを作成および破棄することは、おそらくそのパフォーマンスにはなりません。人々はプロファイルを言うでしょうが、重要なマルチスレッドの経験を持つ他の人はシステムコールの数を減らすと言うでしょう。この場合、それらのスレッドを一度作成して、メインスレッドからの要求を実行する方法を理解する方が簡単です。

それがあなたがしているすべてであるならば、あなたはたぶんただ#pragma omp taskそしてを使うことができます#pragma omp taskwait

于 2010-03-11T16:28:39.033 に答える
-3

あまりない。MP = メッセージ パッシング。これらのアルゴリズムは、「1 つのプロセスで 1 秒間に何度も小さなフラグメント」ではなく、高並列クラスター システム (2000 台のコンピューターが同じ処理を行う) 向けに最適化されています。当然、これは、問題が重要な計算を必要とする場合にのみ効率的に機能します。

例:

  • 映画の 3D レンダリングでは、マシンが数分でフレームを計算するため、何万ものフレームを計算する必要があります。
于 2010-03-11T15:56:50.907 に答える