読んだ: コンピュータアーキテクチャのエッセンス

f:id:dombri:20210124122338p:plain

こんにちは、お久しぶりです。

前回の投稿から5ヶ月程経ってしまいました。何かイベントがあったわけではなく、書く気力が起きなかった、つまりおサボりです。
何事も、一度続けていたものを止めてしまうと、再開するのにはものすごくエネルギー要りますね。

今回は「書籍の感想をSNSに投稿する」企画に応募したら当選し、書籍をいただき、実際に読んでみたことについて記します。Twitterに感想を載せるだけでもOK!なのですが、とても良い本で紹介したいなと思ったことと、せっかくならブログ再開の足掛かりにしちゃえ!と。
企画・ 書籍の手配をしてくださった翔泳社さんに感謝です。

www.shoeisha.co.jp



書籍について

www.amazon.co.jp

先にお伝えしておきたい事ですが、私はこの本の内容を50%、いや3分の1も理解しているか、怪しいです。
これは決して書籍の書き方・内容が悪いのではありません。扱っている項目に馴染みがなかった(抽象化されていることで、普段は考慮してなくても仕事ができてしまう)ことや、電子工学系の知識について詳細に記されているため「うむ、難しい!」と若干の拒絶反応を感じながら読み進めたことが原因だと自覚しています。

工学に明るい方は、すらすらソフトウェアとハードウェアの関係性を理解していけると想像できますし、私のような拒絶反応出ちゃう系の方にも、おすすめしたい書籍でもあります。

詳しい内容はぜひ実物をお手にとって!と言うことで、

  • この書籍からどんな学びを得られるか?
  • どういう方が読むと良さそうか?

について考えてみようと思います。


対象読者

独断と偏見で「こういう方に読んでもらいたい」と思う例を挙げてみます。

  • プログラムの知識はついたが、コンピュータの形式の理にかなったコーディングができるようになりたいと考えているSWE
  • 漠然と、コンピュータアーキテクチャの知識の土台がなくて焦りを感じているエンジニア
  • コンピュータアーキテクチャを学び直したい人

書籍全体的に、「ソフトウェアエンジニア(プログラマ?)目線で」コンピュータアーキテクチャについて語ることを意識されています。ハードの詳細すぎる説明は行わずに、プログラムを動作させた時の、普段は抽象化されていて見えないコンピュータアーキテクチャの視点を紐解いていきます。

大学教授が記していることもあり、各章の末尾に「練習問題」があります。まるで大学の講義を聴き、課題が出されているかのような気分を味わえます。

各部の紹介

本書は5部から構成されています。
デジタル回路の基礎から始まり、プロセッサ・メモリ・入出力のシステムといったアーキテクチャの中心的な登場人物、高度な話題(並行処理、パイプライン、性能など)と言った流れです。

以下では、各部の概要と印象に残った言葉をピックアップして紹介します。


序論と概要

コンピュータアーキテクチャは、ソフトウェア開発にとり極めて重要。例えば、アーキテクチャの基本を知っているプログラマは、プログラミング時に処理の相対的なコストを理解しているために判断を下すのが楽になったり、デバッグが上手になる、と言われています。
電子工学の背景知識がなくても、主なコンポーネントのシステム全体における役割がわかるよう解説しています。

ハードウェアを理解すると、より小さくて高速でエラーを起こしにくいコードを書ける


第1部 基礎

この先で触れるどの話題にも、必ず「デジタル情報を表現し操作するために電子的な機構を使う」と言う問題が関わってきます。これらを理解するための背景知識として、本部ではデジタル回路・データ・プログラムの表現について解説されています。

もしかしたら、1部が一番難しいかもしれません。ここが他部の説明の下地(アーキテクチャ階層の土台でもある)ではあるのですが、電子工学系の話がまま出てきて難しく(結構な拒絶反応)感じました。まずはさらっと流し読みをして、各コンポーネントの話を読んでから戻ってきてもいいかも。ここで挫折しては勿体無いので。

