投機的実行

投機的実行（とうきてきじっこう、）とは、コンピュータに必要でないかもしれない処理をさせることである。この性能最適化技法は、パイプライン化されたプロセッサなどのシステムで使われている。

概要 
投機的実行は性能最適化の一種である。その主たる考え方は、処理が必要とされるかどうかを知る「前」に実行するというもので、それによってその処理が必要だとわかった「後」でその処理をすることで生じる遅延を防ぐ。その処理が不要だったと判明した場合、その結果を単に無視する。目的は余分な計算資源が利用可能な場合に並行性を向上させることである。

以下のようなテクノロジーがこの考え方を採用している。
 メモリとファイルシステムにおけるプリフェッチ
 分岐予測
 データベースシステムにおける楽観的並行性制御

プロセッサ 
近年のパイプライン化されたマイクロプロセッサは条件分岐命令のコストを削減するために、分岐命令の実行履歴に基づいてプログラムの実行経路を予測するという形で投機的実行を行っている。これを分岐予測という。性能向上と計算資源の有効利用のためには、分岐する以前に、ある命令を実行すべきか判明する前から実行するようスケジュールされなければならないということが判明した。

コンパイラ 
マルチプロセッシングシステム向けのコンパイラ最適化における投機的実行とは、空いているプロセッサに次の実行ブロック内のコードを実行させるもので、その場合は他のプロセッサで実行中のコードとの間に依存関係がないことが前提である。この方式の利点は、個々のプロセッサとシステム全体の応答時間を削減できる点である。しかし、この賭けの分がない場合はパイプラインのフラッシュが発生するので、平均的ケースでも最終的にペナルティが生じる。投機的に実行された命令列の効果を緩衝するためのハードウェアの補助を必要とするため、コンパイラによる投機的実行には制限がある。ハードウェアによるサポートがない場合、コンパイラは投機が失敗した場合でも副作用のない命令しか投機的に実行するようにしか命令を配置できない。

積極的実行 
積極的実行（）は投機的実行の一種であり、条件分岐の両方の経路を実行し、実際に条件分岐命令を実行して通ることが判明した経路の結果のみを採用する。計算資源に制限がなく、全ての分岐に対して積極的な投機的実行を行うことができれば、理論上完全な分岐予測（必ず当たる「神託」に擬して とも呼ばれる）と同等の性能を発揮する。ただし、必要な資源量は条件分岐の数に対し指数関数的に増大する。

ミクロなレベルでの積極的実行としては、演算装置における桁上げ選択加算器（足し算の桁上げ（繰り上がり）は、高速化の手法はあるものの、最下位桁から伝搬する性質がある。そこで、桁上げありの場合となしの場合の両方を計算し、最後に（あるいは次のクロックで）桁上げの情報に応じてどちらかを選択する）といったものがある。

遅延評価 
遅延評価は投機的ではない。投機的実行と言える先行評価（）をHaskellプログラミング言語の実装に導入することは最近の研究上の話題のひとつである。Eager Haskellはそのような試みとして生まれた言語である。Glasgow Haskell Compiler (GHC) の最近のバージョンでは、選択を間違った場合にやり直すアボート機能をそなえた一種の投機的実行をサポートしており、「楽観的評価」と呼ばれている。

脆弱性 
2018年頃より、汎用的なプロセッサでの投機的実行において、セキュリティ上の脆弱性があることが判明している。例えば、投機的実行においてアクセス禁止されているメモリ空間にアクセスするSpectreなどが知られている。

出典

外部リンク 

 "Speculative computation in Multilisp."
 情報処理学会　学会誌『情報処理』 Vol. 40, No. 2（1999年2月）インタラクティブ・エッセイ
 「投機に投資しよう」・「自己責任の時代」・「甘い話に気をつけよう」・「並列屋こそ投機に投資を」

命令処理
並行性