上図のタスクマネージャには CPU 使用率のウインドウが4つありますので、「4コア搭載している」 と答えたくなりますが、残念ながら答えは 「2コア」 です。ちなみに一昔前の僕は、自信満々に 「4コア!」と答えておりました…。
CPU にあまり興味のない方、またはこの問題に 「2コア」 と答えられたお方 (素晴らしい!) は、以下の記事を読まれなくても全然大丈夫です。 一方で、CPU に興味のある方、または僕と同じ 「4コア」 と答えてしまったお方は、以下のメモから 「スレッド」 の仕組みを覚えていただけると幸いです。
CPU のコア まずスレッドの話に入る前に、CPU の 「コア」 について簡単にメモします。
ご存知の方が多いと思われますが、CPU はコンピュータを動作させるためにもっとも必要な部品で、コンピュータのほぼ全ての命令・処理を担当します。 CPU そのものは1つの部品ですが、具体的には3つの部品に分かれています。
マザーボードに設置するための
「基盤」 演算回路が作りこまれた
「ダイ」 発熱のための
「ヒートシンク」 大きく分けてこの3つです。
CPU の 「コア」 は、ダイの中の一部分にあたります。このコアがデータを処理する具体的な部品です。
↑図1:CPU の簡単な中身
演算の高速化に絶対不可欠な 「共有キャッシュメモリ」 も、このダイの中の一部分として扱われます。コアとキャッシュメモリが同じダイ内にあるのですから、CPU の演算がいかに高速で行われているかがうかがえますね。
スレッド さて、ここから本題の
「スレッド」 をメモします。
CPU はコアやキャッシュメモリを使って高速な演算を行いますが、スレッドとはこの 「処理の実行単位」 を意味します。基本的にコアは、一度に1つの処理しか並列で実行できませんので 「コアが一度に処理できるスレッド=1スレッド」 となります。
↑図2:スレッドの流れ
シングルコア CPU は、その名の通りコアが1つだけ搭載した CPU を意味します。この CPU は1コアですから、前述しましたようにコアが処理できるスレッドは 「1つ(1スレッド)」 です。
一方マルチコア CPU (デュアルコア・クアッドコアなど)は、CPU に複数個のコアをもっています。デュアルコアは2コアですから、デュアルコアが処理できるスレッドは 「2つ(2スレッド)」 になります。
↑図3:シングルコアとデュアルコア
CPU はコア数が多いければ多いほど、処理できるスレッドが増えますので、シングルコアよりもデュアルコアの方が性能が高くなることが分かりますね。
マルチスレッディング 何度も前述していますが、基本的にコアが処理できるスレッドは 「1コア=1スレッド」 です。
ところが最近は、
1コアで複数のスレッドを処理できる技術 が増えてきました。この技術のことを
「マルチスレッディング」 と呼びます。
昨今の PC 市場にすっかり定着した Intel Core i シリーズですが、この Core i シリーズ(主に i5 を除く)がマルチスレッディングを採用しています。AMD の CPU でも扱っていると思いますが、今回は Intel の 「
ハイパースレッディング (インテル CPU のマルチスレッディングの商標)」 をベースとしたマルチスレッディングのメモを書いていきます。
ではさっそく、マルチスレッディングの仕組みについてメモします。
CPU はスレッドに対してフル稼働しながら処理をしますが、そのスレッドの中には
「簡単な処理のスレッド」 があります。この簡単な処理のスレッドを CPU が受け取ると、案の定 CPU はすぐに処理を完了させてしまいます。そういったスレッドは CPU にとって負荷がかかりませんので、
CPU はリソースを持て余してしまいます。 マルチスレッディングとは、
この持て余したリソースに待機中のスレッドを処理させる技術 のことを指します。
↑図4:2C/1T と 2C/2T
ただしこの技術は、あくまで OS 側がマルチスレッディングを 「仮想的なコア」 として認識しているだけですので、
最大でも 30% ほどの性能アップしか見込めないそうです。 物理的なコア数には負けてしまう、ということですね。それでもリソースの有効活用としてスレッドを処理してくれますので、搭載していて損はないでしょう。
あと、マルチスレッディングは
「nC/nT(nコア/nスレッド)」 と表記されることが多いです。Core i7 は8コアと表記されがちですが、正確には「4C/8T(4コア/8スレッド)」ということが分かります。
* Core iシリーズのコア早見表(一部例外あり)
Core i7: 4C/8T(4コア8スレッド)
Core i5: 4C/4T(4コア4スレッド)
Core i3: 2C/4T(2コア4スレッド)
――ということで、
冒頭の問題の答えは
「2コア」 と言うことになりますね。
問題が短く、解説がやたらと長いメモになってしまいましたが、このメモを読んで、少しでも CPU 選定のお役に立てたら幸いですw (^ω^ )
※以下から、マルチスレッディングについてもう少し深く書いていきます。 ライトなユーザーは、以下を読み飛ばしてください。 CPU の基本構造 マルチスレッディングは、コアの余ったリソースを 「仮想的なコア」 として動作させることで、更なる高速化処理を実現させる技術であることは前項でメモしました。ここではそのマルチスレッディングの 「基礎」 となっている
「パイプライン処理」 についてメモします。パイプライン処理を少しでも理解していれば、マルチスレッディングの大まかなイメージを掴むことができます。
まず、パイプライン処理を理解する前に CPU の演算処理の
基本的な動作 についてメモします。なお、今回は 「基本的なこと」 だけメモしました。今後、深く理解する機会がありましたら、そのときに具体的なメモをさせていただこうと思います。
CPU が命令(データ)を処理するときは、コアが演算を担当することは前述したと思います。そんなコアの内部では、
「ユニット」 と呼ばれる単位で分けられた様々な役割・機能が動いています。
・以下、大まかなユニット(実際はもっとあります)
1.実行ユニット
2.デコードユニット
3.フェッチユニット
4.キャッシュ
↑図5:やや具体的なコア内部
パイプライン処理 CPU が命令(データ)を処理する大まかな流れをメモします。
まず、メモリコントローラやチップセットが RAM から対象の命令(データ)を読み込み、そのデータを
「フェッチ」 がコア内に取り込みます。この段階では命令は演算できる形式ではありませんので、
「デコード」 によって命令を演算可能な形式に解析します。そして解析された命令は
「実行ユニット」 で演算されます。処理された演算結果は再びキャッシュメモリへ書き込まれ、その後 RAM へ
「ライトバック」 されます。
↑図6:CPU 演算処理のフロー
このサイクルが基本的な CPU の演算フローです。データ量に応じて必要な回数を繰り返し演算します。
ところがこのサイクルは
「今のサイクルが終わるまで、次のサイクルを始められない」 といった欠点があります。「フェッチ」 がデータを受け取り 「デコード」 が解析するまでの間、「実行ユニット」 は
待機中 の状態になのです。これが CPU 演算のサイクルで発生する
リソースの持て余し です。
以下の図7では 「A、B、C のデータを処理する例」 を挙げています。
A データがフェッチに取り込まれたとき、デコードと実行は待機中です。次に A データがフェッチからデコードにうつると、デコードは A データを解析しますが、役目を終えたフェッチは待機中になり、また実行も待機中を継続します。そしてデコードから A データを受け取った実行は演算をスタートしますが、フェッチとデコードは待機中をキープします。
各ユニットが処理を行っている間、担当外ユニットの動きがもったいないことが分かると思います。
↑図7:リソースの持て余し
そこで登場するのが
「パイプライン処理」 です。パイプライン処理とは、
各ユニットを独立させることで並行処理させる技術 のことを言います。通常は、サイクルが終わるまで各ユニットが待機状態に入りますが、パイプライン処理ではサイクルの状態に関係なく、次の処理を開始することができるのです。
以下の図8では、図7の 「A、B、C のデータを処理する例」 をパイプライン処理したものです。
A データがフェッチに取り込まれると、デコードと実行は待機中です。ここまでは前回と同じですが、次に A データがフェッチからデコードにうつると、デコードは A データの解析を始める一方、フェッチは A データのサイクルの終了を待たずして B データの取り込みを始めます。そして実行が解析を終えたデコードから A データ を受け取って演算を始めたとき、デコードはフェッチから受け取った B データの解析をはじめ、フェッチは C データの取り込みを始めます。
↑図8:パイプライン処理
また、以下が 「パイプライン処理に特化した図」 です。
↑図9:テキストなどに載っている有名なパイプライン処理
……説明がややこしくなってしまいましたので、図を見て頂ければ大丈夫だと思います。
マルチスレッディングのイメージ CPU 処理サイクルで発生するリソースの持て余しのイメージが掴めましたら、マルチスレッディング技術のイメージもつかめると思います。Intel の Hyper-Threading もパイプライン処理の応用技術です。
以下の図10は、マルチスレッディングのイメージを描いたものです。
通常の CPU では、1コアに対して1スレッドしか処理を行えません。ところがマルチスレッディング対応(ハイパースレッディング)では、リソースの空きスペースに別のスレッド処理を行わせることで、
あたかも CPU が2つあるように見せかけているのです。 そうです、これがマルチスレッディングの技術なのです。
↑図10:マルチスレッディングのイメージ(著:小泉修氏"PCアーキテクチャのすべて"参考)
さて、どうでしょうか。マルチスレッディングのイメージが掴めましたでしょうか。
以上でマルチスレッディングのメモを終えようと思います。これより深くマルチスレッディングについて調べる機会がありましたら、続編としてメモしていく予定です。
最後に マルチスレッディングに興味を持ったのは、Hyper-V の仮想マシンを設定しているときの 「論理プロセッサ数」 でした。Core i7 のテスト環境で Hyper-V を扱っていたとき、なぜか論理プロセッサが 「8つ」 であることに気づきました。(あれ?クアッドコアなのに8コア認識してる…なんで…?) そんなことから CPU について調査したところ、今回のマルチスレッディングの技術に行き着きました。
CPU などのハードウェアの仕組みは、知っていたところで普段の生活にあまり役に立ちません。ほぼ 「興味」 のレベルになってしまうと思います。それでもコンピュータが発展していく昨今で、ハードウェアの 「仕組み」 は知っていて損はないと、僕は思っています。
インフラまわりのプロはハードウェアを知らなくても問題ありませんが、ハードウェアにちょっと詳しいインフラまわりのプロも悪くないんじゃないかな、とメモしながら思った今日この頃でした。 (^ω^ )
スポンサーサイト