web-dev-qa-db-ja.com

SMPコア、プロセス、およびスレッドはどのように正確に連携しますか?

シングルコアCPUでは、各プロセスはOSで実行され、CPUは自身を最大限に活用するためにプロセス間をジャンプします。プロセスは多くのスレッドを持つことができます。その場合、CPUは、それぞれのプロセスで実行されているときにこれらのスレッドを実行します。

次に、マルチコアCPUで:

  • コアはすべてのプロセスで一緒に実行されますか、またはコアは特定の時点で異なるプロセスで別々に実行できますか?たとえば、プログラムAで2つのスレッドを実行しているとします。デュアルコアCPUはこのプログラムの両方のスレッドを実行できますか? OpenMP のようなものを使用している場合、答えはyesになるはずです。しかし、コアがこのOpenMP組み込みプロセスで実行されている間、コアの1つを他のプロセスに切り替えることはできますか?

  • シングルコア用に作成されたプログラムを100%で実行すると、各コアのCPU使用率が分散されるのはなぜですか? (たとえば、80%と20%のデュアルコアCPU。この場合、すべてのコアの使用率は常に100%になります。)いくつかの方法で、各プロセスの各スレッドを実行することにより、コアが互いに助け合うようにしてください。 ?

53
Karl

コア(またはCPU)は、コードを実行するコンピューターの物理要素です。通常、各コアには、計算、レジスタファイル、割り込みラインなどを実行するために必要なすべての要素があります。

ほとんどのオペレーティングシステムは、アプリケーションをプロセスとして表します。つまり、アプリケーションには独自のアドレス空間(==メモリのビュー)があり、OSはこのビューとそのコンテンツが他のアプリケーションから分離されていることを確認します。

プロセスは1つ以上のthreadsで構成され、CPUでマシンコードを実行してアプリケーションの実際の作業を実行します。オペレーティングシステムは、どのスレッドがどのCPUで実行されるかを決定します(巧妙なヒューリスティックを使用して、ロードバランスやエネルギー消費などを改善します)。アプリケーションが単一のスレッドのみで構成されている場合、マルチCPUシステム全体は、アプリケーションで1つのCPUしか使用しないため、あまり役に立ちません。 (ただし、OSが他のCPUで他のアプリケーションを実行するため、最初のアプリケーションと混ざり合わないため、全体的なパフォーマンスは向上する可能性があります)。

さて、あなたの特定の質問に:

1)OSでは通常、少なくとも特定のスレッドを実行するコアについてのヒントを与えることができます。 OpenMPが行うことは、特定の量のスレッドを生成するコードを生成して、プログラムのループからの共有計算作業を複数のスレッドに分散させることです。それには、OSのヒントメカニズム(スレッドアフィニティを参照)を使用できます。ただし、OpenMPアプリケーションは他のアプリケーションと同時に実行されるため、OSはスレッドの1つに割り込み、CPUで他の(潜在的に無関係な)作業をスケジュールすることができます。実際には、状況に応じて適用する可能性のあるさまざまなスケジューリングスキームがありますが、これは非常に具体的であり、ほとんどの場合、OSが正しいことを実行していると信頼できるはずです。

2)マルチコアCPUでシングルスレッドアプリケーションを実行している場合でも、他のCPUも同様に動作していることがわかります。これは、a)その間にOSがその仕事をしていること、およびb)アプリケーションが単独で実行されることはないという事実に起因します。実行中の各システムは、多数の同時実行タスクで構成されています。 Windowsのタスクマネージャ(またはLinuxではps/top)をチェックして、何が実行されているかを確認します。

48
BjoernD

また、OSはスレッドがどのプロセスからのものであるかをあまり気にしません。通常は、スレッドのプロセスに関係なく、スレッドをプロセッサ/コアにスケジュールします。これは、同時に実行されている4つのプロセスからの1つのスレッドと同じくらい簡単に、同時に実行されている1つのプロセスからの4つのスレッドにつながる可能性があります。

11
John Saunders

@BjoernD、あなたはそれを述べました。

..アプリケーションが単一のスレッドのみで構成されている場合、マルチCPUシステム全体は、アプリケーションで1つのCPUしか使用しないため、あまり役に立ちません...

シングルスレッドのアプリケーションであっても、そのアプリケーションスレッドはその存続期間中に異なるコアで実行される可能性があると思います。 CPUへのプリエンプションおよびその後の割り当てごとに、異なるスレッドがそのスレッドに割り当てられる場合があります。

9
NitinS

はい、スレッドとプロセスはマルチコアCPUで同時に実行できるため、これは説明どおりに機能します(これらのスレッドとプロセスの作成方法、OpenMPなどに関係なく)。単一のプロセスまたはスレッドは、一度に単一のコアでのみ実行されます。利用可能なコアよりも多くのスレッドがCPU時間を要求している場合(通常はそうです)、オペレーティングシステムスケジューラは必要に応じてスレッドをコアに移動したり、コアから移動したりします。

シングルスレッドプロセスが複数のCPUまたはコアで実行される理由は、オペレーティングシステムに関連しており、ハードウェアの機能には特に関係ありません。一部のオペレーティングシステムには「スレッドアフィニティ」の意味がない-彼らはスレッドが実行されているプロセッサを気にしません-そのため、使用されているリソースを(少なくとも1秒に数回)再評価するときに、スレッド/プロセスを1つのコア/ CPUから別のコア/ CPUに移動します。キャッシュミスを引き起こすことを除いて、これは通常、プロセスのパフォーマンスに影響を与えません。

6
Nick Bastin

たとえば10スレッドの1つのスレッドアプリケーションがある場合、最初は同じCPU /コアで起動します。Linuxのロードバランサーにより、一定の期間に複数のスレッドが他のコア/ CPUに分散されます。そのようなスレッドアプリケーションが複数ある場合、スレッドのローカル/グローバルは、それらが実行されていたコアのl1/l2キャッシュですぐに利用できるため、すべてのアプリケーションスレッドはほとんど同じコア/ cpuで実行されると思います。スレッドをコア外で実行すると、実行時間よりも時間がかかります。スレッドを別のコアで実行する必要がある場合、親和性情報をスレッドに提供する必要があると思います。

0
Vasudeva Reddy