第16回 x86を延命させる「Hyper-Threading Technology」、その魅惑の技術頭脳放談

Intelが発表した「Hyper-Threading」は、5%のダイサイズ増で30%の性能向上が実現可能だという。x86の延命策ともいえる、その魅惑の技術を解説しよう。

» 2001年09月26日 05時00分 公開
「頭脳放談」のインデックス

連載目次

 Intelが、2001年秋の開発者向け会議「Intel Developer Forum(IDF)」で「Hyper-Threading Technology」と呼ぶ新技術を発表した(Intelの「Hyper-Threadingに関するニュースリリース」)。Hyper-Threading Technologyは、開発コード名で「Jackson Technology(ジャクソン・テクノロジー)」と呼ばれていたもの。まずは2002年第1四半期に発表予定のサーバ向けプロセッサ「Intel Xeon」に採用されるということだ。そこで、今回はこのHyper-Threading Technologyについて、若干の意見を述べさせていただく。

Hyper-Threadingはスーパースカラーを打ち破る技術

 Intelは、Hyper-Threading Technologyと呼んでいるが、これは例によって他社との差別化の好きなマーケティング的な命名である。業界用語的に言えばSMT技術である。半導体業界ではSMTといえば「Surface Mount Technology(表面実装技術)」を指すが、計算機アーキテクチャ業界では「Simultaneous Multi-Threading(同時マルチスレッディング)」のことである。SMT技術自体は、1990年代のかなり初めから論文がちらほらと出ており、新しい概念ではない。この話を書くのに自分の参考文献データベースを掘り起こしたら、日本では情報処理学会や、米国ではACM(The Association for Computing Machinery)などで扱われていた。日本でも結構、研究されていたようだ。ただ、こうした論文になるような概念であるので、「商用」のプロセッサ、それも最大の売れ筋であるx86アーキテクチャにこの技術を導入しようというのは、かなり飛躍した、勇気のある行為にみえる。まぁ、筆者も一応、ACMの会員なのだが、商用の組み込み向けRISCなど扱っている者にとっては、高尚かつアカデミックな技術が一気に身近になってしまった違和感というべきなのかもしれない。

Hyper-Threadingの概念 Hyper-Threadingの概念
IntelのHyper-Threading Technologyの紹介[PDF]より。Hyper-Threadingでは、1つのプロセッサをOSやアプリケーションからあたかもデュアル・プロセッサであるかのように見せる技術である。これにより、複数のスレッドを同時に処理可能とし、パイプラインの効率的な利用を行うというものだ。

 しかし、よくよく考えてみると、SMT技術、Intelの呼ぶ「Hyper-Threading Technology」は、x86アーキテクチャの進化を考えれば必然、とも納得できるから不思議だ。スーパースカラー技術の壁を打ち破るために、IA-64はVLIW(Intel的にはEPIC)の方向へ行ってしまった。一方の残されたIA-32(x86)の方にも、スーパースカラーの壁を破る手があったのだ。

 SMTというのは、その名のとおり物理的には1個のプロセッサの上で同時に複数のスレッドを処理しようという技術である。スレッドというのはひとかたまりに実行できるプログラムの部分と言ってもいいだろう。もっと高尚な定義はどこかにあると思うが、ここでは1つのプログラムの中で同時並行的に処理できる部分や、別なプログラムの一部分がスレッドであるとしよう。1つのプログラムに含まれる部分と別の部分であれば、並行処理可能といっても当然関係があるだろうし、無関係なプログラム同士の部分と部分であれば、まったく無関係ということもあり得る。

SMTは複数スレッドを扱う技術

 現在のPCは、複数のプログラムを同時実行しているように見える「マルチタスク」だし、サーバ・アプリケーションなどでは「マルチスレッド」対応のものも多い。それらとSMTの違いは、「Simultaneous」という一語に込められている。いわゆるよく耳にするマルチタスクというのは、1つしかプログラムを実行できないプロセッサ上で、細かい時間単位でプログラムを切替えて実行していくというものである。ある時間のスナップショット(瞬間)を見れば1つのプログラムしか動作していない。また、マルチスレッド対応のソフトウェアやOSは、通常マルチプロセッサ・システムで動作させるので、並列的にスレッドもしくはプログラムが動作している。しかし、その並列度の数だけプロセッサが存在している。特定の時間、特定のプロセッサを見れば、1つのスレッド(プログラム)を実行しているのは、通常のシングル・プロセッサ・システムと同じである。

