SSブログ

特集80386/80486入門1(月刊ASCII 1989年8月号4) [月刊アスキー廃棄(スクラップ)]

特集は「ためになるパソコンCPUの主流80386/80486入門」だった。
リード部分は基本的に除く。最初は対話風の読み物だった。一応スクラップする
■さっそくですが,80386ってそんなに偉いわけなのですか?
□何しろ32bitだからね.
■32bitってのは何が32bitなのですか?
ロビット幅というやつが32bitなのだよ.まあ,その辺の細かいことはこの特集の中で読んでくれたまえ。とにかく,ビット幅が大きくなれば,おのずと処理能力も上がるというわけだよ.
■8bitより大きい16bit,16bitより大きい32bitというわけですね.(図1省略)
□そんなところだな.それと,1つ注意しておきたいのは,IBM PCやPC-9801なんてのは,主にMS-DOSのもとでアプリケーションを動かしていることが多いと思う。このMS-DOSというのが,実は,Intelという会社の86系と呼ばれるCPUを前提にしたものなんだなこれが.
■86系ですか.
□PC-9801の場合,(表1省略)のようなCPUを搭載してきた.
■V30(μPD70116)というのもありますが.
□このCPUは,Intelではなく日電製だよ。しかし,命令セットは,やはり86系の80186と互換性が持たせてある。
■なるほど.
□86系とMS-DOSは,何代にもわたるお得意様のようなもんじゃな.
■はい、そうですか.
□それでもって,80386というのは,この86系の現行最上位のチップというわけだ。
■しかも、32bitというわけですね。
□しかし,32bitであることは確かに大きな魅力なんだがね,実際のところは,この32bitの本領がなかなか発揮されていないのが現状じゃ。
■それはなぜなんでしょうか?
□答は簡単じゃよ。市販のアプリケーションが,16bitのCPUのことを想定して書かれているからな。最新の32bitマシンを買えるユーザーもおるが,一般的な使用ではまだ16bitで十分なパワーだし,古い機種を持っている人も少なくない.

「一般的な使用ではまだ16bitで十分なパワーだし」とは一般的な使用とは何を指すのか。ワープロですら遅かった。エディタ並の速度なら十分だと思うが、ワープロの速度は全然ダメだった。2本指打法でポチポチキーボードを打つ人なら使える速度なのかもしれない。それでもスクロールは遅かった。古い機種を持ち続けているのは最新機種を買うだけの金銭的余裕がなかったからだ。何十万円もする機械を数年で買い替えるなどとてもできなかった。
■なるほど.
ロ80386というのは16bitのCPUと同じ働きも持っておるが,それ独自の命令セットというのがあって,それを使わないと80386らしさがないといわれてもしかたがない.たとえば,32bitの演算命令を使わないことには,16bitと同じ程度のパワーしか出ないんだよ。(図2省略)
■クロック周波数が同じなら80286と80386では、同じ程度のパフォーマンスになるというやつですね。
ロアメリカでは20MHzの80286を搭載したマシンなんてのもある.まあ,クロック周波数なんてのは,エンジンの回転数のようなものでな.数値が大きいほど速いと考えてよい。ただし,16MHz以上の80286には,同一クロック周波数の数値演算コプロセッサが用意されておらん.

ワープロ・ゲームなどの「一般的な使用」では数値演算プロセッサは必要なかった。だから、同等のクロックなら80286で十分であり、少しばかりクロックが速くても80386は宝の持ち腐れ状態だった。
■だいたい分かりました.
□しかしな,80386の本領を発揮しとらんというのは,32bitの演算命令を使ってないというだけではないのだな.
■まだ何かあるのですか?
□何かあるなんてもんじゃないよ.CPUの性能というのは,演算処理のスピードっていうのももちろんあるが,もっと大切なことがいくつもある。
■速ければよいと思っていましたが.
□たとえば,メモリ空間の大きさやマルチプロセッシングなどに対応できるかじやよ.640Kbytesなどというケチなメモリ空間では何もできん.
□話をちょいと戻してよいかな.
■はいはい結構です.
□86系のCPUにはMS-DOSといったが,世の中にはIntelのCPUしかないというわけじゃあない
■そりゃそうですよね.
□もともとIntelには,8080という8bitのCPUがあった.しかし,しだいにライバルも増えてきた.MOS Technologyの6502やMotorolaの6800,ZilogのZ80などじゃ.6502はAppleやファミコン,6800系の6809はアーケードマシンやFM-7/77,Z80はMSXやPC-8801をはじめとする多数の8bitパソコンに搭載されておる.
■なかなか商売がきびしくなってきたというわけですね。
□そこで作られたのが,8086だったわけじゃよ.
■一挙に16bitというわけですね。
□そうじゃ.

