IBM - SSEC
目次
条件分岐
しかし、頻繁に停止しているようでは、マーク1と大して変わりません。
いや、マーク1よりも計算速度がずっと上がっているからこそ、停止して「人間が作業する」時間の無駄が大きいとも考えられます。
「元に戻る」か、「そのまま続ける」かを自動的に選べたら…
実は、SSEC はそのようなプログラムが組める工夫がありました。
SSEC の特許書面では、ニュートン法で平方根を求めるプログラムが明示されています。
「十分な精度となるまで、繰り返し計算して精度を高めていく」という方法です。
プログラムの最後で、精度が十分か否かを数値に反映して、2つの数値を作り出すようにしています。
1つは「元のテープ装置」の番号、もう1つは「今のテープ装置」の番号になる、巧妙な計算です。
そして、これをリレー記憶に書き込み、そのリレー記憶に処理を移します。
SSEC では、データも命令も 20桁でした。これは、実は巧妙に計算された設計です。
さらに、「次の命令の装置」は、命令の末尾2桁でした。計算で求めた「番号」は、末尾2桁に収まります。
…さて、リレー装置に処理を移したら、SSEC は先ほど計算した2桁を取り出し、その装置に「分岐」します。
これで、条件分岐が実現できました。
ここに上げた例では、サブルーチンがループしていて、そのループから元に戻るか否か、という判断でした。
しかし、テープ装置は30台もあるので、もっと自由な条件分岐も可能、と理解していただけるかと思います。
演算速度
SSEC の目標であったマーク1は、1分間に200cycle で動くことができました。
1cycle で1回の加減算を行い、掛け算には8~20cycle かかっています。
ただ、「掛け算の指示」には3命令が必要なので、実際の掛け算時間は 11~23 cycle でしょう。
SSEC の動作速度は、特許書面上には書かれていません。
細かな部品単位での「速度」は書かれていますが、掛け算が 20ms、リレー記憶へのアクセスが 20ms 、というあたりが最も遅い部類です。
メインプログラムが紙テープに入っていますが、こちらは各種資料を基に計算すると、どうも1秒に120命令を読み込めたようです。
1命令の読み込み時間は 8ms 。電気で動くリレー記憶より、物理的な紙テープの方が速いです。
特許書面によれば、SSEC を使って月軌道の計算を行った際、11,000回の蓄積処理、9,000回の掛け算、2,000回の表引きを行って、大体7分で終了した、と書かれています。
蓄積処理というのは、英語では「accumulations」ね。
これ、訳すの難しいので「蓄積」としたけど、加減算やデータ移動など、基本的な処理のことです。
表引きは「平均1秒」とのことなので、2000回も表引きを行ったら、それだけで7分超えてしまいそうですが…
検索時間は表のサイズにもよるので、小さな表で十分だったのかもしれません。
この計算例だと、高速な基本処理も低速な表引きもあわせて、22,000回の演算を行っています。
これを7分間、420秒で割ると、1秒におよそ 50命令を実行しています。
先に書いた通り、プログラム自体の読み込みは秒間120命令。
実際の実行が 50命令ですから、理論限界よりはかなり遅くなったのでしょう。
(掛け算やリレー記憶へのアクセスが命令読み取りより遅いので、当然とも言えます)
SSEC にまつわる誤解
マーク1に勘違いが多かったように、SSEC もまた、勘違いされることが多い機械です。
ここで、代表的なものを2つと、その他こまごましたものを書いておきます。
SSEC はプログラム内蔵型か?
今挙げた、ニュートン法で平方根を求めるサブルーチンの例を根拠として「SSEC が世界最初のプログラム内蔵型マシンである」という主張があります。
プログラム内蔵型は現代型のコンピューターの要件として重要なものです。
我々が普通に言う「プログラム」というのは、メモリに置かれたものです。メモリ内容にすぎないため、ディスクから読み込んだプログラムを実行したりできます。
ENIAC のように「配線でプログラムをする」などは、現代ではなかなか行われません。
先ほどの例で、SSEC はリレー記憶に「次の命令を取り出す装置」を指定する命令を書き込み、そこにジャンプして、命令を実行しました。
なるほど、これだけを見ると、メモリに置いたプログラムを実行できる、プログラム内蔵型であるかのように見えます。
しかし、SSEC はプログラム内蔵型ではありません。
理由は簡単で、メモリにプログラムを置くことを想定していないためです。
SSEC には、メモリの「どこ」を実行中かを示す、プログラムカウンタがありません。
紙テープの場合、順次送れば次の命令を示すはずなので、プログラムカウンタという概念自体が不要なのです。
連続したメモリを「次の装置」として指定し続ければ実行を続けられるかもしれませんが、その場合、たった 99 命令しか実行できません。
「次の装置」の番号は、2桁しかないためです。
リレー記憶自体は 150本分ありますが、そのすべてを実行することすらできないのです。
メモリ上の「命令」を実行することができた、というのは、メモリ上に「プログラムを置けた」ことを意味しないのです。