アセンブリがどのように機能するか、およびREADMEにどのようなプリフェッチがあるかについて書き上げてみました。コードはかなり短く、初心者にやさしい(そう思う)。
プロジェクトはGithubで入手できます:https : //github.com/alin1popa/prefetch-cpu-simulator
prefetch-cpu-simulator
初心者の背景
アセンブリ言語
高レベルのコード(配列、whileループ、関数などを含む)に精通しているかもしれませんが、CPUは別の言語で動作します:アセンブリです。
アセンブリでは、命令ははるかに単純です。CPUが行う方法を知っているのは、メモリから単一の値をロードし、それらに対して数学的演算を実行し、それらを保存することだけです。考えられるすべてのコードは、そのようなアセンブリ命令の(大きな)シーケンスに変換できます(これは、C / C ++などのコンパイル済み言語の場合、コードをコンパイルすると実際に起こります)。
CPUは、実行される命令へのポインタを保持します(「PC」と呼ばれ、「プログラムカウンタ」を表します)。通常、PCは、各命令が実行された後に1ずつインクリメントされます(つまり、命令が実行されると、CPUは次の命令を実行します)-実行された最後の命令が、PCをソースコード内の別の場所。
1オペランドの命令セット
このシミュレータは、1オペランドの命令セットを操作します。つまり、各命令は次の形式です。
<instruction code> <operand>
シミュレーターは「アキュムレーター」と呼ばれる内部レジスターを保持します。あなたが操作を行うたびに、それはあなたが行うとき、例えば、アキュムレータ(の値に基づいておりADD x、xあなたが行うとき、アキュムレータに加算されSAV y、アキュムレータの値がに保存されたyメモリ内の位置、あなたが行うときJPZ p、Aをアキュムレータの値が0の場合、p番目の命令にジャンプします(以下同様)。
CPUパイプラインとプリフェッチ
CPUが命令を実行する必要があるときはいつでも、それを読み取って解釈するために、最初にその命令を直接メモリに持ってくる必要があります。このプロセスには時間がかかりますfetch time。
命令プリフェッチは、前の命令が実行されている間に、実際に必要になる前に命令をフェッチすることにより、パフォーマンスを向上させるために使用される手法です。次の例を比較してください。
A.プリフェッチなし
-
CPUは命令Nを読み取ります。
-
CPUは命令Nを実行します。
-
CPUは命令N + 1を読み取ります。
-
CPUは命令N + 1を実行します。
B.プリフェッチあり
-
CPUは命令Nを読み取ります。
-
CPUは命令Nを実行します。同時に、N + 1命令を先読みします。
-
CPUは命令N + 1を実行します。
ご覧のとおり、例Bは同じことをより少ない時間単位で実現しています。次の命令を先読みすることをプリフェッチといい、時間もかかります。と表記しprefetch timeます。
ただし、場合によっては、現在の命令がジャンプであるため、実行する必要がある次の命令は必ずしも命令N + 1ではなく、ジャンプの場所にある命令です。命令が実行されると、現在の命令がジャンプであることのデコードが行われるため、CPUは事前にそれを知ることができませんでした。これが発生した場合、CPUが無駄なプリフェッチを行ったことを意味します。次に実行する必要がある命令は、N + 1番目の命令ではなく、まだキャッシュにない他のものです。これは「キャッシュミス」と呼ばれ、時間もかかります(通常のプリフェッチよりもはるかに長くなります)cache miss penalty。
すべてを一緒に入れて
プログラムは、CPUをエミュレートするProcessorクラスで構成されています。固定サイズの使用可能なメモリブロックがあり、プリフェッチありまたはなしで実行できます。実行するプログラムをテキストファイルから読み込みます。
これのポイントは、キャッシュミスのペナルティとフェッチ/プリフェッチ時間を考慮して、プリフェッチがプログラムの実行速度を向上させる方法をデモすることです。
プログラムを実行する
命令プリフェッチなし:
python simulator.py –file program_examples/squares.txt –memory 100
命令プリフェッチあり:
python simulator.py –file program_examples/squares.txt –memory 100 –prefetch
特徴
-
シングルアキュムレーター
-
各パラメータが1つの21命令の命令セット
-
カスタムスロット数のメモリゾーン(デフォルトは100)
-
フェッチ/プリフェッチ時間をエミュレートし、ペナルティ時間を逃す命令レジスタ
-
アドレッシングモードの切り替え:即時値(デフォルト)と間接アドレッシングモード