web-dev-qa-db-ja.com

マルチコアCPUはどのように機能しますか?

あいまいな質問のタイトルは知っていますが、私の主な質問は、1つのコアが一度に1つのプログラムのみを実行する必要があるかどうかです。 CPUレベルでの「マルチタスク」はタスクを切り替えることで機能しますか?もしそうなら、なぜですか? CPUが同時に複数のタスクを処理できないのはなぜですか?彼らは何十億ものトランジスタを持っています、なぜ他のトランジスタが別の問題に取り組む間、いくつかのトランジスタが1つの問題に取り組むことができないのですか?それはハードウェアの制限ですか、それとも単にOSの制限ですか?

5
MarcusJ

トランジスタは「問題に取り組む」ことはできません。これはCPUの基本的な構成要素であり、それ自体では役に立たないが、論理ゲートを構築するために必要です(これにより、加算などの単純な演算を計算できます...)。 1つのコアには、1つのトランジスタだけでなく、多くのハードウェアがあります。

CPUには、単に「何かをする」だけではありません。仮想メモリマネージャ、ハードウェアキャッシュマネージャ、CPUをマザーボードやシステムメモリに接続するためのさまざまなインターフェイスなどがあります。マルチコアCPUは、実際のCPU内で多くのハードウェアを共有することがよくあります。

「プログラム」はソフトウェアの概念です。CPUはそれが何であるかを知りません。 CPUが行うのは、オペレーティングシステムから送信された操作を実行することだけです。この意味で、シングルコアCPUは一度に1つの論理演算しか実行できません。ただし、オペレーティングシステムが現在非常に高速で実行されているプログラムを切り替えるため、シングルコアプロセッサでも同時に複数の処理を実行できます。マルチコアCPUを使用すると、複数のタスクを同時に実行できます。これは、同時により多くのプログラムを快適に実行できるようにするか、1つのプログラムで複数のコアを利用して高速に実行することにより、オペレーティングシステムで活用できます。

技術的には、「プログラム」は1つ以上のスレッドに分割されたプロセスであり、各スレッドは実行において独立しており、通信は可能ですが、すべて独自のスタック、CPUコンテキスト(レジスタなど)などを備えています。明らかに、プロセス内でお互いの間。

2
Thomas

CPUが従う古典的なサイクルは次のとおりです。

フェッチ命令->デコード->実行

理由は、人々が歴史的にコンピューターで解決したいと思っていたほとんどの問題は、一度に1つずつ、順番にいくつかのステップに従うことを含み、それらのステップのいくつかの結果が後のステップに影響を与える可能性があるためです。このような問題があると、ジャンプして複数の「ワーカー」を使用して途中から攻撃するのはあまりうまくいきません。したがって、このモデルはこれらのタイプのプログラムにうまく機能しましたが、これらはまだ非常に一般的です。 (つまり、3Dグラフィックスレンダリングが一般的になるまで...)

もちろん、上記のモデルは何年にもわたって最適化および変更されてきました。そして、時間の経過とともにアイドル状態になるCPUを少なくする作業が進んでいます。 68000の早い段階でさえ、CPUのさまざまな部分で複数の命令が実際に「実行中」である「パイプライン」がありました(複数の命令がパイプライン化されている場合は、分岐予測が開発されたのはこのためです。分岐のために結果を破棄すると、パフォーマンスが低下します)。今日、CPUがストールしたり、何かを待ったりするのを防ぐ追加の機能があります。

  • キャッシュ(CPUが低速メモリを待機する必要がないようにします)
  • アウトオブオーダー実行(フェッチされた命令をより効率的に実行される順序に再配置します)
  • レジスタの名前変更(他の命令が作業を終了する間、命令にレジスタの独自のコピーを与えることにより、アウトオブオーダー実行がより適切に機能することを可能にします)

したがって、各プロセッサまたはコアには、命令ストリームを解釈して実行するために連携して動作する多数のサブシステムが含まれています。ある意味で、現代のCPUの一部は確かに何かに取り組んでおり、他の部分は同時に何か他のものに取り組んでいます。

しかし、上記の手法を使用して非常に効率的にすることができますが、最終的にはすべて同じ命令ストリームで一緒に動作します。したがって、それらは互いに完全に独立することはできません。 2つの命令ストリームを同時に実行する場合は、2つのCPUまたはコアが必要です。

最新のマルチタスクOSは、メモリに格納されているさまざまな命令ストリーム(つまりプログラム)間でバウンスしています。 OSが行うことは、タイムスライスが多すぎる場合にプログラムを切断するか(マルチタスク環境用に設計されたほとんどのCPUには、特定の間隔の後にIRQを発生させるタイマー、または同様のメカニズムがあります)、または別のタスクに切り替えますプロセスが何らかのタイプのI/Oまたは入力を待機している場合。 1つのCPUで一度に2つの命令を物理的に実行することはありません。

あなたが話しているアイデアのようなものがItaniumで試されたと思いますが、それは [〜#〜] vliw [〜#〜] アーキテクチャです。そのウィキペディアの記事を読んでください、それは私がここでしようとしているよりも少し良くそしてより詳細に物事を説明しています。

2
LawrenceC

OSは同じ時間に1つのコアでプロセスの1つのスレッドしか実行できませんでしたが、1つのプロセスがコアで実行される前にOSによって複数のスレッドに分割されていることがわかったら、最新のOSは通常約100で実行されます以上のプロセスでは、スイッチングがどのくらいの速さで発生するかを想像できます。コアが1 GHzでクロックされると、1秒間に約10億回更新され、次のスレッドが実行するための「スペース」が解放されます。

最近、Intelプロセッサでは、1つのコアが正確に同じ時間に2つのスレッドを実行できるようにし、理論的にはコアのパフォーマンスを2倍にするマルチスレッドテクノロジについて聞いたことがあるかもしれません。

1

実際、「タスクの切り替え」の部分はOSによって実行されます。プロセッサは、単に「数値を計算する」だけの比較的「ダム」なハードウェアです。技術的な観点からは、プロセッサは複数のタスクで作業することはできません。すべてのタスクは、実行時にプロセッサを完全に制御できることを前提に記述されているためです。下位互換性が必要なため、これは部分的にレガシーです。

マルチコアプロセッサでは、複数の「フルプロセッサ」を使用できるため、現時点で複数のプログラムで「フルプロセッサ」を使用できるため、同時に実行できます。

1
Petr Abdulin