分岐先予測の概要
分岐先予測(Branch target prediction)は、
CPUにおける重要な機能の一つであり、
分岐命令の分岐先アドレスを事前に予測するための手法です。この技術があるおかげで、命令の取得効率を高めることができ、コンピュータの全体的なパフォーマンスを向上させることが可能になります。
分岐先予測は、
分岐命令が実行される前にその行き先のアドレスを特定しようとすることで、
分岐予測(branch prediction)とは異なります。
分岐予測は、単にその命令が分岐するか否かを予測する作業を指しますが、分岐先予測は、具体的な行き先アドレスを予測する点において一歩進んだ技術です。
現状の課題
近年、命令キャッシュのキャッシュミスによるペナルティが重要な課題として浮上しています。この問題は、近代的な
CPUがより広いフェッチ幅に適応していく中で、
分岐命令の特定と処理が
ボトルネックになることが多くなってきたからです。具体的な処理の流れを見てみましょう。
1.
ブロック単位で命令をフェッチ:
CPUは、命令キャッシュから命令をブロック単位で取得します。
2.
命令の走査: 取得したブロック内の命令を走査し、
分岐命令を特定します。
3.
分岐命令の特定: 予測として分岐すると判断された命令を特定します。
4.
分岐先アドレスの計算: 特定した
分岐命令から、その行き先アドレスを算出します。
5.
命令キャッシュの再フェッチ: 計算したアドレスを持つブロックを再度命令キャッシュにフェッチします。
この過程において、例えば、2サイクルかかると仮定した場合、分岐の予測に失敗するたびに1サイクルを浪費することになります。一般的には、10命令の中で1回程度の分岐が発生すると言われ、これによりフェッチ帯域幅が実質的に低下してしまいます。特に、命令キャッシュのレイテンシが大きいマシンでは、損失がより一層大きくなります。
分岐先予測の実装とメリット
この課題を克服するために、分岐先予測を導入するマシンが存在します。この予測手法では、
分岐命令そのもののアドレスから分岐先アドレスを推定します。その際、予測されたアドレスを保持するための領域をBTB(Branch Target Buffer)と呼びます。さらに進んだ手法として、現在実行中の命令列の最初のアドレスから次に実行する命令列のアドレスを推測する方法も考案されています。
この技術を用いることで、前述の処理を大幅に効率化します:
1.
ハッシュ値の生成: 実行予定の最初の命令のアドレスをハッシュ化します。
2.
分岐先アドレスリストのフェッチ: このハッシュ値に基づいて、対応する分岐先予測アドレスのリストを取得します。
3.
予測の選定: その中から、分岐すると予測されるアドレスを選択します。
予測器が利用するRAMは具体的に命令キャッシュの約5%から10%のサイズであり、そのフェッチプロセスは、命令キャッシュからのフェッチよりも早く行われるため、分岐先の命令キャッシュへのアクセスがスムーズになります。それでもなお効果が不足する場合、分岐先アドレスのリストは並列処理されることもあります。
結論
分岐先予測は、高性能なコンピューティングにおいて非常に重要な役割を果たしています。この技術を適切に活用することで、
CPUの命令処理が効率的に行われ、全体的なシステムパフォーマンスが向上します。