📚

Nand2Tetris読書会(5章)

2021/06/28に公開

概要

Nand2Tetris読書会 を開催しています。
今回取り上げるのは、5章『コンピュータアーキテクチャ』です。

前の記事は こちら

内容

1~3章で作成した組み合わせ回路と順路回路を使って、4章で学んだ機械語プログラムを実行できる汎用コンピュータを作っていく。

デジタルコンピュータの最大の特徴は、利用者の目的に合わせていろいろな処理を可能にする柔軟性にある。
これはプログラム内蔵方式という考え方によってもたらされたものである。

これによって生み出されたコンピュータモデルのうち、以下の2つが特に重要である。

  • 万能チューリングマシン: 抽象的な人工的なコンピュータ。
  • ノイマン型コンピュータ: 実用的なアーキテクチャ。

ノイマン型コンピュータは、中央演算装置(CPU)を中心に、メモリデバイスの操作、入力デバイスからのデータ受け取り、出力デバイスへのデータ送信を行う。

  • メモリ: 2種類の情報が格納されるが、いずれもバイナリで表現されてRAMに格納されるのは同じ。
    • データメモリ: 変数、配列、オブジェクトなどを機械語に変換したバイナリデータを格納する。読み込みと書き込みの両方が可能。
    • 命令メモリ: 高水準言語で書かれたコマンドを機械語に変換した命令を格納する。CPUはここから命令を読み込んで、解読して実行する。その後次の命令の場所を計算する。命令メモリの内容を変えると、全く別の操作が可能。
  • CPU: 現在読み込んでいるプログラムの命令を実行する。これらの命令では、計算の実行、メモリからの値の読み書き、条件に応じた命令場所の移動などがあり、それらを以下のハードウェアで実行する。
    • ALU: 下位レベルの算術計算・論理計算を行うように設計されている。設計によってコンピュータが特徴づけられる。
    • レジスタ: CPUは単純な計算をいかに早く行うかを重視して設計されるため、計算結果を近くに格納することが望ましくCPUにはレジスタが備えられている。各レジスタは1ワードを保持できる。
    • 制御ユニット: メモリからバイナリコードで表された命令を読み込む、命令をデコードする、命令を実行する、次の命令を読み込む、という処理を繰り返し実行する。
  • レジスタ: メモリアクセスには、メモリ間の往復やメモリ中の探索などで一定の時間を要するが、レジスタの場合は高速にデータの取得・格納が行える。
    • レジスタは、CPU回路の中に物理的に存在しており、アクセスは一瞬でできる。
    • メモリ中のセルの数は非常に膨大だが、レジスタはわずかしか存在しないため、機械語の命令でレジスタを指定する場合は、少ないビット数があれば十分で機械語の命令フォーマットは短くて済む。
    • レジスタには以下のような種類がある。
      • データレジスタ: 簡易メモリのような役割。計算の途中結果を保持する。
      • アドレスレジスタ: メモリアクセスに必要な、メモリアドレスを保持する。
      • プログラムカウンタレジスタ: 命令メモリから次に読み込む命令のアドレスを保持する。
  • 入出力: コンピュータの外と双方向にやり取りをするためにI/Oデバイスを用いる。
    • メモリマップドI/O: 接続されるI/Oデバイスに関係なく、デバイスのための領域をメモリ上に割り当てることで、CPUからはI/Oデバイスをただのメモリ領域と見なすことができる。

Hackプラットフォームは16ビットのノイマン型コンピュータであり、以下の構成である。

  • CPU 1個
    • ALU
    • レジスタ3つ
      • データレジスタ(D): 16ビットレジスタ。データを保持する。
      • アドレスレジスタ(A): 16ビットレジスタ。使われる命令に応じて、データ値、RAMアドレス、ROMアドレスの3つの意味になる。
      • プログラムカウンタ(PC)
  • メモリモジュール 2個
    • 命令メモリ(ROM)
    • データメモリ(RAM)
  • メモリマップドI/O 2個(スクリーン、キーボード)

コンピュータを機能的に分類すると、2種類に分けられる。

  • 汎用コンピュータ: プログラムの差し替えが容易。
  • 専用コンピュータ: 他のシステムに埋め込まれたコンピュータ。単一のプログラムがROMに書き込まれているため、そのプログラムしか実行できない。