電子回路の特性により、それぞれの関数よりも、その論理の「逆」を表現する関数の方が、より少ないトランジスタで組める。このため、ほとんどのデジタル回路は「論理 OR の逆」と「論理ANDの逆」を実装している。つまり、「NOR」「NAND」の論理だ。

一群の要素に対して同じ処理を行う必要があるとき、ソフトウェアとハードウェアでは使う手段が大きく異なる... 複数の要素をハードウェアで扱うための基本的なパラダイムは、反復ではなく「複製」だ。ハードウェア技術者は、ある回路のコピーを複数作る。それぞれの回路は1個の要素を処理するだけだが、すべてのコピーが同時に実行される。...複製の利点は、エレガントになり、速度が向上し、信頼性が高まることだ。


第2部 プロセッサ

CPUの成り立ち、なぜこのような構成(数十億ものトランジスタ、複数のコア)をしているのかという設計思想、どのようなCPUが求められているのか等の話題を、プログラムの実行の観点から掘り下げていきます。「速度の追求」のために、CPUが複雑化し、それをどう達成しているのかが詳細に説明されている部です。

全てのプロセッサに唯一最適な型(オペランド)は、存在しない。

高速CPUの複雑さを生む最後の、おそらく最大の要因は、速度の追求から生じる。...平行処理は、高速なハードウェアを作るための基礎的なテクニックだ。ゆえに、最高の性能を達成するには、CPUの「機能ユニット」を複製せざるを得ない。


第3部 メモリ

メモリでもっとも重要なポイントは、根底にある「テクノロジー」と「構成」。これらの基本的な特性や形式について、メモリの動作、そして入出力を通じてデバイスとメモリの関係性について説明されています。
仕組みだけでなく、そのような形になった経緯がわかるので、腑に落ちる感覚を得ながら読み進めることができます。

現在のコンピュータシステムのほとんどは、プログラムとデータを一つのメモリに置くが、命令ストアをデータストアから切り離すことは可能である。...それぞれの動作に適した性能のメモリを選択できるようになる。

メモリの性能を図るには、常にリード演算の性能と、ライト演算の性能の、ふたつの値が必要だ。...メモリの性能を評価するには、そのシステムが「演算のシーケンスを、どれだけ速く実行できるか」を計測する必要がある。


第4部 入出力

コンピュータと外の世界(デバイス)との接続について紹介されています。 入出力装置とプロセッサの関係性、交信方式、データの多重化やバスについて。デバイスドライバやバッファリングについても取り上げられています。

プロセッサはコントローラに要求を出して、その応答を受け取る。コントローラは、それぞれの要求を適切な外部信号に変換し、その信号によって、要求された機能が外部デバイスで実行される。プロセッサが対話を行うのはインターフェースであって、外部デバイスではない。

オーバーヘッドを削減して入出力の性能を最適化するプログラマは、アプリから呼び出すシステムコールの回数を減らさなければならない。これには、システムコールごとに転送するデータを増やすことが鍵となる。


第5部 高度な話題

これまで述べられてきた各コンポーネントの垣根を超えて、アーキテクチャの基本的な概念が「並列(パラレル)」「パイプライン」「性能」などの観点から説明されています。

現代のコンピュータシステムは、OSが全部の処理を制御する。・・・このため、実行できるOSのコピーはただ一つである。・・・複数のプロセッサがOSという共有リソースを競合する形になる。その結果OSは、急速にボトルネックとなる。

ほとんどのアプリケーションは「入出力に束縛される」。それはアプリケーションが、計算や実行より入出力を待つことに多くの時間を費やすと言う意味だ。

機能をソフトウェアからハードウェアに移せば性能を高めることができる。機能をハードウェアからソフトウェアに移せば柔軟性を高めることができる。


最後に

ボリューム(400P程度)、内容に関して若干の抵抗から始まった読書でしたが、総じて「読んでよかった」「また読み返したい」と思える書籍でした。
「CS系の学部に行っていたら、こういう講義が聞けたのかな〜」と言う感じに、大学に通っている気分にもなれます。
コンピュータの「本質」を理解することで、一つステップアップしたい方におすすめです。