... | ... | @@ -2,6 +2,7 @@ |
|
|
============
|
|
|
|
|
|
発展課題は好きなことをしていただいて構いませんが、以下にいくつか例をあげておきます。
|
|
|
以下は主にプロセッサの性能を上げる方向の発展課題ですが、自作プログラムを動かしてみるなどの余興もよいでしょう。
|
|
|
|
|
|
### パイプライン化
|
|
|
|
... | ... | @@ -18,17 +19,15 @@ |
|
|
|
|
|
* 難易度:2
|
|
|
|
|
|
やや複雑な計算を行う命令を追加することでもプロセッサの性能を上げることができます。乗算はその典型例でしょう。
|
|
|
やや複雑な計算を行う命令を追加することでもプロセッサの性能を上げることができます。乗除算はその典型例でしょう。
|
|
|
|
|
|
RISC-V では、最小構成なプロセッサを作れるようにするため、乗除算命令は拡張命令セット(M拡張)に含まれています。この拡張命令に対応していない場合、コンパイラは加算やシフトを駆使して乗算を実現するコードを生成しますが、当然命令数が増大します。
|
|
|
RISC-V では、最小構成なプロセッサを作れるようにするため、乗除算命令は拡張命令セット(M拡張)に含まれています。この拡張命令に対応していない場合、コンパイラは加算やシフトを駆使して乗除算を実現するコードを生成しますが、当然命令数が増大します。
|
|
|
|
|
|
乗除算命令を含むプログラムを作るためには、`b3exp/benchmarks/tools`以下にある`Makefile.inc`の`CFLAGS`の`-march=rv32i`を`-march=rv32im`に書き換える必要があります。
|
|
|
RV32IM向けにコンパイルしたCoreMarkのトレースは[内部用wiki](http://exp.mtl.t.u-tokyo.ac.jp/2021/b3exp-internal/wikis/home)に掲載します。
|
|
|
|
|
|
これを実装するとクリティカルパスが長くなり、今まで動いていた動作周波数で正しく動作しなくなるかもしれません。これに対処するにはどうしたらよいでしょうか?
|
|
|
|
|
|
|
|
|
|
|
|
### 分岐予測器の実装
|
|
|
|
|
|
* 難易度:3
|
... | ... | @@ -60,6 +59,6 @@ CPU の実行すべき命令は、必ずしも直前の命令の結果を使う |
|
|
|
|
|
* 難易度:5+
|
|
|
|
|
|
インオーダーのスーパースカラでは、既に実行可能な命令が後ろの方にあっても、前から順番に実行していかないといけないという制約の都合上、その命令を実行することができません。そのような場合、Exec Unit が遊んでいることになり、もったいないです。アウトオブオーダー実行できれば、そのような命令を先に実行することができ、遊んでいる Exec Unit が有効活用されるため、性能が向上します。
|
|
|
インオーダーのスーパースカラでは、既に実行可能な命令が後ろの方にあっても、前から順番に実行していかないといけないという制約の都合上、その命令を実行することができません。そのような場合、Exec Unit(ALUや乗算器などの演算器およびメモリアクセスに必要な資源)が遊んでいることになり、もったいないです。アウトオブオーダー実行できれば、そのような命令を先に実行することができ、遊んでいる Exec Unit が有効活用されるため、性能が向上します。
|
|
|
|
|
|
Exec Unit 以外はほとんど書き直しになってしまうので、実装量は多くなります。外から見た結果が、命令の順番通り(インオーダーに)実行した時と必ず一致する必要があるため、考えることがたくさんあります。 |