一方、プロセッサのパフォーマンス向上のために検討されてきたハードウェア設計には、以下の2つがある。

  • CISC(複雑命令セットコンピュータ): 複雑な命令セットを提供。
  • RISC(縮小命令セットコンピュータ): より単純な命令セットを提供。

予習メモ

万能チューリングマシン

チューリングマシンとは、アラン・チューリングによって考案された計算機の数学的モデルである。
チューリングマシンは、以下のような構成となっている。

  • マス目に分割された任意の長さのテープ
  • テープのマス目の記号を読み書きするヘッド
  • ヘッドの読み書きと、ヘッドの位置を制御する機能を持つ有限オートマトン

チューリングマシンの中で、あらゆるチューリングマシンを模倣できるものを万能チューリングマシンと呼ぶ。

https://ja.wikipedia.org/wiki/チューリングマシン
https://e-words.jp/w/チューリングマシン.html

命令セットアーキテクチャの設計手法

  • CISC: ひとつの命令が一連の複雑な処理を実行
    → ひとつひとつの命令の実行速度は遅いが、命令回数は少なくなる。
  • RISC: ひとつの命令が簡単な処理のみ実行
    → ひとつひとつの命令の実行速度は速いが、命令回数は多くなる。

https://ednjapan.com/edn/articles/1404/07/news001.html

ディスカッションメモ

最適化ってどんなことをやる?

本書の中では、以下のようなものが挙げられている。

  • メモリキャッシュ: メインメモリよりもCPUに近い位置にあるキャッシュメモリからデータ・命令を読み込むことで、メインメモリへのアクセスにかかる時間を短縮できる。
  • I/Oデバイスへの高速アクセス: DMA(direct memory access)によって外部デバイスと内部メモリの間でデータ転送をすることで、CPUにかかる負荷を軽減する。
  • パイプライン: 命令を複数の工程に分割し、それらの工程を並列に処理することで全体の処理時間を短縮する。
  • 並列化: 複数のCPU、あるいはCPUの複数コアに作業を分担させる。
  • 命令のプリフェッチ(先読み込み): 利用が予測されるデータを先にメモリに読み込んでおく。

他にこのようなものも有名。

  • 分岐予測: 命令処理の結果に応じて異なる命令を実行する場合、どの命令処理が実行される可能性が高いかを予測し、命令処理を先に実行しておく。

最適化については、こちらの書籍でも詳しく説明されているらしい。

https://www.amazon.co.jp/dp/B01M5FMGDL

CPUが複数ある場合、メモリはどうなっているの?

  • 複数コアがひとつのメモリを参照している。
  • 個々のCPUでレジスタやキャッシュを持っている。
  • 普通のコンピュータは、命令メモリとデータメモリを分けていないことが多い。
    • メモリの中は、以下のような領域に分かれている。
      • テキスト領域(プログラムデータ)
      • 静的領域(グローバル変数)
      • ヒープ領域(変数定義)
      • スタック領域(関数呼び出し)
  • キャッシュが、CPUのコアごとにあるかコアで共有しているかはキャッシュレジスタの種類による。

感想

本書の章立てとしてはここで一区切りといったところでしょうか。
ここまでの演習で作成してきたコンピュータはかなり簡易化されたもののようですが、それぞれの項目について調べていくとなかなか奥深くておもしろそうだなと思いました。
読書会でおすすめの(分厚い)書籍を教えてもらったので、時間を見つけて読んでみるつもりです。

予習のときに万能チューリングマシンについて調べたのですが、かなり概念的なもののようで理解に時間がかかったのが一番印象に残っています。

最後に

Nand2Tetris読書会始めました』の記事でも紹介していますが、読み進めているのはこちらの本です。
https://www.oreilly.co.jp/books/9784873117126/

初学者なりに書籍やその他に調べた内容をまとめていますが、理解が足りておらず間違ったことを書いているかもしれません。
そのような箇所を見つけた場合はコメントなどで指摘していただけると助かります。

次の記事は こちら

GitHubで編集を提案

Discussion