見出し画像

投機的実行を考えてみる

ちょっと前にCPUの製造プロセスに関する記事を書きました。

ハードウェアという観点では、プロセスルールを小さくして集積度を高くすることで性能の向上を図っていましたが、ソフトウェアでも速度を上げる工夫がなされています。この1つが投機的実行(speculative execution)です。

CPUで早く処理をさせる投機的実行

まず、投機的実行とはどういったものかということを整理しておきます。ここで、あくまでぼくの理解ですので、厳密には違っているところもあるかもしれません。よろしければ、ご指摘いただけるとありがたいですm(_ _)m

まず、プログラムは以下の手順で実行されます。

  1. プログラム実行時に、OSに必要なメモリ領域を要求する

  2. OSはそのプログラム用に要求通りのメモリ領域を割り当てる

  3. 確保したメモリ領域のアドレスをプログラムに通知する

  4. メモリにプログラム実行に必要な”命令”と”使用するデータ”を展開

  5. CPUがプログラムの処理を順番に実行する

  6. CPUが処理を実行するとき、命令と必要なデータをメモリからCPU内のレジスタに読み込んでから処理する。

つまり、CPUはプログラムで書かれた処理を、順番に必要なデータをメモリからレジスタに取り込んで実行しています。ここで、速度という点でいうと、CPUの処理速度に比べるとメモリからレジスタへの読み込みが非常に遅く、処理速度のボトルネックになっています。

このボトルネックを解消して速度を上げるための対策として、投機的実行が登場します。プログラムで処理1~処理3があり、処理1の結果が成功したら処理2、失敗した処理3が実行されるとします。通常であれば、処理1が実行され、その結果にて条件判定が行われて処理2、あるいは処理3が行われます。処理時間としても、処理1+条件判定+処理2だけ必要になります。

ここで、投機的実行の場合は処理1の結果を待たずに、先に処理2を実行しておくことで処理時間を短縮させます。処理1が終わっていないので、処理2が実行される保証はないんですが、処理速度を上げるために先に実行しておく訳です。もし、処理1が失敗して処理2が必要なくなったときは、結果も含めて破棄してなかったことにするという挙動になります。投機的実行を効率的に行うためには分岐予測によって確度の高い処理を実行させるようになっているようです。

プログラムの処理フロー パターン1
パターン1の処理時間

もう一つ、速度を上げるための手法としてアウトオブオーダー(out of order)があります。これは、プログラムに記述された処理の順番通りでなく、必要なデータが揃った命令から実行するというものです。例えば、処理1から処理4までが順番に行われるプログラムの場合、順番に実行するのではなく前後の依存関係がない、例えば処理1の結果に関わらず処理2から処理4を先に実行してしまうということです。アウトオブオーダーは、いずれ処理すべきことを先にすることなので、最適化って感じですね。

プログラムの処理フロー パターン2
パターン2の処理時間

個人的には、投機的実行の考え方がかっこいいなーと思ってました。自分で作るアプリケーションにも応用できたりしないかなぁと考えたこともあったんですが、まだ実際には試せてないです。ちなみに、この分岐予測がどうやっているかに興味があったりします。

CPUの脆弱性(SpectreとMeltdown)

そもそも投機的実行を知ったきっかけが2018年にニュースとなった「プロセッサの脆弱性問題」です。いわゆるSpectreとMeltdownと呼ばれた問題です。当時、かなり話題になりましたよね。

まず、投機的実行に対する脆弱性がSpectreです。投機的実行において、先行した処理が不必要となったときに使用したメモリ領域などを解放するんですが、ここに脆弱性があり、先行して行った処理の痕跡が残ってしまうそうです。この脆弱性を突いて、痕跡をわざと作った上でアクセスできないメモリ領域の情報を読み出すことが、Spectreという脆弱性です。これは特定のCPUアーキテクチャに依存した脆弱性ではなく、x86(インテル、AMDおよび互換CPU)、ARMでも発生していました。

Spectreのロゴ

次に、アウトオブオーダーに対する脆弱性がMeltdownになります。MeltdownもSpectreと同様に、先行して行った処理の痕跡に対してアクセスできないメモリ領域の情報を読み出す脆弱性になります。


Meltdownのロゴ

以下のページを参考にさせていただきました。

https://msystm.co.jp/blog/20191005.html


2023年3月24日にIntel社の共同創設者で「ムーアの法則」の提唱者として知られるGordon Moore氏が永眠されました。「ムーアの法則」は半導体技術の進歩を予測したものでしたが、その成長度を目標にしてきた面もあるように感じています。投機的実行にしても、アウトオブオーダーにしてもある意味ではその努力の一部だったんじゃないかと。

一方で、SpectreもMeltdownも処理を早くしようとして考えられた方法に対する脆弱性でした。が、こういった脆弱性があったとしても、業界としての明るい未来を「ムーアの法則」という1つの形で見ながら進めることがすごく大事じゃないかなと。道が示されているということがいかに大事かを感じました。


この記事が気に入ったらサポートをしてみませんか?