「一挙に16bit」って他に何がある?新たな8bitCPUを飛ばしてという意味か?新たな8bitCPUなんてそんな選択肢想像したこともない。
■そして,MS-DOSが標準的なオペレーティングシステムとして使われるようになった
□しかしな,Intelという会社はどんなときでも研究に力を注ぐことを信条とした会社でな。やがて,より理想の16bitに近づけた80286を発表したわけだ。
■80286は,PC-9801RXやEXなど,現在の主力機種に採用されているCPUですね.
□80286というのはな,2つの動作モードを持っておる。2つの顔を持ったCPUということじゃ。
■なるほど.
□それで1つの顔は,いままでの8086と同じような顔じゃが,もう1つの顔では,16Mbytesまでの物理アドレスや仮想メモリをサポートしておるのじゃ。これをプロテクトモードというのだがね。
■な、なんと.
□ところが,あいにくMS-DOSは,従来どおり640Kbytesのメモリ空間しかサポートしておらんわけじゃ.
■お得意様に,こんなんなりましたがといっても,MS-DOSも動いているものだから簡単には対応できないというわけですね。
□そうなのじゃ。さっきは,80386が本領を発揮しとらんという話をしたが,実は,80286の段階ですら,もはやCPUの力を使い切っておらんのだ。
■なんともったいない.
□そこでな,80286のパワーを十分に引き出すMS-DOSに代わるオペレーティングシステムが考えられたわけじゃ.それがOS/2なのだ。

スクラップしていくとOS/2の失敗が分かってきた。80266なんて中途半端なCPUを使うためのOSを開発しようとしたところが失敗だったんだ。80286というCPUは「インタフェース」という雑誌だったと思うが、特集解説記事の中にどうしてCPU一つこんな面倒なものを作らなければならなかったのかという意味のものがあった。8086が8080の互換性を重視し、80286がその8086の互換性を重視したのでこんなことになってしまった。被害が少ないうちにとっとと互換性を捨てれば良かったのだ。64bit化のとき互換性を捨てたItaniumを出したが大コケした。遅いんだよ。もっと早く8bitから16bit化のときCP/Mのソフトなんて大したものなかったし、再度プログラムしても負担は少なかったはずだ。8bitの互換性を重視したから変になった。2回目のチャンスが32bit化のとき。MS-DOSなんて捨てれば良かった。新しいCPUでMS-DOSが動かないと買ってもらえない?そうかもしれないが、そういうユーザには遅いマシンでMS-DOSを使わせておけばいいんだ。パソコンの進歩を邪魔していたのは私達ユーザだった。パソコンを8bit機と16bit機の複数台持っていた人は私の知人で結構いた。16bit機と32bit機を2台持ち、コンソールマシンとWindowマシンとで使い分けさせてもいい。どうせ、コンソールマシンはMS-DOS一択なのだから。インテルが負けることはないだろう。

■パソコン用の16/32bitCPUというと,Intelの86系のほかにMotorolaの68000系があると思うのですが.MacintoshやAmiga,AtariST,X68000と,機種の数ではこちらも少なくはありませんよね。
□68000は,8086よりも後に発表されたCPUなんだが,プログラマなどにはなかなか人気がある。この68000にも68020,68030といった上位のCPUがあり,今年の4月には68040の概要が発表された.それと,こちらは86系と異なり,制御用やSun-3やNEWSなどのワークステーションに使われることも多い。
■IntelとMotorolaは,パソコン用のCPUとして強力なライバル関係にあるということなんですけど,そのワークステーションに68000系が多いというのは,Intelとしては面白くないですね.
□たしかにそうじゃな.しかし,それもこれも,8bitの時代から守ってきた互換性のためじゃ。
■例の64Kbytesのセグメントとかいうやつですね.
□そうじゃよ。しかし,誰それのせいだとも言っておれん.そこで,Intelは,80386では,80286のときと同じように,動作モードを作ることでこれに対処することにした。したがって,80386は3つの顔を持つCPUであるわけだ.
■32bitのプロテクトモードというやつが,80386本来のパワーを発揮するモードということになるわけですね.
□もっとも、このモードで走るシステム環境はあまり多くはない.MS-Windows/386やFMTOWNSのオペレーティングシステムなどがあることはある。それよりも面白いのは,80386のプロテクトモードにはバーチャル86モードというのがあってな。詳しくは本特集のこの後の記事にゆずるとして,話題となっておるMEMORY-PRO386などは,これを利用したものだ.
■ところで,80386SXというCPUもありますが.
□ふむ。80386には,組み込み型の80376と外部バスを16bitにした80386SXという姉妹品がある.
■80386SXは,PC-9801LSなどのラップトップマシンやソニーのQuarterLなどに採用されてますね。
□そうじゃ。80386SXは,ホームファクタや基板のコスト,消費電力などで有利といわれている.ただし,パフォーマンスは80386よりも20%程度低下するという.ちなみに,この80386SXという名前じゃが,一説によると,ただ音の感触だけで決めたもので何の根拠もないらしい。

