エンタープライズ:特集 2002/11/28 18:24:00 更新

Linuxでハイパー・スレッディング――Pentium4/3.06GHzで遊ぼう
第1回 Linux上でなかなか動かないHT (3/6)

ソフトウェアから見たHT

 ここでちょっと視点を変えて、ソフトウェアからHT(というかSMT)を見てみよう。1980年代まで、マルチタスクOSのほとんどが「Multics」から何らかの影響を受けている。この結果、たいていのマルチタスクOSの場合、プログラムを実行するプロセス(あるいはタスク)という環境を作り、このプロセスないしタスク単位にCPUコンテクストを割り当てるという仕組みを取っていた。ここに「Thread」という概念を持ち込んだのは、CMUで開発されていた「Mach」が始めてであり、これによりCPUコンテクストがプロセスからスレッドに細分化されることになった。この仕組みはUNIXを始めとする多くのOSが早速取り入れる事となり、現在のマルチタスクOSの殆どは、CPUコンテクストをプロセス単位ではなくスレッド単位で割り当てている。

 こうした状態では、マルチCPU化=マルチスレッドの高速化という図式が成り立ちやすい。たとえばデータベースに検索のクエリーを投げたとき、そのクエリーを内部で複数のスレッドに分割し、各々が別々のメモリインデックスをサーチすれば、単純にCPUの数だけ高速化できることになる。もちろんマルチプロセスでも同等の事は可能だが、プロセスコンテクストのハンドリングがリソースを消費することや、複数プロセス間でメモリ空間を共有させるためにシェアードメモリを作成し、しかもプロセス間のアクセス調停のためにロック機構を用意しなければいけないなど、面倒なことが多い。

 ところが、実際にインプリメントしてみると、確かに効果が上がる場合もあるが、案外性能が出ないどころか、かえって遅くなるケースまで出てきた。複数のスレッドが、まったく別々のメモリ領域をアクセスしているようなケースでは、確かにマルチCPU環境は効果が高い。ところが、複数のスレッドが同一のメモリ領域をお互いにアクセスするようなケースでは、あるスレッドがデータを書き換えた場合には別のCPU上で動くほかのスレッドへ即時これを反映する必要があり、この際にスヌーピングが発生してCPUの動作がとまってしまい、結果として足を引っ張りあうことになってしまうわけだ。こうしたケースでは、むしろシングルCPUの上でスレッドを切り替えながら動作させたほうが高速なほどで、マルチCPUの効果はほとんど見られない。

 このケースで効果的なのがやはりSMTなのである。SMTの場合、複数のスレッドが別々のCPUで動作しているように見えても、それは仮想CPUであって実体は1つのCPUでしかない。だから、あるスレッドがデータを書き換えても、それはスヌーピングなしでほかのスレッドに即時反映されるわけで、オーバーヘッドは極小化される。SMTは、マルチスレッドには効率がよいアーキテクチャなわけだ。

 ちなみにこのマルチスレッドを高速で動作させるアーキテクチャとして「CMP」(Chip Multi-Thread)がある。こちらはIBMのPower4で実用化されているが、要するに複数のプロセッサと大容量の共有L2キャッシュを全部1つのダイに乗せてしまう仕組みだ。こうすれば、先のスヌーピングの問題も、共有L2キャッシュ経由で解決するから、オーバーヘッドも少ない。多少「力技」的な方法だが、SMTが原理的に「処理負荷の少ないスレッド同士だと効果が上がる」、つまり処理負荷が高いスレッド同士だと、そもそも実行ユニットの空きも少ないから効率が上がらないのに対し、CMPでは処理負荷が高くなるほど効果的に動作するわけで、高いロードアベレージを要求されるサーバには、SMTよりもむしろ適したアーキテクチャである。ただし、例えばIBMのPower4の場合、0.18μmプロセスでダイ面積が400平方mmにも達しているなど、実装が難しいこともあり、現時点ではあまりデスクトップ向けとは言えないのも事実だ。

 ちなみにSMTを利用する場合、ソフトウェアから見れば基本的にはマルチプロセッサと考えて間違いはない。ただ、OSあるいはドライバに関してはちょっと注意が必要である。まずOS側では「CPUの空き」状態(UNIXで言うidle状態。WindowsNT系ならSystem Idle Processが動いている状態)は、停止命令(HALT)が実行されていなければならない。ここでNOPなんぞを実行された日には、このNOPがほかの処理を圧倒するほど動いてしまい、2つ目のスレッドが動作できなくなる。同様に、インターロックのためにspin loopを実行してはいけない。本当のマルチプロセッサの場合、たとえばCPUその1がspin lockをかけて処理している間、CPUその2がspin loopをかけていても、CPUその1の処理にさし障りはない。ところがSMTでこれをやった場合、spin loop待ちの処理がほかのスレッドを圧倒してしまい、永遠にspin loopから脱出できないことになってしまう。つまり、OSがきちんとSMTに対応しなければいけないわけだ。これはHTも当然同じであり、この結果HTが動作するOSというのは限られてくることになる。

前のページ | 1 2 3 4 5 6 | 次のページ

[大原雄介,ITmedia]