ハイパースレッディング・テクノロジーハイパースレッディング・テクノロジー (英: Hyper-Threading Technology、HTT) とは、インテルのハードウェアマルチスレッディング実装に対する同社の商標である。当初は、NetBurstマイクロアーキテクチャにおける同時マルチスレッディング (Simultaneous Multi-Threading; SMT) の実装に対して用いられていたが、その後、コードネームMontecitoの名で知られるプロセッサナンバー 90xxのItaniumにおけるSwitch-on-Event Multi-threading (SoEMT) (ブロック型マルチスレッディングの一種)にも用いられ、LPIA (Low Power on Intel Architecture) 製品の1つであるインオーダープロセッサのIntel AtomのSMT実装もハイパースレッディング・テクノロジーと称している。 これらの製品に共通しているのは、オペレーティングシステム (OS) が、ハイパースレッディングが有効なコアを、1つのコアではなく複数のコアと認識できる点である。 詳細ハイパースレッディング・テクノロジーとは、従来CPUのコア一つに一つしか搭載していなかったある一部の命令制御装置やバッファを複数搭載してコードの処理能力を向上するものである[1]。これにより、ハイパースレッディング・テクノロジーを搭載・有効化したCPUでは、ホストOSからはあたかも実際に搭載しているコア数より多くのコア(疑似コア)を搭載しているように見え、スレッドやプロセスの割り当てを個々の疑似コアに対してスケジューリングできるようになる。この見かけのプロセッサコア数を論理コア数または論理プロセッサ数 (number of logical processors) と呼び、実際にCPUに実装されているコアの数を物理コア数または物理プロセッサ数 (number of physical processors) と呼ぶことがある。 現在のコンピュータに使われるCPUはスループット向上のために命令のパイプライン処理を行なっており、多くは一つのコアにコードを読み込み(ロード)、解釈(デコード)し、処理をスケジュールする装置を一つと、それを処理するパイプラインと呼ばれる演算装置を複数持っている。しかしスケジュールの能力に限りがあるため、例えば整数を処理するパイプラインが働いていても、浮動小数点数演算やMMX/SSEなどのマルチメディア向けSIMD演算[2]を実行するパイプラインが空いていることがある。 そこで一つのコアに搭載しているデコードやスケジュールをする装置を複数に増やし、一つのコアを論理的に複数のコアとして動作させることで、空いているパイプラインを埋めて効率を向上させることが考えられた。 ただしコードやデータの間にはお互いに依存関係があり並行処理できない場合がある。また複数の論理的なコアは一つのL2キャッシュを共有しておりデータやキャッシュ不整合が発生した場合はロックがかかり効率が低下する。 コアはキャッシュに対し速度が遅いメインメモリーの入出力が必要になるとパイプラインが空いていても処理できない。最近のCPUは処理するコードやデータの量がL2キャッシュの容量を超えるほど肥大化しメインメモリーの入出力が必要な場合が増えているため、メモリーコントローラーをチップセットではなくCPU自体に内蔵させてメインメモリーの入出力速度を向上させている。 ハイパースレッディングが特に有効なのは、整数処理と浮動小数点処理やマルチメディア処理というように異なるパイプラインを多用するソフトウェアや、多数のスレッドがあるがメモリアクセスの遅延が律速になるようなプログラムである。殆どのソフトウェアでは論理部分の大半は整数処理であり、浮動小数点処理と多重化できる可能性が高い。 キャッシュミスによりCPUがメインメモリにアクセスすると、データがレジスタに乗るまでに数百クロックの間待たなければならない(ストール)。ハイパースレッディングは一方のスレッドがストールしている間に別のスレッドを走らせることでCPUコアの利用効率を上げ、またこれによりメモリアクセスレイテンシを隠蔽する。 従ってハイパースレッディングで効率が良いのは、比較的小さなサイズの整数処理のコードと、データサイズが小さい、もしくはデータサイズが大きくても配列が規則的な浮動小数点処理やマルチメディア処理の繰り返しが並行して行われている場合である。 一方苦手とするのは、例えばWindowsやLinuxのように雑多なDLLやライブラリ類が頻繁かつ非同期的にコールされ、またコードやデータが頻繁に更新される、いわゆるローカリティが低い場合である。この場合、複数のスレッドでCPUのデータ幅やL2キャッシュが細分化され(スラッシング)、ハイパースレッディングによって逆に効率が低下することもある。 そのため、ハイパースレッディングによって多くのユーザーが不満を持つソフトウェアの立ち上がり時間が短縮されないのはこのせいである。一方、音声や動画の変換や編集ではハイパースレッディングの効果が高くなる。通常入力データサイズが規則的なデータ圧縮のほうが入力データが不規則なデータ解凍より早くなる傾向がある。 ハイパースレッディングの利点として、もともと複数の物理的コアを利用できる対称型マルチプロセッシング対応のOSでは、特にソフトウェアを改変することなくハイパースレッディングによる複数の論理的コアを利用できることである。 すなわちハイパースレッディングはアプリケーションソフトウェアを改変せず利用できる透過性があることが特徴である。もちろんハイパースレッディングを意識した処理として実装しているかどうかによって効率は変化する[3]。 なお、処理中のコードやデータを自ら書き換えていくような特殊なソフトウェアや、複数のスレッドが強い依存関係を持つ場合は効率が低下したりエラーとなることがある。また論理的コア同士の間でデータの秘匿に問題があるなど、ごく限られたケースながら問題が生じることがある。このため、多くのPCではBIOSなどでハイパースレッディングをオフとすることができるようになっている。 PC向けのインテル製CPUでは、2013年現在ハイパースレッディング搭載製品はすべて物理コア1つ当たり論理コア2つ (2-way) である。一方、HPC用途やメインフレーム用途などの高価なCPUでは、より多数のSMTをサポートしている。例えばIBMのPOWER8や、オラクルのSparc T3は物理コア1つ当たり論理コア8つ (8-way) である。インテルのXeon PhiはCPU用途ではなく、GPUを利用した汎用計算 (GPGPU) のような使い方を想定しているコプロセッサだが、これは物理コア1つが論理コア4つ (4-way) になっている。ただし、第12世代CPUから搭載された、電力効率を優先した高効率コア(Eコア-Efficient Core)ではハイパースレッディングは使用できない。 性能ハイパースレッディングの利点を以下に挙げる。
インテルによると、NetBurstマイクロアーキテクチャにおける最初の実装は「通常の」プロセッサへ5%の領域のみを追加するだけで、15 - 30%の性能向上をもたらしたとしている。 しかし、ハイパースレッディングは、論理的なコアが物理的なコアの1次キャッシュメモリーや2次キャッシュメモリーを共有する構造になっているため、共有しているキャッシュメモリーの離れた領域を複数の論理的なコアが読み書きするようなソフトウェアでは、キャッシュの入れ替え(偽共有)が多発し性能が低下することが指摘されている[4]。インテルは「ほとんどのベンチマークにおいて、ハイパースレッディング技術は良い結果を出している」と述べている。 現在ハイパースレッディングはNetBurstマイクロアーキテクチャで最初に実装されたが、それに続くCoreマイクロアーキテクチャでは採用されなかった。これは、Coreマイクロアーキテクチャが疑似マルチコアではなく真のマルチコアを想定した設計[5]であったことにも起因する。Coreマイクロアーキテクチャのプロセッサであってもハイパースレッディング・テクノロジーを示すフラグ (CPUID: IA-64のMontecitoや、超低消費電力CPUのIntel Atomでもマルチスレッド技術が採用されたが、前者はブロック型マルチスレッディングであり、後者はインオーダープロセッサにおけるSMT実装なので、従来のNetBurstマイクロアーキテクチャのものとは技術的な関連はない。 セキュリティ2005年、Colin Percivalは、制限された特権を伴う悪意あるスレッド操作により、別のスレッドの実行の監視を許可してしまうため、暗号鍵が盗まれる可能性があることを明らかにした、「Cache Missing for Fun and Profit (PDF) 」という論文を発表した。 これは、攻撃者が対象となるコンピューター上で、アプリケーションを自由に実行できる環境が整わないと影響を受けないため、悪用する事は非常に困難である。現在のところ被害などは報告されていない。 2019年、Intel Core i7以降のCPUに対する複数の脆弱性Microarchitectural Data Samplingが公表された。これについて、ハイパースレッディングの無効化が対策の1つとして検討されることがある[9]。特に、ChromeOSではこれによりデフォルトでハイパースレッディングを無効にすることとしている[10]。 RedHat系などの新しいLinuxのカーネルでは、ブートパラメタあるいはOSの動作時に、ハイパースレッドの機能をオンあるいはオフにできる[11][12]。 脚注
関連項目情報源外部リンク
|