SMTは1つのプロセッサで複数のスレッドを扱う技術

 これに対して、SMTというのは、ひとつのプロセッサ上で同時に複数のスレッドを扱おうというもので、繰り返しになるが全然関係のない別のプログラムからスレッドを取り出してきてもよいため、Microsoft EXCELと一太郎のコードが、1つのプロセッサのコアの中で同時にこん然と実行されることだってある、ということだ。

 そういうことを言うと、何か、1つのプロセッサといっても、実は複数のプロセッサが中に入っているのではないかと思うかもしれないが、そうではない。確かにスレッドの管理をするプログラムからみれば、複数の論理的なプロセッサが存在しているように見えるので、ソフトウェア的にはマルチプロセッサ・システムと認識するはずだ。しかし、プロセッサ・コア中のコアともいうべき、演算装置など命令実行の中核部分は普通のスーパースカラー・プロセッサから、ほとんど変更がない。これはなぜか、それを理解するためには、スーパースカラーで余っているものを考えてみるのがよい。

暇な演算器の有効利用法

 スーパースカラーを簡単にいうと、複数の命令を同時に実行できるマイクロアーキテクチャのことである。こんな複雑なものが今どきは、ごく普通のPCに採用されている。ここで言う複数の命令だが、これは1つのプログラム(もしくは1つのスレッドと言ってよいかもしれない)、に属するものに限られる。なぜならスーパースカラーは、プログラム・コード中のきわめて局所的な並列性に着目して、並列に実行できる命令を発見して実行するものだからである。

 普通のプログラムは、お互いに依存関係のある操作が連なっている場合が多い。例えばあるメモリの内容を読み出してきて、1を加え、それをメモリに書き戻すとすると、これらの命令は直前の命令に依存していることになる。だがちょっと前後に目をそらせば、とりあえず相互に関係のない操作がある。これらをかき集めて、並べ替え、同時に処理することで全体としての性能向上を実現している。並列性を追求するため、時には条件分岐をまたぎ越してまで命令ストリームを追いかけることもあり、そのために分岐予測や投機的実行といった、巧妙な技術を駆使している。ただ、こうした技術を駆使しても、依存関係を解決しないまま先まで実行しすぎると、予測が外れたときのしっぺ返し(ペナルティ)が大きいので、結局はごく局所的な並列性の追求に留まってしまう。

スーパースカラーの演算器は意外にヒマなのだ

 それどころか、メイン・メモリの読み出しのような、プロセッサの処理速度から考えると、非常に遅い操作に依存する命令列があると、グッと処理が止まってしまうこともしばしばである。これを少しでも軽減するためにキャッシュのような階層記憶の技術が発達したが、1度も参照していないデータがあればどうしようもない。さすがに勝手にデータを想像して先に進むというわけにはいかない。このため、同時に複数の命令を実行できる(複数の演算器やロード/ストア・ユニットなどを持つ)といっても、それらが本当にフル稼働している時間は長くない。実際は、依存関係のために1個の演算器しか動いていなかったり、下手をすればすべて動いていなかったり、という状況だっておこる。スーパースカラーの演算器は意外にヒマなのである。

 そこで登場したのが、SMT技術というわけである。暇な演算器を忙しく働かせるために、もう1本、別のスレッドから無関係な命令列を拾ってきて仕事させようという発想である。そのぐらいパイプラインは空いているということだ。もともと無関係の命令列であるから、他方の命令列だけだとメイン・メモリ待ちでパイプラインが止まってしまうような状況下でも、実行できる命令がある可能性がきわめて高い。うまく組み合わせていけば暇なパイプラインがフルにつまるかもしれない。

