投機的実行とは、コンピュータシステムが必ずしも必要ではないかもしれないタスクを実行する最適化手法です。実際に必要かどうかが判明する前に作業を実行することで、必要だと判明した後に作業を行うことで発生する遅延を回避します。もし作業が結局必要なかったと判明した場合、その作業によって行われた変更のほとんどは元に戻され、結果は無視されます。
目的は、追加のリソースが利用可能な場合に、より多くの並行性を提供することです。このアプローチは、パイプラインプロセッサにおける分岐予測、値の局所性を活用するための値予測、メモリとファイルのプリフェッチ、データベースシステムにおける楽観的並行性制御など、さまざまな分野で採用されています。[ 1 ] [ 2 ] [ 3 ]
投機的マルチスレッド処理は、投機的実行の特殊なケースである。
現代のパイプライン型マイクロプロセッサは、分岐実行の履歴に基づいてプログラムの実行パスを予測するスキームを使用して、条件分岐命令のコストを削減するために投機的実行を使用します。 [ 2 ]パフォーマンスとコンピュータリソースの利用率を向上させるために、命令は分岐の前に、まだ実行する必要があると決定されていない時点でスケジュールすることができます。[ 4 ]
投機的計算は、それ以前の関連する概念であった。[ 5 ]
イーガー実行は、条件分岐の両側が実行される投機的実行の一形態ですが、述語が真の場合にのみ結果がコミットされます。リソースが無制限であれば、イーガー実行(オラクル実行とも呼ばれる)は理論的には完全分岐予測と同じパフォーマンスを提供します。リソースが限られている場合は、イーガー実行は慎重に使用する必要があります。なぜなら、イーガー実行される分岐のレベルが上がるごとに必要なリソースの数が指数関数的に増加するからです。[ 6 ]
予測実行は、何らかの結果を予測し、実際の結果が判明するまで予測されたパスに沿って実行を進める投機的実行の一形態です。予測が正しければ、予測された実行はコミットされますが、予測が間違っていた場合は、実行をアンロールして再実行する必要があります。この一般的な形態には、分岐予測器やメモリ依存性予測などがあります。一般化された形態は、値予測と呼ばれることもあります。[ 7 ]
コンピュータサイエンスおよびプロセッサ設計において、ランアヘッドとは、キャッシュミスサイクル中にコンピュータプロセッサが命令を投機的に事前処理できるようにする技術です。事前処理された命令は、通常発生する前にキャッシュミスにつながる命令(一般的にロングレイテンシーロードと呼ばれる)を実行することで、命令およびデータストリームのプリフェッチを生成するために使用され、メモリレイテンシーを効果的に隠蔽します。ランアヘッドでは、プロセッサはアイドル実行リソースを使用して、キャッシュミスとは無関係な利用可能な情報を使用して命令およびデータストリームのアドレスを計算します。プロセッサが最初のキャッシュミスを解決すると、すべてのランアヘッドの結果は破棄され、プロセッサは通常どおり実行を再開します。この技術の主な使用例は、メモリウォールの影響を軽減することです。この技術は、分岐結果を事前に計算して高精度の分岐予測を実現するなど、他の目的にも使用できます。[ 8 ]
遅延実行は、積極実行の反対であり、投機を伴いません。遅延言語であるHaskell プログラミング言語の実装に投機的実行を組み込むことは、現在の研究テーマです。この言語の変種であるEager Haskell は、投機的実行の考え方に基づいて設計されています。2003 年の博士論文では、GHC が、楽観的実行と呼ばれる悪い選択の場合に中止するアボートメカニズムを備えた一種の投機的実行をサポートするようにしました。[ 9 ]これは複雑すぎると判断されました。[ 10 ]
2017年から、一般的なプロセッサアーキテクチャにおける投機的実行の実装に一連のセキュリティ脆弱性が発見され、事実上、権限昇格が可能になった。
これらには以下が含まれます。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)