2009-07-09 13 views
1

これはやや一般的な質問です。 2つのスレッドを作成し、マルチコアシステムでアプリケーションを実行する、JavaまたはVC++で単純なアプリケーションを作成しているとします。コアを実行するための特別な指示がなければ、アプリケーション自体がさまざまなコアにスレッドを配布しますか?マルチコアプロセッサでのマルチスレッドアプリケーション

ありがとうございました。

答えて

8

アプリケーションはスレッドを配布しませんが、OSはそのスレッドを配布しません。それはその仕事です。 :)

CPUコアにヒットする可能性のある他の負荷や割り込みによって、スレッドが単一の実行プロセス中にかなり頻繁にコア間でスワップすることがあります。

特定のスレッドを実行できるコアを指定する必要がある場合は、通常、OSはスレッドの「親和性」を特定のCPUに設定するメカニズムを提供します。これは、特定のスレッドのキャッシュを高温に保つための高度な最適化シナリオでは有益です。しかし、一般的には必要ありません。

3

OSはプロセスとスレッドを異なるコアに割り当てます。それはあなたが決定に影響を与えることができないと言っているわけではありません、いくつかのOSはこれを決定する上でいくつかの制御を許可します。プロセスは、コアの良好な利用を確保するために、必要に応じてコア間を移動することもあります。

1

あなたはSetThreadIdealProcessorと関連するAPI呼び出しを使用してWindows上でこれを行うことができます。

http://msdn.microsoft.com/en-us/library/ms684251(VS.85).aspx

あなたのスレッドは、各リソースの多くを求めているなら、あなたは、OSが利用可能なコア全体に配布することを期待します。

OSのスケジューラを2番目に推測しているので、スレッドアフィニティを効果的に使いこなすことに少し気をつけます。たとえば、アプリケーションの応答性が低下する可能性がありますが、アプリケーションの主UIスレッドと競合するようにスレッドをスケジューリングする場合があります。

私はアルゴリズム

  • アルゴリズムの異なるアプローチ

    1. を比較することができますので、私は通常、プロファイラの助けといくつかの固定されたアプリケーションのベンチマークで、次の順序で物事に近づく - 真剣に!アルゴリズムについて何か心配する前に考えてみてください。
    2. コンパイラスイッチ - リリースビルドですべての最適化が有効になっていますか。
    3. コンパイラのヒント - 最適化できるようにできるだけ多くの情報をコンパイラに与えてください。たとえば、ポインタや、コンパイラが2番目に推測できない他のメカニズムを過剰に使用していますか?
    4. キャッシング、スレッドの親和性など

    アデ