2020年06月19日の日記です


ENIAC vs 6502  2020-06-19 18:54:40  コンピュータ

つい先日、Twitter で「ENIAC はマイコンでどの程度か」とつぶやいている人がいた。


なるほど。ENIAC の性能というのは時々話題になるのだけど、僕も詳細に性能比較をしたことは無かった。

概念から違いすぎて比較は無理、という気もするが、遊び程度にやってみるのも面白そうだ。



▼前提知識


概念から違う、と書いたのだけど、ENIAC の計算方式について、ざっくりと前知識。

まず、ENIAC は最初のコンピューターとされることが多いのだけど、現代のコンピューターとは計算方法が全然違う。


2進数か 10進数か、という違うもあるのだけど、それ以上の違いがある。

ENIAC は「どんな複雑な計算式でも、微分を繰り返すと足し算になる」ということを利用して、方程式をひたすら数値計算で解くためのシステムだ。


古くは、チャールズ・バベジの階差機関・解析機関が同様のアイディアを持っていた。

ただし、実現できていない。


ENIAC 以前には、歯車とモーターで実現したハーバード・マーク1があった。


ENIAC は、計算のアイディアとしては全く同じままだが、物理部品を無くして電気化することで、超高速の演算を実現しようとした。



▼ENIAC の計算能力


歯車を模倣しているので、2進数ではない。

10進数 10桁の加算機が電気回路で表現されていて、この装置が 20台ある。


1台の加算機は、毎秒 5000回の加算ができる。

これが 20台並列動作するので、ENIAC 全体としては、1秒間に最大 100000回(10万回)の加算ができる。



▼比較対象の選定


というわけで、現代のマイコン代表。

3つの理由があり、ファミコンを比較対象としたい。


もっと細かく書くと、ファミコンの CPU である 6502 が比較対象だ。


メモリ搭載量や動作周波数はファミコンに倣う。

しかし、主に計算能力の比較とし、ファミコン全体の性能を見るつもりはない。



ファミコンを選ぶ理由の1つ目は、有名でありながら、十分に低性能だからだ。

そもそも ENIAC が「世界初」のコンピューターであり、性能を期待できない。

現代の CPU と比べたら、差が大きすぎて面白くもなんともない。


ファミコンはもう40年前の機械だけど、知名度はいまだにある。

知らないはずの世代でも、Switch のエミュレータを見たことくらいはあるだろう。



もう一つの理由だが、僕個人の記憶で、確かファミコン現役当時のベーマガ(当時人気のあったパソコン雑誌)に、「ENIAC はファミコン程度の能力しかなかった」と書かれていた気がするのだ。


記憶にすぎず、ベーマガではなく別の雑誌だったかもしれない。

でも、「ENIAC はファミコン程度」という言葉を知っている人はいるようで、Yahoo知恵袋でもそういう質問があった


「ファミコンの方が圧倒的に高性能」という答えがベストアンサーになっていたのだけど、圧倒的というほどなのか調べたい気持ちもある。



3つ目、最後の理由だ。

冒頭で書いた Twitter でつぶやいていた人は、僕の書いたページ「Z80 vs 6502」の URL をツイートしてくれていたのだ。

だから、エゴサーチで見つけたのだけど。


該当ページは、MSX の CPU としての Z80 と、ファミコンの CPU としての 6502 の速度比較を行ったものだった。


じゃぁ、その 6502 と、ENIAC を比較してみようじゃないか。



▼ファミコンの計算能力


6502 CPU は、8bit 計算しかできない。

しかも、同時並列の計算能力もない。ENIAC に比べると、ずっと低性能だ。


しかし、ENIAC と違い、柔軟なプログラム能力がある。

プログラム能力の違いは後で詳細を書くが、計算は「1回に」 8bit しかできないが、繰り返すことで、もっと大きな数値を扱うことも可能だ。


さて、ENIAC の 10進10桁の記憶能力は、2進数だと 34bit 相当になる。

しかし、8bit を単位とする現代の CPU では、ちょっと中途半端な数値だ。


ここは、少し足りないが 32bit で計算させてもらうことにしよう。

(これだと、10進数にして9桁が計算の限界となる)



6502 では、先に書いたように1度の計算は 8bit しかできない。