当時ずっと不思議だったのはなぜ性能が劣る廉価版を出すのか。そしてなぜそれをユーザが支持したのか。私は、若干高くても性能が良いマシンが良かった。廉価版といっても当時のパソコンは何十万円もする高いものだった。そんな高い廉価版がなぜ支持されたのか。

□80486は,まだ先日発表されたばかりだが、早くもイギリスのApricotやIBMがPS/2 486/25を発表,IBMに先行して80386マシンを市場に送り出したCOMPAQも80486マシンを準備中じゃ.また,80486よりも遅れた形になった68040もHewlett Packardやソニーがワークステーションに搭載するとしておるぞ.
■なかなか熾烈な戦いが続いていますね.
□それだけじゃないぞ.'88年10月号で扱ったRISC系のCPUも動きが活発になっておる。RISCは,Reduced Instruction Set Computerの頭文字を取った略語だ。命令セットや,チップの構造をシンプルにすることで,高速な演算を実行させようというものだ.
中略

私は80286マシンを買ったので、次の80386マシンをスキップして80486マシンを買った。毎回CPUのバージョンアップに付き合えるほど金持ちではなかった。

32ビット時代のIntel CPU基礎知識
 486に至る歴史は,Intel社のマイクロコンピュータの開発史そのものと言ってもよいだろう。1971年に発表された世界初のマイクロコンピュータ「4004」は,電卓の開発過程で生まれたものだ。当時,電卓の計算処理は,ハードウェアの論理回路により実現されていた。それを,4004では,ROMに内蔵したソフトウェアによって処理する方式に置き換えた.そして,4004の開発の成功から8ビットの8008を経て,より汎用性を目指した8080が開発されたのである(1973年).
 8080の特徴は,64Kbytesのメモリ空間と、用途の固定された8ビット長の数本のレジスタにある.レジスタの内容は,計算用のアキュムレータ,メモリ空間内の位置を示すアドレス・ポインタなどであった。8080で採用されたこのレジスタ構成は,拡張しながらも,486に至るまで連綿と受け継がれている.
 8080は本格的なマイクロコンピュータとして大いに普及し,Intel社はマイクロプロセッサ市場に確固たる地位を築いた.8080とその高機能版といえる「8085」(1976年),そして,8080の主要な開発者たちが設立したZilog社による「Z80」(1976年)は,現在でも8ビットを代表すCPUであり続けている.
 さて,移り変わりの激しいマイクロプロセッサ分野において,10年以上前に作られたCPUが現役であり続ける理由は何だろうか。その代表的な理由として、「低「コスト」と「ソフトウェア資源の継承」をあげることができる.
 マイクロプロセッサにはさまざまな用途がある。本誌の多くの読者にとっては,マイクロプロセッサといえば,そのままパーソナルコンピュータのCPUとなる.そして,常に,より高速高機能な最新のCPUに注目することとなる.
 しかし,普段は目に付かないコントローラとしての用途(「組込み用」と称する)においては,こういった8ビットのCPUは未だに現役だ。たとえば,2400bpsのMNPモデムなどでは,Z80を内蔵した製品を目にする.なぜ,8086やV30ではなく,8ビットCPUが採用されているのか.理由は,Z80で十分であり,かつ,製品全体に見合った価格のためである。また,利用する理由として、10年間という歴史の蓄積をあげることもできる.筆者も約10年前から8ビットCPUのプログラミングを経験しているが,最近でもZ80用のコードを書くことがある。このような場合,新たな用途に合わせて全体を書き直すのではなく,「どこかにしまっある、あのプログラムを書き直そう」ということになる。誰しも自分の経験や努力の結果を再利用したいと思うものである.特に,コンピュータのソフトウェアでは,過去の蓄積,つまりソフトウェア資源の継承は非常に重要なのである。マイクロプロセッサの応用範囲が広がるとともに,より多くのメモリやより速い速度が求められるようになった.8ビットCPUの64Kbytesというメモリ制限に対する不満は高まり,これに応えるようIntel社は,16ビットCPU「8086」を発表した(1978年).
 8086は,8080や8085と同じプログラムを実行できないものの,類似の命令形式を備えていた。つまり,8080のプログラムをそのまま動作させることはできないが,単純な命令コードの変換によって8086用に書き換えることができた。 さらに,ハードウェアについても互換性を保つため,8086は8085と同様のバス構造となるモード(ミニマムモード)を備えていた.バス構造とは,CPUが外界(メモリや周辺I/Oデバイス)と,データをやり取りするための信号タイミングやメモリの構成形式などである。このミニマムモードでは,8ビット時代と同様の周辺デバイスやメモリを利用することができるわけだ。

