'SimpleScalar'の2ビット分岐予測を8ビット分岐予測に変換するプロジェクトを取得しました。つまり、2ビットの予測子のソースコードを「SimpleScalar」から変更して、8ビットの予測子のように機能させる必要があります。
予測子がどのように機能するかは知っていますが、c言語を使用して分岐予測子を実装する方法がわかりません。8ビットのbrachpredictorの実装をお勧めします。
'SimpleScalar'の2ビット分岐予測を8ビット分岐予測に変換するプロジェクトを取得しました。つまり、2ビットの予測子のソースコードを「SimpleScalar」から変更して、8ビットの予測子のように機能させる必要があります。
予測子がどのように機能するかは知っていますが、c言語を使用して分岐予測子を実装する方法がわかりません。8ビットのbrachpredictorの実装をお勧めします。
2レベルの適応予測の実装でSimpleScalarの「2ビット分岐予測」を間違えなかった場合、とにかく「8ビット分岐予測」の意味を理解できるかどうかはわかりません。分岐予測の概念は非常に有望です。最先端の分岐予測子のほとんどは、パーセプトロン予測子を使用しています。https://github.com/sumitdhoble/Branch-Predictionでソースコードとして入手できるPerceptronsを使用した動的分岐予測に基づくC言語の実装を確認すると便利な場合があります。
このスライドのセットは、2ビットの分岐予測をうまく説明しています。これを8ビット(私が推測する)に拡張することは、何が起こっているかを決定するために、2ビットの場合の4ではなく256状態のステートマシンが許可されることを意味します。論理的な方法で4つの状態のケースを拡張すると、分岐が発生すると予測される128の状態と、分岐が発生しない128の状態が存在します...一種のヒステリシス。
プロセッサエミュレータまたはシミュレータ内でプログラミングしていると思います。あなたは言わなかった。Cコードは、最後に行われた128の決定を追跡するだけでよく、128の推測が間違っていた場合にのみ代替予測に切り替えます。
static int stickiness = 128; // assume 128 states of knowledge that the default branch will occur
static int predicted_branch = 1; // default prediction is (say) branch taken
if (simulated_branch_condition_is_true != predicted_branch) {
if (--stickiness <= 0) {
predicted_branch = simulated_branch_condition_is_true;
stickiness = 128;
}
}
// Now simulate the predicted_branch. If it's wrong, we will later simulate a pipeline, flush etc.
これ以上の情報がなければ、これが私にできる最善のことです。