この記事は、Elixir Advent Calendar 2024 シリーズ1 の23日目です
昨日は、@koyo-miyamura さんで、「再利用性の高い Tesla.Mock の使い方」 でした
piacere です、ご覧いただいてありがとございます
前回 はElixirChipの一大領域である「宇宙開発」に対するモチベーションと、ElixirChipが宇宙開発とリンクするに至ったストーリーを伝えましたが、今回は、ElixirChipを作るきっかけとなった「ノイマン型コンピュータ」の闇(つまり問題点)と、その解消案(つまりElixirChipの基本方針)について語っていきます
なお、私はコンピューティングとデータ処理、並行分散ソフトウェア/OS開発、SaaS事業経営の専門家ではありますが、CPU開発および宇宙開発に特化した専門家ではありません
また、科学コミュニティを主催してはいますが、アカデミックな面で上記を専攻していない「野良科学者」のため、各分野にご興味高い方や造形深い方、現業で有識な方とディスカッションしたり、ご教授いただけたら嬉しいです
あと、このコラムが、面白かったり、役に立ったら、 をお願いします
ノイマン型コンピュータ … 70年に渡る「呪い」
現代のほとんどのコンピュータやスマホ、クラウドは、「ノイマン型コンピュータ」というアーキテクチャに準じています(Google TPUや量子コンピュータはその例外)
このアーキテクチャは、稀代の数学者、ジョン・フォン・ノイマンによって約70年前に考案された「メモリに置かれたプログラムを実行する」というアーキテクチャで、現代まで続くコンピュータの基礎として今も現役です
具体的には、CPUとメモリの間、ないしはCPUとHDD等の外部記憶装置の間をバスで繋いで、CPU命令がこれらとのデータのやり取りを行うことでプログラムを実行する方式です
このノイマン型コンピュータの性能を上げるためには、「クロック周波数」を上げたり、1クロックあたりに実行できる命令数を増やしたり(Out of Orderと呼ばれる)、CPU内のキャッシュを大きくする等の改善が何十年と繰り返されてきました
2003年付近には、コンピュータが正常に動作させられるクロック周波数限界(3GHz付近)を迎え、以降はコア数を増やす方向(マルチコアと呼ばれる)でCPU単品の性能向上では無く、複数のCPUによる性能向上へと切り替わりました
しかし、幾らCPUを高速化したところで、CPUよりも遥かに速度が低いメモリと外部記憶装置のキャップにより、性能限界が発生します
この問題は、「フォン・ノイマン・ボトルネック」と呼ばれており、「性能劣化」と「電力消費増大」を引き起こします
なぜノイマン型は問題が起こるのか?
そもそも、この問題が起こる原因は、「ほとんどCPU命令がメモリアクセスを避けられない」設計になっているからです
CPUが何かを処理する際、インプットデータをメモリから読み取り、アウトプットデータをメモリに書き出します
これが、かなり細かい単位で行われるため、CPUとメモリの間は、何往復ものデータがやり取りされます
そのたびに、下記が発生しており、これが「性能劣化」と「電力消費増大」の元凶です
- 性能劣化要因
- CPUが高速でも10〜100倍遅いメモリに速度が制限される
- CPUの100~1,000倍遅いCPUとメモリの間のデータ転送に速度が制限される
- CPUキャッシュヒットミス
- サーマルスロットリング:メモリアクセス増加時の熱設計限界抑制
- 電力消費増大要因
- 頻繁なメモリアクセスによる電力消費増加
- 低速なメモリとの速度差により、CPUに発生する待機時間も電力消費が発生
- クロック周波数の2乗倍、電力消費は上昇する
- メモリアクセスを減少させるためのCPUキャッシュの過剰利用
- シングルコアでもマルチコアでも電力消費は同じ … 相対的にマルチコア化できていないプログラムが電力消費量を引き上げている
多少、アーキテクチャが異なるものの、「生成AIの学習による電力問題」も、突き詰めれば上記制約により発生していると言えます
メモリへのアクセスを最小化することが重要
こうした問題を解決するには、端的に「メモリアクセス頻度を減らす」ことが重要です
しかし、ノイマン型CPUは、そもそも設計思想上、コレが不可能です
そのため、ノイマン型アーキテクチャに囚われない「非ノイマン型コンピュータ」の開発が避けて通れません
これが、ElixirChipを開発するきっかけとなっています
下図は、それを分かりやすく表現した図です
Elixirの「イミュータブル」も貢献する
上記で、「CPUキャッシュヒットミスによる性能劣化」や「CPUキャッシュの過剰利用で消費電力増加」というトピックを挙げました
これは、「メモリの破壊的更新」によって引き起こされます
なので、Elixirのようなイミュータブルなプログラミング言語を使えば、原理上、キャッシュ利用を最小化できます
プログラミング言語の仕様が、性能や電力消費に影響する点は、なかなか取り沙汰されないトピックかも知れませんが、これも現代コンピューティングにおける課題の1つなのです
Elixirの「並行・並列」も貢献する
上記で、「シングルコアでもマルチコアでも電力消費は同じ … 相対的にマルチコア化できていないプログラムが電力消費量を引き上げている」というトピックを挙げました
これは、普通にプログラミングをしているだけでは、シングルコア利用のプログラムが出来上がるので、相対的に電力消費の高いプログラムを開発していることになります
Elixirのような、マルチコア対応が進んだプログラミング言語を使えば、シングルコアのコードを簡単にマルチコア化できるので、この問題を解消できます
これも、プログラミング言語の仕様が、性能や電力消費に影響する例の1つで、プログラマをやっていても認識していない方は、相当多いと考えられます
ノイマン型では70年前の方式は現代の需要を支えれない
およそ2015年付近から、大量ユーザー/データのITサービスが当たり前となってきました(以前はC10Kと呼ばれていました)
そうした状況に対し、ノイマン型コンピュータという70年前のアーキテクチャが通用していること自体が奇跡に近い出来事なのですが、一方で、私達はもう少し現実を見る必要があり、いつまでも70年前の威光の影におんぶに抱っこのままではいけないと考えます
また、性能制御や電力消費制御も、これまではプログラミングで積極的に扱われて来なかったトピックですが、今後はそうでは無くなって来る点も、ノイマン型が生まれた70年前には議論されていないため、現代に生きる私達が考えなければならない対象です
私達エンジニアは最適化不足なCPUに苦しめられている
そして、大量ユーザー/データが普通に扱われるこの時代、こうしたCPUの問題点を帳消しにするために、私達エンジニアは苦労させられる構造に立たされています
本来、ソフトウェアの品質を最大化するためにあるはずのハードウェアに苦しめられるのは、本末転倒と言わざるを得ません
このような、コンピューティングとプログラミング言語の最適化が不十分なことでもたらされている課題を、私達はそろそろ真剣に考え始めなければならないと捉えています
最後に、上記内容を含む全体的な構想は、下記スライドに残していますので、良かったらご覧ください
終わりに
普段、当たり前に使っているコンピュータに、こうした「闇」が数多くあることが、ご理解いただけたでしょうか?
私達は、70年に渡る「呪い」にかかっています
そして、それに気付き、解消できるのも、また現代を生きる私達自身です
それはある種、人類とコンピューティングの歴史において、70年間も続いたノイマン型コンピュータの時代から非ノイマン型コンピュータが台頭する時代を目の当たりに出来るという、極めてエキサイティングなイベントです
これにより、人類や、人類が保有する技術の在り方が根本から変わるレベルの変革を迎えようとしています
そうしたタイミングに出会うこと自体が幸運なのですが、この私のコラムをご覧いただき、新たな領域を共有できる出会いも奇跡そのものですので、もし今回のアイデアが気に入ったら、X/Twitter DMにご連絡ください … 何か一緒にやりましょう
p.s.このコラムが、面白かったり、役に立ったら…
明日は、 @B_tanuki さんで 「ElixirDesktop: WebViewからAndroidとiOSの機能を呼び出し」 です