「ソフトウェア資源の継承は非常に重要」それは分かる。しかし、それは同じCPUを使っている場合で同じようなCPUを使っている場合は手直ししないと駄目である。全く違うCPUなら過去の処理を再考して書く。CPUの特性もちろん過去のCPUの欠点というか弱点を直した良いCPUであるのだからより再考したプログラムは当然良くなる。悪いのは似たようなCPUに移植する場合で、似ているがゆえに間違えることがある。ああ、このCPUはこの処理ではダメだったんだになる。また、似ている部分があるので直しも単純作業になり、機能アップしたCPU命令を使わなかったりしてプログラムに進歩がなくなる。似てるがゆえに新CPUならこう書くべきなのになんでわざわざ遅くなるようなコードを書くのかになってしまう。全く新しいCPUなら良く理解してから書くので遠回りのようなコードは書かない。
コンパイラを使うのならコンパイラの性能次第なので同じソースコードで良い。CPUの互換性を重視しなくても良い。

マイクロプロセッサの応用範囲が広がるとともに,より多くのメモリやより速い速度が求められるようになった。8ビットCPUの64Kbytesというメモリ制限に対する不満は高まり,これに応えるようIntel社は,16ビットCPU「8086」を発表した(1978年).
 8086は,8080や8085と同じプログラムを実行できないものの,類似の命令形式を備えていた.つまり,8080のプログラムをそのまま動作させることはできないが,単純な命令コードの変換によって8086用に書き換えることができた.
 さらに,ハードウェアについても互換性を保つため,8086は8085と同様のバス構造となるモード(ミニマムモード)を備えていた.バス構造とは,CPUが外界(メモリや周辺I/Oデバイス)と,データをやり取りするための信号タイミングや,メモリの構成形式などである。このミニマムモードでは,8ビット時代と同様の周辺デバイスやメモリを利用することができるわけだ.
 8086のスペックで,最も特徴的なのはセグメントによるメモリ管理である.8086は,最大1Mbytesのメモリ空間を管理できるが,そのためには20ビットのアドレスを扱う必要がある.
 しかし,8086のレジスタは16ビットまでのデータしか扱えない.そこで,メモリ上の,あるアドレスにアクセスするためには,まずセグメントの位置を指定し,次にそのセグメント内での位置(オフセット)を指定することになったのである.この新機能は,アドレス指定に使用する専用レジスタと,高機能な命令の追加によって,高い機能を発揮した.8ビット時代には複数の命令で実行していた処理が、単一の命令で実行できるようにな高級言語のコンパイラの実現が容易になった。特に「ストリング・プリミティブ」と呼ばれる命令は,文字列のような不定長データの取り扱いを容易にし、高速な動作に貢献している.
 8086の内部は,独立に動作する実行ユニットとバスインターフェイスユニット(BIU)の2つのユニットから構成されている.BIUは,メモリとの間で,命令やデータのやり取りを行なうモジュールでCPUのメモリバスが空いている間,命令の先読み(プリフェッチ)を連続的に実行する.そして,先読みした命令をCPU内部の命令キュー(命令を貯めておくバッファ)に蓄積する.
 実行ユニットはバスインターフェイスユニットとは無関係に,命令キューから命令を取り出し、解釈(デコード)して実行する.つまり,BIUは絶えず命令キューを満たそうとし,実行ユニットはそれを空にしようとし続けるのである.実行ユニットが,デコードや実行に時間がかかるような命令を処理している間,命令コードはメモリから先読みされ,キニューにあらかじめ蓄えられる。アドレス計算に時間がかかるような場合でも,あらかじめ命令キューに命令が蓄えられていれば,CPUの実行速度が影響を受けることはない。この,命令先取りキューを搭載したのも8086が最初である。
 三角関数や指数計算など,精度の高い浮動小数点演算を高速に実行するためのLSIを,数値演算コプロセッサという.8086CPUには,専用の数値演算コプロセッサとして,8087NDP(Numerical Data Processor)が用意された。8087は,それ自体がCPUとしての機能を備えており,バスインターフェイスや命令コードのデコード機能を持っていた.8086と8087をセットで使用すると,メモリから読み出された命令がCPU用ならば8086が,NDP用ならば8087が読み込み,解釈し,実行した.
 これは,共有メモリを持つ並列プロセッサに似た複雑な手法で,その複雑さゆえに,80286など,これ以降のプロセッサでは採用されなかった。たとえば,CPUの動作クロックを高めるためには,同じタイミングでメモリバスにアクセスする必要があり,NDPのバスインターフェイスも高速化する必要があった。これは,ほとんど同じ機能を果たす複雑なユニットを異なるチップ上に用意することに等しい。そして8086システムのハードウェア構成は,NDPが存在するかどうかに大きく影響された.