もっと大きな bit 長の計算をしたい場合は、メモリに置いた数値同士を足すことになる。


そこで、メモリ同士の足し算を示めそう。


LDA >1 ; 3

ADC >0 ; 3

STA >0 ; 3


なんのことやらわからないかもしれないが、これが「1番地の数値を、0番値に足す」というプログラムだ。

; の後ろに書いてあるのは、必要な時間だ。単位は「クロック」。足し算には 9クロック必要と分かる。


これで 8bit の計算が終わるが、値を保持するメモリ番地を変えながら単純に4回繰り返せば、32bit 分の計算になる。


というのも、6502 の足し算は「前の足し算の繰上りも足す」ようになっているからだ。

繰り返し計算をしたことで、ひっ算のように「上の桁」を計算していったことになる。


ここまでで、36クロック。


しかし、ちょっと待って欲しい。

繰上りを一緒に足している、ということは、一番最初の計算はおかしなことにならないか?


そこで、最初に「繰上りを消す」という前処理を入れないといけない。


CLC ; 2


これだけでいい。

合計 38クロックで、32bit の足し算が終わる。

これが、6502 の計算能力だ。


では、これは実際どの程度の速度なのだろう?


ファミコンの場合、1.79MHz のクロックが使われている。

これは、1秒間が 1790000クロックだ、という意味だ。


38クロックで割ると、47105 という数が出てくる。

これが、ファミコンで1秒間に行える、32bit 足し算の回数だ。


▼計算速度比較


ENIAC は1秒間に 10万回の10進数10桁加算が行えた。

一方、ファミコンは1秒間に 4万 7千回ほどの 32bit 加算が行える。


計算できる桁数はほぼ同等と見なして、ファミコンは ENIAC の半分程度の性能だ。



まぁ、実際にはどちらもピーク性能を出すことは難しかったと思うが、並列演算を使いこなす方が、順次演算を使いこなすより難しい。


この点で、「実効性能」で見たときは、ファミコンと ENIAC は同等、というのはそれほど間違っていないように思う。



▼メモリ搭載量


現代的には、プログラムはメモリに格納するし、処理対象のデータもメモリに格納する。

処理後の結果も一時的にメモリに置いておき、後でまとめて示したりする。


とにかく、メモリはコンピューターに不可欠の存在となっている。



しかし、ENIAC の時代は違う。


ENIAC は数式の「計算方法」をプログラムできる。

このプログラムとは、加算機の保持するデータを、別の加算機に加算する…というのを、配線で示すのだ。

つまり、プログラムにメモリは必要ない。


数式に入れる初期データは、パンチカードの束で示される。

結果は直接印字されるか、一旦パンチカードの束として出力され、カード集計機でソートなどの処理を行ってから、別の機械で印字された。


つまり、データを保持するためのメモリは必要ない。

または、パンチカードという「外部メモリ」を、必要に応じていくらでも使用できる。




ENIAC の持つメモリとしては、まず加算装置だろう。

先に書いた通り、10進数 10桁 20本。


今回は、32bit (4byte) ということにしているので、全部で 80byte 。

これが書き換え可能な全メモリだ。



ところで、ENIAC は先に書いたように、数式の微分を繰り返すと、足し算に分解される性質を利用して計算を行う。

しかし、三角関数などは、微分しても足し算にならない。


そこで、これらは「数表」を使って処理する。関数の結果表を用意して、その数値を使うのだ。


このための「数表装置」は 10進数 6桁 の数値を、204本設定できた。

この装置は 3台あった。


10進数 6桁は、20bit で表現できる。ここでは、24bit (3byte) としておこう。

すると、1台の数表装置は、 3*204 = 612byte のメモリ、ということになる。

3台で 1836byteだ。


これは、現代的には ROM に相当する。




一方、ファミコンは 2048byte の RAM を搭載している。


6502 の特性上、256byte は計算時に使用する特別なメモリだ。

計算時に使用する、ということで、ENIAC の加算機の容量に相当するもの、と思ってもよい。


また別の 256byte は、スタックという、これも特別なメモリとして予約される。


自由に使ってよいのは、残る 1536byte だ。


さらに、プログラムなどは最大 32Kbyte の ROM に格納された。

固定データも ROM に入れることができる。




先に書いた通り、ENIAC の時代にはメモリは「必要とされなかった」。