SMTはx86を延命させる

 ところで、複数のスレッドに対応するための道具立てなのだが、これが意外と軽いのだ。もともとスーパースカラーというのは、依存関係の無い命令を並列に実行できるようになっているし、依存関係のある命令の場合でも、その依存関係を最終的には損なわないように実行できる。これを実現するために、レジスタ・リネーミングなどの技術を導入して、命令セット・アーキテクチャ上で規定されているレジスタ数よりも、はるかに多い実レジスタを管理している。だから複数のスレッドのためにちょっと印(どのスレッドのために使用しているかを表すフラグ)を付けておいてやれば、もともと複数のプログラムからの命令が混ざってもへっちゃらなのだ。ただし複数のスレッドを扱わなければならないので、複数の命令を読み込むために、命令フェッチ部前後に負荷がかかってくる。そこを解決できれば、スーパースカラーからSMTというのは、今日の半導体技術からは大したハード量の増大にならないのだ。Intelによれば、Pentium 4の場合でダイ・サイズが5%増える程度のリソースで済むという(これで性能は最大30%向上するということだ)。

SMT技術はリソースの利用効率の点でマルチプロセッサより優れている

 SMT技術はうまく使えれば、同じスーパースカラーのシングル・プロセッサのスループットが何倍かに増大する可能性を秘めている。それはあたかもシングル・プロセッサ・システムが、マルチプロセッサ・システムに変わったかのようであり、さらにいえばリソースの利用効率の点でマルチプロセッサより優れている。一方、マルチプロセッサ・システムと同様、ソフトウェア的な配慮が必要だし、スループットは増大するが単一プログラムの実行時間が短くなるわけではない。また、もともとシングル・プロセッサ・システムのスループットを極限まで使い切っていたプログラムは速くなるどころか、マルチスレッド化するとほかのスレッドの影響で少し遅くなるかもしれない。しかし、端的に言って、何か別なプログラムが走っているために、ほかが遅くなるといった経験は減少するだろうし、真価はサーバ・アプリケーションのようにスループット重視のもので発揮されるだろう。周波数を2倍にしなくとも、2倍のトランザクションを処理できるようになるかもしれない。

 このような可能性を持つSMTは、早ければ2002年第1四半期に出荷予定のサーバ向けプロセッサ「Intel Xeon」で体験できるようになる。このようなアーキテクチャ上の大変更といえる技術であるのに、スーパースカラーとの親和性が高い。そのうえ、OSやアプリケーションのマルチプロセッサ対応も進んでいることから、意外と早く実用になりそうだ。

SMT技術によってx86は延命されるが、IA-64との関係は?

 将来的には、同時実行は2スレッドだが、フォローできる(パイプラインに流し込める)スレッド数は4つとか8つとかあり、その中から選ぶ、といったことも実現できるのではないだろうか。また、複数のスレッドから命令を効率よく読み込むため、フェッチ関係は命令キャッシュにいたるまでいろいろ強化されるかもしれない。また、投機的実行を行う必要性は薄れてくるので、分岐予測は巧妙さよりも、複数スレッドの分岐支援が主体となるように思われる。おぼろげにそんな製品が想像できる。

 この技術の投入により、x86の上限はサーバ側へ大きく広がることになるのは間違いない。またまたx86の寿命は延びそうだ。反面、IA-64の位置付けが気になる。さらにハイエンド・サーバ側にシフトすることになるのだろうか。

■関連リンク


筆者紹介

Massa POP Izumida

日本では数少ないx86プロセッサのアーキテクト。某米国半導体メーカーで8bitと16bitの、日本のベンチャー企業でx86互換プロセッサの設計に従事する。その後、出版社の半導体事業部を経て、現在は某半導体メーカーでRISCプロセッサを中心とした開発を行っている。


■更新履歴

【2001/09/28】SMTを「Simultaneous Multi-Threading(擬似マルチスレッディング)」のこととありましたが、「「Simultaneous Multi-Threading(同時マルチスレッディング)」の誤りでした。お詫びして訂正させていただきます。

【2001/09/26】初版公開。


「頭脳放談」のインデックス

頭脳放談

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。