「8080のプログラムをそのまま動作させることはできないが,単純な命令コードの変換によって8086用に書き換えることができた.」つまりは、いわばセグメントレジスタの内容を皆同じにしてセグメントレジスタを固定したCOMモデルならそれが成り立つということだ。COMモデルだけなら8bitでやれよという思いがあった。8086の方がクロックが速いので高速なプログラムを作れるのだろうが、64Kbytes以下という制限付きならZ80でも良いと思っていた。8086でアセンブラでプログラムを作っている人たちがどれだけいたのか。コンパイラどころかBASICインタープリタのプログラムで金を取っていた人たちがいた。プログラムの継承性はコンパイラ、インタープリタで作るものなら関係ないではないか。言い訳だ。騙されるな。と昔から思っていた。
「ミニマムモードでは,8ビット時代と同様の周辺デバイスやメモリを利用することができる」から周辺装置の開発に時間をかけずにすむということか。
しかしながら、より多くのメモリを使いたいという要求のためにセグメントレジスタというプログラマをセグメント境界に起因するバグに悩ますという困ったことがあった。
とにかく、説明は言い訳にしか聞こえない。楽に金を稼ぐためにはユーザを苦しめてもいいというのかと8086を憎らしく思っていた。
ASCII1989(08)c05特集CPU写真8080_W437.jpg
ASCII1989(08)c06特集CPU写真8086_W392.jpg

 CPUの内部構成も高速化のために大きく変更された。8086は実行ユニットとBIUの2つのモジュールから構成されていたのに対し,80286は独立に動作する4つのモジュールから構成されている.「バスユニット」は,外部バスとのインターフェイスを行ない,「アドレスユニット」はアドレス変換による物理アドレスの生成を行なう,そして,「命令ユニット」が命令のデコードを、「実行ユニット」が命令の実行を行なう。つまりCPU内部のパイプライン処理は4段階に拡大され,強力な並列処理が実現されたわけである。
 80286のプロテクトモードを生かしたOSとしては,Microsoft社のXENIX V/286やOS/2が有名である。ただ残念な点としては,メモリ管理の単位が64Kbytes/セグメントに制限されていたことだ。つまり,80286が管理可能なメモリブロックやタスクの大きさは最大で64Kbytes単位なのである。プロテクトモードにおける64Kbytesの「セグメントの壁」は,8086やリアルモードにおけるセグメントに起因する制限よりも厳しいもので,ソフトウェアの実行速度に大きく影響を及ぼしていた.
 8086に対する8087のように,80286には数値演算コプロセッサとして「80287」が用意された.このLSIはI/Oバスを介してCPUに接続されるので,8087のように,命令がCPU用か,NDP用かを調べる必要はない.
 CPUが読み込みデコードした命令が,浮動小数点演算命令であった場合にのみ80287にその命令を渡し、演算の実行を要求する.そして,80287はCPUと並行に動作するため,CPUは80287の演算終了を待たずに次の命令に進むことができる.80287は実行中の演算が終了した時点でCPUに信号を送り,演算結果の引き取りを要求する。つまり,80287は浮動小数点演算を実行するI/Oデバイスのように動作するのである.このため,80386はもとより,他のCPUに接続して使用することも可能である。

PC-9801VX2のEGCを使うとき時間待ちのため80286はパイプラインがあるから、単純なクロック計算でウエイトタイミングを合わせる方法ではだめで次のアドレスへのジャンプ命令を使いパイプラインを切っていた。高速化を図るためにはパイプラインも万能ではなかった。
 XENIXはASCIIの記事に何回も出てきた。でも広まらなかった。OS/2も残念な結果になった。80286を利用しようとすると失敗していた。それほど80286はダメCPUだった。
 数値演算コプロセッサは研究者には必要だったかもしれないが、一般ユーザには不要だった。何年も後になりフライトシミュレーターとかのゲームには使われていたのかもしれない。

 80386は,86系アーキテクチャを持つ最初の32ビット・マイクロプロセッサである。このプロセッサは,8086との互換性を保ったリアルモードと80286から採用されたプロテクトモードを持ち,さらにプロテクトモード上で8086用の命令を実行する「仮想8086モード」を内蔵している.メモリ管理の方法も,セグメントを単位としていた80286に比べ,より柔軟になページ単位の管理も可能となった.また,32ビットCPUであることから,セグメントサイズも,80286の64Kbytesから,最高4Gbytesとなった.
 余談であるが,80386CPUをネイティブモード(プロテクトモード)で利用するFMTOWNSでは,すべてのセグメントが同じメモリ空間を示すような,最小のメモリ空間の使用法を「スモールモデル」と称している.スモールという語感とは裏腹に、このモデルで扱うことのできるメモリは最大4Gbytesだ.8086でスモールモデルと言えば,プログラムとデータのエリアが独立であるとしても128Kbytesしか扱えないことと比較してほしい。80386で新たに追加された仮想8086モードはプロテクトモードに含まれており,8086用に書かれたプログラムを1つのタスクとして実行することができる.すなわち,286では諦めなければならなかった,「8086用のプログラムをプロテクトモードの上で利用する」ことができるようになったわけだ。
 このモードで動作している8086用のプログラムは,8086CPU上で動作している場合とまったく同じように動作する,だが,このタスクが保護に違反する命令を実行しようとすると,OSに処理が移り、適切な処理が行なわれる。また仮想8086タスクにはCPUから1Mbytesの論理アドレスが与えられるが,そのメモリが物理的に存在しているかどうかはタスクからは分からない。つまり,プロテクトモードの仮想記憶サポート機能が利用できるわけである.
 Microsoft社のWINDOWS/386はこのモードを使い,8086用に記述されたWINDOWS用アプリケーションと,通常のMS-DOS用アプリケーションを同時に実行できる.
 1988年には,廉価版386ともいうべき,386SXを発表した.386との大きな違いは,286と同じようにデータバスとアドレスバスがそれぞれ16本,24本となり,386の32ビットより少なくなっている点である.ただし,内部のアーキテクチャは,32ビットで,仮想8086モードも持ち,386用のOSやアプリケーションはそのまま動作する.