だから、メモリ量の大小は、比較の優劣とはならない。


それでも「ファミコンの方がメモリがあった」と思う人はいるかもしれない。

しかし、ENIAC はデータ入出力にパンチカードが使えたことを忘れてはならない。


これは読み書き自由な記憶装置で、必要であれば無制限に使えた。

水爆の設計計算の際には、100万枚のカードが使用されたそうだ。


データ処理能力、という点で見れば、ENIAC は高い能力を持っていた。



▼プログラム能力


何度も書くが、ENIAC はひたすら加算を繰り返すことで、目的の値を得るためのシステムだ。

だから、プログラムというのは「どのデータを、どのデータと足すか」をひたすら示すことになる。


先に書いた通り、ENIAC は配線によってプログラムを行う。

あくまでも「どこを足し合わせるか」など、結び合わせたい対象を、配線で結ぶだけだ。


配線でプログラムした、という話を、ENIAC を分解して論理回路を組みなおしたようにとらえている人もいるようだが、そんなに複雑ではない。


加算をひたすら繰り返す、というのが ENIAC の基本なので、「繰り返し」は当然だった。


プログラムは複数作ることができて、計算結果を条件にして、どのプログラムを使用するか選ぶこともできた。


例えば、弾道計算では、風速や空気抵抗なども考慮しながら弾の高度・距離を計算していき、高度が「マイナスになったら」という条件で、その時の距離の数値を印字する、などの動作ができる。


さらに、印字後には次の初期条件をパンチカードの束から読み込み、再び計算開始…


などとしておけば、用意した初期条件の計算をひたすら繰り返し、結果を印字し、弾道計算表を作り出すことができた。



しかし、ENIAC のプログラムは、その程度だ。

基本的に、1つの数式に基づいた計算を、条件を変えながらひたすら繰り返す機械だ。


ENIAC は「高速計算機」であり、現代的な意味でのコンピューターではない。




ファミコンは、現代的なコンピューターだ。

多くの説明はいらないだろう。ファミコンのプログラムは、現代の多くの人が考えるプログラムと同じだ。


数値計算だけでなく、複雑な条件による「処理」ができる。

マリオがノコノコを踏んだら、甲羅が滑っていく…というのは、数式1本の処理ではないが、ファミコンなら難なく処理できる。


コンピューターを、なんでも処理できる機械としてとらえるなら、明らかにファミコンの方が能力が高い。



もっとも、これは後出しジャンケンだ。

ENIAC は高速な計算機として作られているので、「計算以外できない」のは当たり前だ。



▼まとめ


以上、ファミコンの 6502 と ENIAC を、無理やり比較してみた。


計算能力、メモリ搭載量、プログラム能力の3つの指標で比較しているが、当然のことながら、計算能力以外は比較することすらできない。


そして、計算能力だけでいうと、ENIAC の方が倍くらいの性能があった。



実は、比較前はファミコンの方が能力が上だと思っていた。

比較して10倍の性能差がなければ「同等」と認めた記事にしようと思っていたのだ。


でも、調べたら ENIAC の方が倍くらい高速だった。

だから「それ以外」の比較もしたのだけど、こちらは概念が違いすぎ、比較することができなかった。


とはいえ、一長一短あるので、能力として「ファミコン程度」というのは妥当な表現のように思う。



知恵袋で「ファミコンの方が圧倒的に高性能」と書いた人は、何を根拠に書いたのかわからない。

まぁ、以前も書いたのだが、あのような Q&Aサイトは信用してはならないものだと思っている。



なお、僕は ENIAC を現代的な意味での「コンピューター」としては認めない立場だ。


あくまでも「現代的な意味での」ね。

その違いが分かっていれば、世界初のコンピューターと呼んだってかまわない。



同じテーマの日記(最近の一覧)

コンピュータ

関連ページ

ENIAC

微分積分いい気分【日記 21/01/29】

Programming Tips

別年同日の日記

04年 お父さんのための出産教室

06年 夏至祭

08年 ルータ変更

13年 報告書の書き方

14年 ブレーズ・パスカルの誕生日

15年 トーマス・J・ワトソンの命日(1956)

15年 パンク

19年 飲み会二つ


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

2000

-- follow --




- Reverse Link -