55

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

現在、マルチコアCPUでは:

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

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

4

5 に答える 5

52

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

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

プロセスは1つ以上のスレッドで構成され、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)をチェックして、何が実行されているかを確認します。

于 2010-06-07T06:23:09.373 に答える
12

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

于 2010-06-07T03:59:31.680 に答える
10

@BjoernD、あなたはそれについて言及しました。

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

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

于 2013-07-20T10:16:49.050 に答える
7

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

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

于 2010-06-07T03:45:20.217 に答える
0

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

于 2016-06-23T06:41:30.403 に答える