ASCII1989(08)c08特集CPU写真80386_W485.jpg
80386は良いCPUだったと思う。さんざん8086の悪口を書いていたが、80386は良いCPUだ。残念ながら私は80386マシンを買えず、80386のマシン語コードも書かなかった。CPU呪わば穴二つだ。8086憎しの報いがきた。リニアなメモリが欲しかったところで素直に4Gだ。なんでもっと早くこれを出してくれなかったのかなと思う。

 486は,数個のLSIで構成されていた「386マイクロプロセッサ・ファミリ」を集積化したものであり,80386CPUを中心に,キャッシュコントローラ,387数値演算コプロセッサおよび,8Kbytesのキャッシュメモリを1つのチップ上に集積している.CPUの実行速度に大きな影響を及ぼすこれらのユニットを同一チップ上に集積したことと,命令デコーダの一部がハードワイヤードロジックに置き換えられたことにより,同じクロックで動作する80386CPUに比較して約2倍の高速化が実現されている.
 命令デコーダの部分的なハードワイヤード化と,オンチップキャッシュの相乗効果により,1サイクル(動作クロック25MHzにおいて40ns)で実行可能な命令も出現した。これは昨年来話題になっている「RISC」(Reduced Instruction Set Computer)チップに通じるアプローチを拡張したものである.Motorola社の68040においても同様のアプローチが採用されている模様で,「CRISP」(Complex Reduced Instruction Set Processor)という用語も生まれている.
 486を一言で表わそうとするならば,「究極の80386CPU」あるいは「最後の86系アーキテクチャ」ということになるだろうか。486プロセッサを内蔵したマシンが誕生したとすれば,それは8086ベースのマシンから80386ベースのマシンへの移行ほど劇的な変化を生み出すものではないだろう。486プロセッサは「コンピュータの進化の道」に従った80386CPUの高速,高機能版であり,マイクロプロセッサの完成した形の1つといえるだろう.
 前述のように,マイクロプロセッサは2通りの進化の歴史をたどってきた.方は高級なOSを指向した,よりソフトウェア的な進化であり,もう1つはマイクロプロセッサの構造や仕組みに関わる高速化である.パーソナルコンピュータのユーザーであれば,8086を内蔵したマシよりも80286を内蔵したもののほうが高速なことをご存じであろう.必ずしもCPUの高速化だけによってマシンの性能が向上するわけではないにしても,高速処理が可能なCPUを内蔵したマシンは強力なのである.
 では、なぜ同じ16ビットCPUであるにも関わらず8086よりも80286のほうが高速なのだろうか.同じく,なぜ486は80386よりも高速だと言われているのか。ここでは,マイクロプロセッサの高速化の背景について解説することにする.
 まず,CPUの処理速度と言うとあまりにも曖昧であるため,「単位時間あたりに処理できるデータ量」と定義しておく.たとえば,グラフィック画面に1秒間に描画できるドットの数,1秒間に得られるサイン関数の結果,メモリ上のある領域から別の領域に転送できるバイト数などである.


ASCII1989(08)c09特集CPU写真80486_W352.jpg
 私は80486マシンはEPSON PC-486GR3を買った。モニタは1120×750ドットのハイレゾモードだった。フォントが24×24ドットで明朝で表示される日本語を見て気持ち良かった。Windows 3.1も使った。640×400ドットのマシンでWindows を使うなんて、よく使うよなあと心の中でバカにしていた。486での高速化に対する改良が気に入っていた。スピードが速いことが全てというか、CPUはこうでなければと思っていた。486はものすごく気に入っていたCPUだった。

 処理速度は,データを扱う単位の大きさ(8,16,32ビット)と,命令の複雑さ(多彩なアドレッシングモード)に依存する.グラフィックスのドット描画時など,データを扱う単位(バス幅に等しい場合が多い)が大きければ、当然のことながら1つの命令で描画できるドット数は多くなる.
 また,あるドットパターンをグラフィック画面に描く場合には,そのパターンに相当するビット列をプログラム内に用意しておき,グラフィック画面用のメモリに転送することが多い。これについて2つの実現方法を考えてみる.
 方法Aは,ドットパターンのデータをいたんCPUのレジスタに読み込み,次の命令でVRAMに書き込む方式であるこの場合CPUは2つの命令を実行する必要がある.
 方法Bは,あらかじめデータが格納されているアドレスからVRAMにデータをコピーする方法.この場合は,1つの命令の実行ですむ。86系のCPUならば,ストリング・プリミティブ(REPプリフィックスを伴ったMOVS命令)によって実現することができる.
 データの転送を実行する場合には,命令数が少ないほど処理速度が速いとは一概には言えないが,少なくともCPUにしてみれば,1つの命令実行ですむ。これは,次に述べる高速化のための第2の手法に影響する.
 高速化のための第2の手法は,CPUの動作が「命令サイクル」と呼ばれる一定のクロックに同期していることに由来している。必ずしも正確ではないが「16MHzの80386」などと表現した際の、動作クロックと考えていただきたい.
 分かりやすい例として10MHzのクロックで動作するCPUを考える。この場合,1つのサイクルの長さは100nsecである.1つの命令を実行するプロセスとは,その命令をメモリから取り出し(命令フェッチ),解釈し(デコード),実行することである.それぞれに1サイクル必要だとすれば,1つの命令を実行するために,合計で300nsecの時間が必要になる.命令をフェッチする時,CPUは外部のメモリに対してアドレスを指定することにより必要な命令コードを読み出す。このあとの,読み込んだ命令を解釈するデコード処理は,完全にCPU内部だけの動作である.デコードを実行している間,メモリに対するアクセスが発生しなければ,その間を利用して次の命令を先読み(プリフェッチ)することができる.
 さらにこの考えを拡張すれば,CPUの内部処理の過程を複数の機能モジュールに分割し、各機能が並列に動作することにより非常に高速な動作を実現できる.このような考えに基づくのが「パイプライン処理」である.パイプライン処理ではCPU内の各モジュールは並列に動作し,見かけ上,CPUが命令の実行に要するサイクル数は減る。80386CPUはパイプライン処理を備えており,8086互換のリアルモードにおいても同じ命令に要するサイクル数は少ない(図3省略)。
 もっとも,パイプライン処理にも弱点がある.CPU内のデータは流れ作業のように,次々と後段のモジュールに手渡されていくわけであるが,あるモジュールがデータを必要とした時にその前段のモジュールがデータを処理し終わっていなければ,パイプラインはそこで滞ってしまう。この現象はメモリからの命令フェッチ時に発生することが多い。なぜならば,数十MHzで動作するCPUの要求にメモリが付いていけないのである。
 命令デコードを行なうモジュール(デコーダ)が命令フェッチを行なうモジュール(プリフェッチャ)に次の命令コードを要求しても,メモリからの応答が遅いために待たされてしまうわけである.これを防ぐためにメインメモリとCPUの間に「キャッシュメモリ」を配置する(図4省略)。キャッシュメモリは高速なメモリによって構成されており,プリフェッチャからのアクセスに遅れることなく応答する。もっとも,キャッシュメモリ内にプリフェッチャが必要とする命令が常に存在するとは限らない。このような状況を「キャッシュミス」と称する。キャッシュミスが発生すれば,プリフェッチャはメインメモリにアクセスするため,少々時間がかかる.
 486プロセッサでは,キャッシュミスを防ぐために,キャッシュメモリとメインメモリ間の転送速度の向上にも配慮がなされている(バースト転送)。

私はグラフィックで高速化をアピールした。シミュレーション計算でもやったが、時間の短縮を数字で表してもインパクトがない。アプリケーションソフトではPhotoshop等のグラフィックツールで高速化の恩恵を味わった。

 第3の手法である「命令サイクルの短縮」には,2つの側面がある.まず,CPUの動作がクロックに同期しているのならば,単純にそのクロックそのものを速くすればよいことは明らかである.本誌にしばしば登場するベンチマークテストにおいても,CPUが同じ場合,各機種の処理速度は動作クロックに比例することが多い。
 もう1つは、前に述べたようなCPU内の各モジュールが実行に要する時間を短縮することである。
 CPU内の各モジュールのうち,命令のプリフェッチに要する時間はメモリに依存するため高速化しようがない.短縮できるものは、命令のデコードと実行ユニットが消費する時間である.
 実行ユニットの高速化が実現された例としては、2つのオペランドを必要とする演算のために,内部データバスを2本にしたもの(四則計算のような2項演算が高速化できる。1+2の場合,1と2が同時に読み込まれる)や,乗除算用のバレルシフタの採用(2倍にするとか,1/8を求めるなどの2の倍数による乗除算をハードウェアで高速化する)などがある.
 これらはどちらかと言えば特殊な命令のサイクル数の減少に貢献している。これに対して,命令デコードやアドレスデコード時間の短縮は,それらがすべての命令実行に関わっているだけに重要である.従来はマイクロコードによってソフトウェアで行なっていた命令デコードを,ハードウェアのワイヤードロジックにすることによって高速化を実現した例としては,RISCチップや日本電気のV33CPUがあり,486もまたこの手法を採用している.
 RISCチップの場合には,ハードワイヤードロジックで表現できない命令,あるいは1サイクルで実行できない命令は採用しなければ良いが,86系アーキテクチャの継承に意味がある486ではそうはいかない。486プロセッサでは,ハードワイヤードロジックとマイクロコード方式の併用により「複雑な命令はマイクロコードで,単純な命令はハードワイヤードロジックで」デコードしようとする現実的な高速化技法が採用されている.
 動作クロックを高くすることは,最も分かりやすい高速化手法ではあるが、動作クロック800MHzの8086など存在せず、今後も開発されないと思われる.その主な理由は,製造が困難である(製造プロセスの問題),高速なメモリが必要になる(トータルコストの問題)などがある.
 集積回路の製造プロセスとしては,CMOS,NMOS,バイポーラなどが一般的である。これらは,この順序で高速なロジック回路を実現できるが、消費電力が大きくなり,発熱も大きくなる.集積度の低い(数万トランジスタ)RISCチップではバイポーラプロセス(ECL)によるチップも開発されているという。ただ、チップ内の発熱対策のためにおそらく大規模な冷却装置が必要であろう.CISCチップである80386CPUは27万トランジスタ,486では120万トランジスタという非常に大規模な集積化が成されており,消費電力を抑えるためにCMOSプロセスが採用されている.
 集積回路の生産性は、「歩留り」という言葉で表現されることが多い。簡単に言えば,1枚のシリコンの板から動作するチップをいくつ得られるか、という割合である.一般的に集積度が高く,高速な回路を実現しようとするほど歩留りは悪化する.歩留りが悪くなるほど,チップの単価は上がり売れにくくなる.歩留りが悪化することを覚悟して旧式のCPUの動作クロックを向上させるくらいならば,他の手法により高速化を実現し,多くの機能が追加された新製品を製造したほうが利益に結び付くのである.

こういった努力は好感が持てる。技術者を尊敬する。こういったものを8086のときに欲しかった。

 キャッシュメモリも,真に高速化を望むならば,全メモリ空間をキャッシュ用の超高速メモリ素子で埋めればよい,と思われたかもしれない。メインメモリとキャッシュ間の転送の問題などを考慮する必要もなく,非常に単純な構造のメモリシステムを実現できるはずである。だが,高速なメモリは集積度が低く価格が高い.たとえば4Mbytesのメモリ空間を構成するには1MビットDRAM(アクセスタイム=100ns程度)では32個ですむが,超高速64KビットSRAM(アクセスタイム=30ns)では512個も必要である.また,ビット当たりの単価も圧倒的に1MビットDRAMのほうが低い。すなわち,単純に動作クロックを高くしただけでは,多くのメモリ素子数と大きな基板面積,さらには高いコストを必要とする.
 このように処理速度の向上にはさまざまな要因がある.ここでは,マイクロプロセッサそのもののアーキテクチャを中心に高速化の手法を述べたが,命令のプリフェッチやキャッシュメモリを有効に動作させるためには,ソフトウェア側からのアプローチも重要である.さらに,486プロセッサの主要な応用範囲と思われる仮想記憶をサポートしたOSが効率よく動作するためには,常にパイプラインが満たされており、常にキャッシュヒットが起き、稀にキャッシュミスが生じた場合でも対象となるデータは常にメインメモリ内に存在するような構造のソフトウェアのほうが,間違いなく高速であろう486プロセッサは,今まで述べたような高速化手法を実現した「究極の86系プロセッサ」である.このプロセッサでは,80386CPUの発表時に予想された高速化手法のほとんどが実現されてしまった。全体的な処理の高速化や信頼性の向上のための手法として期待されるマルチプロセッサに対するサポートも成されている.1990年に先がけて発表された486マイクロプロセッサは,86系アーキテクチャの最上位CPUとして今後のニーズに応えるものであろう。
((株)エー・ピー・ラボ日笠健)


ASCII1989(08)c12特集CPU表1図5_W520.jpg
キャッシュメモリは高速化に効いた。流石だと思った。スクラップにあるとおり価格的に使える容量に限界がある。その限界をしっかし考えて決めた技術者の労苦に尊敬の念を持っている。

8086と80286はダメダメだったけど、80386は本当に良かった。そして80486で高速化への取り組みが素晴らしかった。486シリーズのCPUは良かった。だからWindows95という良いOSが出たのだろう。
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。